📄 ogr_srsnode.cpp
字号:
/****************************************************************************** * $Id: ogr_srsnode.cpp,v 1.26 2003/05/28 19:16:42 warmerda Exp $ * * Project: OpenGIS Simple Features Reference Implementation * Purpose: The OGR_SRSNode class. * Author: Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 1999, Les Technologies SoftMap Inc. * * 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. ****************************************************************************** * * $Log: ogr_srsnode.cpp,v $ * Revision 1.26 2003/05/28 19:16:42 warmerda * fixed up argument names and stuff for docs * * Revision 1.25 2003/03/12 14:25:31 warmerda * Fixed bug 294 re: quoting of axis directions * * Revision 1.24 2003/01/08 18:14:28 warmerda * added FixupOrdering() * * Revision 1.23 2002/12/10 04:06:57 warmerda * Added support for a parent pointer in OGR_SRSNode. * Ensure that authority codes are quoted (bugzilla 201) * * Revision 1.22 2002/07/25 13:13:36 warmerda * fixed const correctness of some docs * * Revision 1.21 2002/04/18 14:22:45 warmerda * made OGRSpatialReference and co 'const correct' * * Revision 1.20 2002/03/05 14:25:14 warmerda * expand tabs * * Revision 1.19 2002/02/21 20:09:04 warmerda * Drop white space outside of quotes when ingesting WKT. This makes the * ingest of 'pretty' WKT possible. * * Revision 1.18 2002/01/24 16:21:29 warmerda * added StripNodes method, removed simplify flag from pretty wkt * * Revision 1.17 2002/01/18 15:30:04 warmerda * fixed serious bug in DeleteChild() * * Revision 1.16 2001/12/01 17:01:50 warmerda * don't omit empty child nodes when exporting pretty wkt * * Revision 1.15 2001/10/11 19:29:57 warmerda * fixed redeclaration of i * * Revision 1.14 2001/10/11 19:26:16 warmerda * added applyRemapping * * Revision 1.13 2001/07/18 05:03:05 warmerda * added CPL_CVSID * * Revision 1.12 2001/01/19 21:10:46 warmerda * replaced tabs * * Revision 1.11 2000/07/09 20:48:02 warmerda * added exportToPrettyWkt * * Revision 1.10 2000/03/31 14:40:49 warmerda * Fixed multiple declaration of i in GetNode(). * * Revision 1.9 2000/03/16 19:03:20 warmerda * added DestroyChild(), FindChild() * * Revision 1.8 2000/02/25 13:23:25 warmerda * removed include of ogr_geometry.h * * Revision 1.7 2000/01/26 21:22:18 warmerda * added tentative MakeValueSafe implementation * * Revision 1.6 2000/01/12 04:12:55 warmerda * Fixed bug in InsertChild(). * * Revision 1.5 2000/01/11 22:12:13 warmerda * added InsertChild * * Revision 1.4 1999/11/18 19:02:19 warmerda * expanded tabs * * Revision 1.3 1999/07/29 18:09:20 warmerda * Avoid use of isdigit() * * Revision 1.2 1999/07/29 18:00:44 warmerda * modified quoting rules for WKT to more closely match standard examples * * Revision 1.1 1999/06/25 20:20:53 warmerda * New * */#include "ogr_spatialref.h"#include "ogr_p.h"CPL_CVSID("$Id: ogr_srsnode.cpp,v 1.26 2003/05/28 19:16:42 warmerda Exp $");/************************************************************************//* OGR_SRSNode() *//************************************************************************//** * Constructor. * * @param pszValueIn this optional parameter can be used to initialize * the value of the node upon creation. If omitted the node will be created * with a value of "". Newly created OGR_SRSNodes have no children. */OGR_SRSNode::OGR_SRSNode( const char * pszValueIn ){ pszValue = CPLStrdup( pszValueIn ); nChildren = 0; papoChildNodes = NULL; poParent = NULL;}/************************************************************************//* ~OGR_SRSNode() *//************************************************************************/OGR_SRSNode::~OGR_SRSNode(){ CPLFree( pszValue ); ClearChildren();}/************************************************************************//* ClearChildren() *//************************************************************************/void OGR_SRSNode::ClearChildren(){ for( int i = 0; i < nChildren; i++ ) { delete papoChildNodes[i]; } CPLFree( papoChildNodes ); papoChildNodes = NULL; nChildren = 0;}/************************************************************************//* GetChildCount() *//************************************************************************//** * \fn int OGR_SRSNode::GetChildCount() const; * * Get number of children nodes. * * @return 0 for leaf nodes, or the number of children nodes. *//************************************************************************//* GetChild() *//************************************************************************//** * Fetch requested child. * * @param iChild the index of the child to fetch, from 0 to * GetChildCount() - 1. * * @return a pointer to the child OGR_SRSNode, or NULL if there is no such * child. */OGR_SRSNode *OGR_SRSNode::GetChild( int iChild ){ if( iChild < 0 || iChild >= nChildren ) return NULL; else return papoChildNodes[iChild];}const OGR_SRSNode *OGR_SRSNode::GetChild( int iChild ) const{ if( iChild < 0 || iChild >= nChildren ) return NULL; else return papoChildNodes[iChild];}/************************************************************************//* GetNode() *//************************************************************************//** * Find named node in tree. * * This method does a pre-order traversal of the node tree searching for * a node with this exact value (case insensitive), and returns it. Leaf * nodes are not considered, under the assumption that they are just * attribute value nodes. * * If a node appears more than once in the tree (such as UNIT for instance), * the first encountered will be returned. Use GetNode() on a subtree to be * more specific. * * @param pszName the name of the node to search for. * * @return a pointer to the node found, or NULL if none. */OGR_SRSNode *OGR_SRSNode::GetNode( const char * pszName ){ int i; if( this == NULL ) return NULL; if( nChildren > 0 && EQUAL(pszName,pszValue) ) return this;/* -------------------------------------------------------------------- *//* First we check the immediate children so we will get an *//* immediate child in preference to a subchild. *//* -------------------------------------------------------------------- */ for( i = 0; i < nChildren; i++ ) { if( EQUAL(papoChildNodes[i]->pszValue,pszName) && papoChildNodes[i]->nChildren > 0 ) return papoChildNodes[i]; }/* -------------------------------------------------------------------- *//* Then get each child to check their children. *//* -------------------------------------------------------------------- */ for( i = 0; i < nChildren; i++ ) { OGR_SRSNode *poNode; poNode = papoChildNodes[i]->GetNode( pszName ); if( poNode != NULL ) return poNode; } return NULL;}const OGR_SRSNode *OGR_SRSNode::GetNode( const char * pszName ) const{ return ((OGR_SRSNode *) this)->GetNode( pszName );}/************************************************************************//* AddChild() *//************************************************************************//** * Add passed node as a child of target node. * * Note that ownership of the passed node is assumed by the node on which * the method is invoked ... use the Clone() method if the original is to * be preserved. New children are always added at the end of the list. * * @param poNew the node to add as a child. */void OGR_SRSNode::AddChild( OGR_SRSNode * poNew ){ InsertChild( poNew, nChildren );}/************************************************************************//* InsertChild() *//************************************************************************//** * Insert the passed node as a child of target node, at the indicated * position. * * Note that ownership of the passed node is assumed by the node on which * the method is invoked ... use the Clone() method if the original is to * be preserved. All existing children at location iChild and beyond are * push down one space to make space for the new child. * * @param poNew the node to add as a child. * @param iChild position to insert, use 0 to insert at the beginning. */void OGR_SRSNode::InsertChild( OGR_SRSNode * poNew, int iChild ){ if( iChild > nChildren ) iChild = nChildren; nChildren++; papoChildNodes = (OGR_SRSNode **) CPLRealloc( papoChildNodes, sizeof(void*) * nChildren ); memmove( papoChildNodes + iChild + 1, papoChildNodes + iChild, sizeof(void*) * (nChildren - iChild - 1) ); papoChildNodes[iChild] = poNew; poNew->poParent = this;}/************************************************************************//* DestroyChild() *//************************************************************************//** * Remove a child node, and it's subtree. *
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -