⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ogr_srsnode.cpp

📁 在linux环境下
💻 CPP
📖 第 1 页 / 共 3 页
字号:
 * 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 + -