?? ogr_srsnode.cpp
字號:
/******************************************************************************
* $Id: ogr_srsnode.cpp 10646 2007-01-18 02:38:10Z warmerdam $
*
* 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.
****************************************************************************/
#include "ogr_spatialref.h"
#include "ogr_p.h"
CPL_CVSID("$Id: ogr_srsnode.cpp 10646 2007-01-18 02:38:10Z warmerdam $");
/************************************************************************/
/* 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.
*
* Note that removing a child node will result in children after it
* being renumbered down one.
*
* @param iChild the index of the child.
*/
void OGR_SRSNode::DestroyChild( int iChild )
{
if( iChild < 0 || iChild >= nChildren )
return;
delete papoChildNodes[iChild];
while( iChild < nChildren-1 )
{
papoChildNodes[iChild] = papoChildNodes[iChild+1];
iChild++;
}
nChildren--;
}
/************************************************************************/
/* FindChild() */
/************************************************************************/
/**
* Find the index of the child matching the given string.
*
* Note that the node value must match pszValue with the exception of
* case. The comparison is case insensitive.
*
* @param pszValue the node value being searched for.
*
* @return the child index, or -1 on failure.
*/
int OGR_SRSNode::FindChild( const char * pszValue ) const
{
for( int i = 0; i < nChildren; i++ )
{
if( EQUAL(papoChildNodes[i]->pszValue,pszValue) )
return i;
}
return -1;
}
/************************************************************************/
/* GetValue() */
/************************************************************************/
/**
* \fn const char *OGR_SRSNode::GetValue() const;
*
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -