ogrkmllayer.cpp
来自「支持各种栅格图像和矢量图像读取的库」· C++ 代码 · 共 273 行
CPP
273 行
/****************************************************************************** * $Id: ogrkmllayer.cpp 10646 2007-01-18 02:38:10Z warmerdam $ * * Project: KML Driver * Purpose: Implementation of OGRKMLLayer class. * Author: Christopher Condit, condit@sdsc.edu * ****************************************************************************** * Copyright (c) 2006, Christopher Condit * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/#include "ogr_kml.h"#include "ogr_api.h"#include "cpl_conv.h"#include "cpl_port.h"#include "cpl_string.h"// Function utility to dump OGRGeoemtry to KML textchar *OGR_G_ExportToKML( OGRGeometryH hGeometry );/************************************************************************//* OGRKMLLayer() *//************************************************************************/OGRKMLLayer::OGRKMLLayer( const char * pszName, OGRSpatialReference *poSRSIn, int bWriterIn, OGRwkbGeometryType eReqType, OGRKMLDataSource *poDSIn ){ if( poSRSIn == NULL ) poSRS = NULL; else poSRS = poSRSIn->Clone(); iNextKMLId = 0; nTotalKMLCount = -1; poDS = poDSIn; poFeatureDefn = new OGRFeatureDefn( pszName ); poFeatureDefn->Reference(); poFeatureDefn->SetGeomType( eReqType ); bWriter = bWriterIn; poFClass = NULL; }/************************************************************************//* ~OGRKMLLayer() *//************************************************************************/OGRKMLLayer::~OGRKMLLayer(){ if( poFeatureDefn ) poFeatureDefn->Release(); if( poSRS != NULL ) poSRS->Release();}/************************************************************************//* ResetReading() *//************************************************************************/void OGRKMLLayer::ResetReading(){ iNextKMLId = 0; }/************************************************************************//* GetNextFeature() *//************************************************************************/OGRFeature *OGRKMLLayer::GetNextFeature(){ CPLError( CE_Failure, CPLE_AppDefined, "OGRKMLLayer::GetExtent: KML driver is write-only!\n"); return NULL;}/************************************************************************//* GetFeatureCount() *//************************************************************************/int OGRKMLLayer::GetFeatureCount( int bForce ){ if( poFClass == NULL ) return 0; if( m_poFilterGeom != NULL || m_poAttrQuery != NULL ) return OGRLayer::GetFeatureCount( bForce ); else return poFClass->GetFeatureCount();}/************************************************************************//* GetExtent() *//************************************************************************/OGRErr OGRKMLLayer::GetExtent(OGREnvelope *psExtent, int bForce ){ CPLAssert( NULL != psExtent ); CPLError( CE_Failure, CPLE_AppDefined, "OGRKMLLayer::GetExtent: KML driver is write-only!\n"); return OGRERR_NONE; }/************************************************************************//* CreateFeature() *//************************************************************************/OGRErr OGRKMLLayer::CreateFeature( OGRFeature *poFeature ){ FILE *fp = poDS->GetOutputFP(); if( !bWriter ) return OGRERR_FAILURE; VSIFPrintf( fp, " <Placemark>\n" ); if( poFeature->GetFID() == OGRNullFID ) poFeature->SetFID( iNextKMLId++ ); // First find and write the name element if (NULL != poDS->GetNameField()) { for( int iField = 0; iField < poFeatureDefn->GetFieldCount(); iField++ ) { OGRFieldDefn *poField = poFeatureDefn->GetFieldDefn( iField ); if ( poFeature->IsFieldSet( iField ) && !strcmp(poField->GetNameRef(), poDS->GetNameField())) { const char *pszRaw = poFeature->GetFieldAsString( iField ); while( *pszRaw == ' ' ) pszRaw++; char *pszEscaped = CPLEscapeString( pszRaw, -1, CPLES_XML ); VSIFPrintf( fp, " <name>%s</name>\n", pszEscaped); CPLFree( pszEscaped ); } } } VSIFPrintf( fp, " <description><![CDATA[\n" ); // Write all "set" fields that aren't being used for the name element for( int iField = 0; iField < poFeatureDefn->GetFieldCount(); iField++ ) { OGRFieldDefn *poField = poFeatureDefn->GetFieldDefn( iField ); if( poFeature->IsFieldSet( iField ) && (NULL == poDS->GetNameField() || strcmp(poField->GetNameRef(), poDS->GetNameField())) ) { const char *pszRaw = poFeature->GetFieldAsString( iField ); while( *pszRaw == ' ' ) pszRaw++; char *pszEscaped = CPLEscapeString( pszRaw, -1, CPLES_XML ); VSIFPrintf( fp, " <b>%s:</b> <i>%s</i><br />\n", poField->GetNameRef(), pszEscaped); CPLFree( pszEscaped ); } } VSIFPrintf( fp, " ]]></description>" ); // Write out Geometry - for now it isn't indented properly. if( poFeature->GetGeometryRef() != NULL ) { char *pszGeometry; OGREnvelope sGeomBounds; // TODO - porting // pszGeometry = poFeature->GetGeometryRef()->exportToKML(); pszGeometry = OGR_G_ExportToKML( static_cast<OGRGeometryH>( poFeature->GetGeometryRef() ) ); VSIFPrintf( fp, " %s\n", pszGeometry ); CPLFree( pszGeometry ); poFeature->GetGeometryRef()->getEnvelope( &sGeomBounds ); poDS->GrowExtents( &sGeomBounds ); } if ( (wkbPolygon == poFeatureDefn->GetGeomType() ) || (wkbMultiPolygon == poFeatureDefn->GetGeomType() ) || (wkbLineString == poFeatureDefn->GetGeomType() ) || (wkbMultiLineString == poFeatureDefn->GetGeomType() ) ) { //If we're dealing with a polygon, add a line style that will stand out a bit VSIFPrintf( fp, " <Style><LineStyle><color>ff0000ff</color></LineStyle>"); VSIFPrintf( fp, " <PolyStyle><fill>0</fill></PolyStyle></Style>\n" ); } VSIFPrintf( fp, " </Placemark>\n" ); return OGRERR_NONE;}/************************************************************************//* TestCapability() *//************************************************************************/int OGRKMLLayer::TestCapability( const char * pszCap ){ if( EQUAL(pszCap,OLCSequentialWrite) ) return bWriter; else if( EQUAL(pszCap,OLCCreateField) ) return bWriter && iNextKMLId == 0; else if( EQUAL(pszCap,OLCFastGetExtent) ) { double dfXMin, dfXMax, dfYMin, dfYMax; if( poFClass == NULL ) return FALSE; return poFClass->GetExtents( &dfXMin, &dfXMax, &dfYMin, &dfYMax ); } else if( EQUAL(pszCap,OLCFastFeatureCount) ) { if( poFClass == NULL || m_poFilterGeom != NULL || m_poAttrQuery != NULL ) return FALSE; return poFClass->GetFeatureCount() != -1; } else return FALSE;}/************************************************************************//* CreateField() *//************************************************************************/OGRErr OGRKMLLayer::CreateField( OGRFieldDefn *poField, int bApproxOK ){ if( !bWriter || iNextKMLId != 0 ) return OGRERR_FAILURE; OGRFieldDefn oCleanCopy( poField ); poFeatureDefn->AddFieldDefn( &oCleanCopy ); return OGRERR_NONE;}/************************************************************************//* GetSpatialRef() *//************************************************************************/OGRSpatialReference *OGRKMLLayer::GetSpatialRef(){ return poSRS;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?