kmlfeatureclass.cpp
来自「支持各种栅格图像和矢量图像读取的库」· C++ 代码 · 共 284 行
CPP
284 行
/****************************************************************************** * $Id: kmlfeatureclass.cpp 10646 2007-01-18 02:38:10Z warmerdam $ * * Project: KML Driver * Purpose: Implementation of KMLFeatureClass 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 "kmlreader.h"#include "cpl_conv.h"/************************************************************************//* KMLFeatureClass() *//************************************************************************/KMLFeatureClass::KMLFeatureClass( const char *pszName ){ m_pszName = CPLStrdup( pszName ); m_pszElementName = NULL; m_pszGeometryElement = NULL; m_nPropertyCount = 0; m_bSchemaLocked = FALSE; m_pszExtraInfo = NULL; m_bHaveExtents = FALSE; m_nFeatureCount = -1; // unknown}/************************************************************************//* ~KMLFeatureClass() *//************************************************************************/KMLFeatureClass::~KMLFeatureClass(){ CPLFree( m_pszName ); CPLFree( m_pszElementName ); CPLFree( m_pszGeometryElement );}/************************************************************************//* SetElementName() *//************************************************************************/void KMLFeatureClass::SetElementName( const char *pszElementName ){ CPLFree( m_pszElementName ); m_pszElementName = CPLStrdup( pszElementName );}/************************************************************************//* GetElementName() *//************************************************************************/const char *KMLFeatureClass::GetElementName() const{ if( m_pszElementName == NULL ) return m_pszName; else return m_pszElementName;}/************************************************************************//* SetGeometryElement() *//************************************************************************/void KMLFeatureClass::SetGeometryElement( const char *pszElement ){ CPLFree( m_pszGeometryElement ); m_pszGeometryElement = CPLStrdup( pszElement );}/************************************************************************//* GetFeatureCount() *//************************************************************************/int KMLFeatureClass::GetFeatureCount() const{ return m_nFeatureCount;}/************************************************************************//* SetFeatureCount() *//************************************************************************/void KMLFeatureClass::SetFeatureCount( int nNewCount ){ m_nFeatureCount = nNewCount;}/************************************************************************//* GetExtraInfo() *//************************************************************************/const char *KMLFeatureClass::GetExtraInfo() const{ return m_pszExtraInfo;}/************************************************************************//* SetExtraInfo() *//************************************************************************/void KMLFeatureClass::SetExtraInfo( const char *pszExtraInfo ){ CPLFree( m_pszExtraInfo ); m_pszExtraInfo = NULL; if( pszExtraInfo != NULL ) m_pszExtraInfo = CPLStrdup( pszExtraInfo );}/************************************************************************//* SetExtents() *//************************************************************************/void KMLFeatureClass::SetExtents( double dfXMin, double dfXMax, double dfYMin, double dfYMax ){ m_dfXMin = dfXMin; m_dfXMax = dfXMax; m_dfYMin = dfYMin; m_dfYMax = dfYMax; m_bHaveExtents = TRUE;}/************************************************************************//* GetExtents() *//************************************************************************/int KMLFeatureClass::GetExtents( double *pdfXMin, double *pdfXMax, double *pdfYMin, double *pdfYMax ){ if( m_bHaveExtents ) { *pdfXMin = m_dfXMin; *pdfXMax = m_dfXMax; *pdfYMin = m_dfYMin; *pdfYMax = m_dfYMax; } return m_bHaveExtents;}/************************************************************************//* InitializeFromXML() *//************************************************************************/int KMLFeatureClass::InitializeFromXML( CPLXMLNode *psRoot ){ /* -------------------------------------------------------------------- */ /* Do some rudimentary checking that this is a well formed */ /* node. */ /* -------------------------------------------------------------------- */ if( psRoot == NULL || psRoot->eType != CXT_Element || !EQUAL(psRoot->pszValue,"Placemark") ) { CPLError( CE_Failure, CPLE_AppDefined, "KMLFeatureClass::InitializeFromXML() called on %s node!", psRoot->pszValue ); return FALSE; } if( CPLGetXMLValue( psRoot, "Name", NULL ) == NULL ) { CPLError( CE_Failure, CPLE_AppDefined, "KMLFeatureClass has no <Name> element." ); return FALSE; }/* -------------------------------------------------------------------- *//* Collect base info. *//* -------------------------------------------------------------------- */ CPLFree( m_pszName ); m_pszName = CPLStrdup( CPLGetXMLValue( psRoot, "Name", NULL ) ); SetElementName( CPLGetXMLValue( psRoot, "ElementPath", m_pszName ) ); const char *pszGPath = CPLGetXMLValue( psRoot, "GeometryElementPath", "" ); if( strlen( pszGPath ) > 0 ) SetGeometryElement( pszGPath );/* -------------------------------------------------------------------- *//* Collect dataset specific info. *//* -------------------------------------------------------------------- */ CPLXMLNode *psDSI = CPLGetXMLNode( psRoot, "DatasetSpecificInfo" ); if( psDSI != NULL ) { const char *pszValue; pszValue = CPLGetXMLValue( psDSI, "FeatureCount", NULL ); if( pszValue != NULL ) SetFeatureCount( atoi(pszValue) ); // Eventually we should support XML subtrees. pszValue = CPLGetXMLValue( psDSI, "ExtraInfo", NULL ); if( pszValue != NULL ) SetExtraInfo( pszValue ); if( CPLGetXMLValue( psDSI, "ExtentXMin", NULL ) != NULL && CPLGetXMLValue( psDSI, "ExtentXMax", NULL ) != NULL && CPLGetXMLValue( psDSI, "ExtentYMin", NULL ) != NULL && CPLGetXMLValue( psDSI, "ExtentYMax", NULL ) != NULL ) { SetExtents( atof(CPLGetXMLValue( psDSI, "ExtentXMin", "0.0" )), atof(CPLGetXMLValue( psDSI, "ExtentXMax", "0.0" )), atof(CPLGetXMLValue( psDSI, "ExtentYMin", "0.0" )), atof(CPLGetXMLValue( psDSI, "ExtentYMax", "0.0" )) ); } } return TRUE;}/************************************************************************//* SerializeToXML() *//************************************************************************/CPLXMLNode *KMLFeatureClass::SerializeToXML(){ CPLXMLNode *psRoot;/* -------------------------------------------------------------------- *//* Set feature class and core information. *//* -------------------------------------------------------------------- */ psRoot = CPLCreateXMLNode( NULL, CXT_Element, "KMLFeatureClass" ); CPLCreateXMLElementAndValue( psRoot, "Name", GetName() ); CPLCreateXMLElementAndValue( psRoot, "ElementPath", GetElementName() ); if( GetGeometryElement() != NULL && strlen(GetGeometryElement()) > 0 ) CPLCreateXMLElementAndValue( psRoot, "GeometryElementPath", GetGeometryElement() );/* -------------------------------------------------------------------- *//* Write out dataset specific information. *//* -------------------------------------------------------------------- */ CPLXMLNode *psDSI; if( m_bHaveExtents || m_nFeatureCount != -1 || m_pszExtraInfo != NULL ) { psDSI = CPLCreateXMLNode( psRoot, CXT_Element, "DatasetSpecificInfo" ); if( m_nFeatureCount != -1 ) { char szValue[128]; sprintf( szValue, "%d", m_nFeatureCount ); CPLCreateXMLElementAndValue( psDSI, "FeatureCount", szValue ); } if( m_bHaveExtents ) { char szValue[128]; sprintf( szValue, "%.5f", m_dfXMin ); CPLCreateXMLElementAndValue( psDSI, "ExtentXMin", szValue ); sprintf( szValue, "%.5f", m_dfXMax ); CPLCreateXMLElementAndValue( psDSI, "ExtentXMax", szValue ); sprintf( szValue, "%.5f", m_dfYMin ); CPLCreateXMLElementAndValue( psDSI, "ExtentYMin", szValue ); sprintf( szValue, "%.5f", m_dfYMax ); CPLCreateXMLElementAndValue( psDSI, "ExtentYMax", szValue ); } if( m_pszExtraInfo ) CPLCreateXMLElementAndValue( psDSI, "ExtraInfo", m_pszExtraInfo ); } return psRoot;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?