📄 ogr_srsnode.cpp
字号:
* 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; * * Fetch value string for this node. * * @return A non-NULL string is always returned. The returned pointer is to * the internal value of this node, and should not be modified, or freed. *//************************************************************************//* SetValue() *//************************************************************************//** * Set the node value. * * @param pszNewValue the new value to assign to this node. The passed * string is duplicated and remains the responsibility of the caller. */void OGR_SRSNode::SetValue( const char * pszNewValue ){ CPLFree( pszValue ); pszValue = CPLStrdup( pszNewValue );}/************************************************************************//* Clone() *//************************************************************************//** * Make a duplicate of this node, and it's children. * * @return a new node tree, which becomes the responsiblity of the caller. */OGR_SRSNode *OGR_SRSNode::Clone() const{ OGR_SRSNode *poNew; poNew = new OGR_SRSNode( pszValue ); for( int i = 0; i < nChildren; i++ ) { poNew->AddChild( papoChildNodes[i]->Clone() ); } return poNew;}/************************************************************************//* NeedsQuoting() *//* *//* Does this node need to be quoted when it is exported to Wkt? *//************************************************************************/int OGR_SRSNode::NeedsQuoting() const{ // non-terminals are never quoted. if( GetChildCount() != 0 ) return FALSE; // As per bugzilla bug 201, the OGC spec says the authority code // needs to be quoted even though it appears well behaved. if( poParent != NULL && EQUAL(poParent->GetValue(),"AUTHORITY") ) return TRUE; // As per bugzilla bug 294, the OGC spec says the direction // values for the AXIS keywords should *not* be quoted. if( poParent != NULL && EQUAL(poParent->GetValue(),"AXIS") && this != poParent->GetChild(0) ) return FALSE; // Non-numeric tokens are generally quoted while clean numeric values // are generally not. for( int i = 0; pszValue[i] != '\0'; i++ ) { if( (pszValue[i] < '0' || pszValue[i] > '9') && pszValue[i] != '.' && pszValue[i] != '-' && pszValue[i] != '+' && pszValue[i] != 'e' && pszValue[i] != 'E' ) return TRUE; } return FALSE;}/************************************************************************//* exportToWkt() *//************************************************************************//** * Convert this tree of nodes into WKT format. * * Note that the returned WKT string should be freed with OGRFree() or * CPLFree() when no longer needed. It is the responsibility of the caller. * * @param ppszResult the resulting string is returned in this pointer. * * @return currently OGRERR_NONE is always returned, but the future it * is possible error conditions will develop. */ OGRErr OGR_SRSNode::exportToWkt( char ** ppszResult ) const{ char **papszChildrenWkt = NULL; int nLength = strlen(pszValue)+4; int i;/* -------------------------------------------------------------------- *//* Build a list of the WKT format for the children. *//* -------------------------------------------------------------------- */ papszChildrenWkt = (char **) CPLCalloc(sizeof(char*),(nChildren+1)); for( i = 0; i < nChildren; i++ ) { papoChildNodes[i]->exportToWkt( papszChildrenWkt + i ); nLength += strlen(papszChildrenWkt[i]) + 1; }/* -------------------------------------------------------------------- *//* Allocate the result string. *//* -------------------------------------------------------------------- */ *ppszResult = (char *) CPLMalloc(nLength); *ppszResult[0] = '\0'; /* -------------------------------------------------------------------- *//* Capture this nodes value. We put it in double quotes if *//* this is a leaf node, otherwise we assume it is a well formed *//* node name. *//* -------------------------------------------------------------------- */ if( NeedsQuoting() ) { strcat( *ppszResult, "\"" ); strcat( *ppszResult, pszValue ); /* should we do quoting? */ strcat( *ppszResult, "\"" ); } else strcat( *ppszResult, pszValue );/* -------------------------------------------------------------------- *//* Add the children strings with appropriate brackets and commas. *//* -------------------------------------------------------------------- */ if( nChildren > 0 ) strcat( *ppszResult, "[" ); for( i = 0; i < nChildren; i++ ) { strcat( *ppszResult, papszChildrenWkt[i] ); if( i == nChildren-1 ) strcat( *ppszResult, "]" ); else strcat( *ppszResult, "," ); } CSLDestroy( papszChildrenWkt ); return OGRERR_NONE;}/************************************************************************//* exportToPrettyWkt() *//************************************************************************/OGRErr OGR_SRSNode::exportToPrettyWkt( char ** ppszResult, int nDepth ) const{ char **papszChildrenWkt = NULL; int nLength = strlen(pszValue)+4; int i;/* -------------------------------------------------------------------- *//* Build a list of the WKT format for the children. *//* -------------------------------------------------------------------- */ papszChildrenWkt = (char **) CPLCalloc(sizeof(char*),(nChildren+1)); for( i = 0; i < nChildren; i++ ) { papoChildNodes[i]->exportToPrettyWkt( papszChildrenWkt + i, nDepth + 1); nLength += strlen(papszChildrenWkt[i]) + 2 + nDepth*4; }/* -------------------------------------------------------------------- *//* Allocate the result string. *//* -------------------------------------------------------------------- */ *ppszResult = (char *) CPLMalloc(nLength); *ppszResult[0] = '\0'; /* -------------------------------------------------------------------- *//* Capture this nodes value. We put it in double quotes if *//* this is a leaf node, otherwise we assume it is a well formed *//* node name. *//* -------------------------------------------------------------------- */ if( NeedsQuoting() ) { strcat( *ppszResult, "\"" ); strcat( *ppszResult, pszValue ); /* should we do quoting? */ strcat( *ppszResult, "\"" ); } else strcat( *ppszResult, pszValue );/* -------------------------------------------------------------------- *//* Add the children strings with appropriate brackets and commas. *//* -------------------------------------------------------------------- */ if( nChildren > 0 ) strcat( *ppszResult, "[" ); for( i = 0; i < nChildren; i++ ) { if( papoChildNodes[i]->GetChildCount() > 0 ) { int j; strcat( *ppszResult, "\n" ); for( j = 0; j < 4*nDepth; j++ ) strcat( *ppszResult, " " ); } strcat( *ppszResult, papszChildrenWkt[i] ); if( i < nChildren-1 ) strcat( *ppszResult, "," ); } if( nChildren > 0 ) { if( (*ppszResult)[strlen(*ppszResult)-1] == ',' ) (*ppszResult)[strlen(*ppszResult)-1] = '\0'; strcat( *ppszResult, "]" ); } CSLDestroy( papszChildrenWkt ); return OGRERR_NONE;}/************************************************************************//* importFromWkt() *//************************************************************************//** * Import from WKT string. * * This method will wipe the existing children and value of this node, and * reassign them based on the contents of the passed WKT string. Only as * much of the input string as needed to construct this node, and it's * children is consumed from the input string, and the input string pointer * is then updated to point to the remaining (unused) input. * * @param ppszInput Pointer to pointer to input. The pointer is updated to * point to remaining unused input text. * * @return OGRERR_NONE if import succeeds, or OGRERR_CORRUPT_DATA if it * fails for any reason. */OGRErr OGR_SRSNode::importFromWkt( char ** ppszInput ){ const char *pszInput = *ppszInput; int bInQuotedString = FALSE; /* -------------------------------------------------------------------- *//* Clear any existing children of this node. *//* -------------------------------------------------------------------- */ ClearChildren(); /* -------------------------------------------------------------------- *//* Read the ``value'' for this node. *//* -------------------------------------------------------------------- */ char szToken[512]; int nTokenLen = 0; while( *pszInput != '\0' && nTokenLen < (int) sizeof(szToken)-1 ) { if( *pszInput == '"' ) { bInQuotedString = !bInQuotedString; } else if( !bInQuotedString
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -