?? ogr_srsnode.cpp
字號:
* 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
&& (*pszInput == '[' || *pszInput == ']' || *pszInput == ','
|| *pszInput == '(' || *pszInput == ')' ) )
{
break;
}
else if( !bInQuotedString
&& (*pszInput == ' ' || *pszInput == '\t'
|| *pszInput == 10 || *pszInput == 13) )
{
/* just skip over whitespace */
}
else
{
szToken[nTokenLen++] = *pszInput;
}
pszInput++;
}
if( *pszInput == '\0' || nTokenLen == sizeof(szToken) - 1 )
return OGRERR_CORRUPT_DATA;
szToken[nTokenLen++] = '\0';
SetValue( szToken );
/* -------------------------------------------------------------------- */
/* Read children, if we have a sublist. */
/* -------------------------------------------------------------------- */
if( *pszInput == '[' || *pszInput == '(' )
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -