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

📄 ogr_srs_xml.cpp

📁 用于读取TAB、MIF、SHP文件的类
💻 CPP
📖 第 1 页 / 共 4 页
字号:
/* -------------------------------------------------------------------- *//*      Transverse Mercator                                             *//* -------------------------------------------------------------------- */    if( EQUAL(pszProjection,SRS_PT_TRANSVERSE_MERCATOR) )    {        AddValueIDWithURN( psConv, "gml:usesMethod", "EPSG", "method",                            9807 );        addProjArg( poSRS, psConv, "Angular", 0.0,                    8801, SRS_PP_LATITUDE_OF_ORIGIN );        addProjArg( poSRS, psConv, "Angular", 0.0,                    8802, SRS_PP_CENTRAL_MERIDIAN );        addProjArg( poSRS, psConv, "Unitless", 1.0,                    8805, SRS_PP_SCALE_FACTOR );        addProjArg( poSRS, psConv, "Linear", 0.0,                    8806, SRS_PP_FALSE_EASTING );        addProjArg( poSRS, psConv, "Linear", 0.0,                    8807, SRS_PP_FALSE_NORTHING );    }/* -------------------------------------------------------------------- *//*      Lambert Conformal Conic                                         *//* -------------------------------------------------------------------- */    else if( EQUAL(pszProjection, SRS_PT_LAMBERT_CONFORMAL_CONIC_1SP) )    {        AddValueIDWithURN( psConv, "gml:usesMethod", "EPSG", "method",                            9801 );        addProjArg( poSRS, psConv, "Angular", 0.0,                    8801, SRS_PP_LATITUDE_OF_ORIGIN );        addProjArg( poSRS, psConv, "Angular", 0.0,                    8802, SRS_PP_CENTRAL_MERIDIAN );        addProjArg( poSRS, psConv, "Unitless", 1.0,                    8805, SRS_PP_SCALE_FACTOR );        addProjArg( poSRS, psConv, "Linear", 0.0,                    8806, SRS_PP_FALSE_EASTING );        addProjArg( poSRS, psConv, "Linear", 0.0,                    8807, SRS_PP_FALSE_NORTHING );    }/* -------------------------------------------------------------------- *//*      Define the cartesian coordinate system.                         *//* -------------------------------------------------------------------- */    CPLXMLNode  *psCCS;    psCCS =         CPLCreateXMLNode(             CPLCreateXMLNode( psCRS_XML, CXT_Element, "gml:usesCartesianCS" ),            CXT_Element, "gml:CartesianCS" );    addGMLId( psCCS );    CPLCreateXMLElementAndValue( psCCS, "gml:csName", "Cartesian" );    addAuthorityIDBlock( psCCS, "gml:csID", "EPSG", "cs", 4400 );    addAxis( psCCS, "E", NULL );    addAxis( psCCS, "N", NULL );    return psCRS_XML;}/************************************************************************//*                            exportToXML()                             *//************************************************************************/OGRErr OGRSpatialReference::exportToXML( char **ppszRawXML,                                          const char * /*pszDialect*/ ) const{    CPLXMLNode *psXMLTree = NULL;    if( IsGeographic() )    {        psXMLTree = exportGeogCSToXML( this );    }    else if( IsProjected() )    {        psXMLTree = exportProjCSToXML( this );    }    else        return OGRERR_UNSUPPORTED_SRS;    *ppszRawXML = CPLSerializeXMLTree( psXMLTree );    return OGRERR_NONE;}/************************************************************************//*                           OSRExportToXML()                           *//************************************************************************/OGRErr OSRExportToXML( OGRSpatialReferenceH hSRS, char **ppszRawXML,                        const char *pszDialect ){    return ((OGRSpatialReference *) hSRS)->exportToXML( ppszRawXML,                                                         pszDialect );}#ifdef notdef/************************************************************************//*                           importXMLUnits()                           *//************************************************************************/static void importXMLUnits( CPLXMLNode *psSrcXML, const char *pszClass,                            OGRSpatialReference *poSRS, const char *pszTarget){    const char *pszUnitName, *pszUnitsPer;    OGR_SRSNode *poNode = poSRS->GetAttrNode( pszTarget );    OGR_SRSNode *poUnits;    CPLAssert( EQUAL(pszClass,"AngularUnit")                || EQUAL(pszClass,"LinearUnit") );            psSrcXML = CPLGetXMLNode( psSrcXML, pszClass );    if( psSrcXML == NULL )        goto DefaultTarget;    pszUnitName = CPLGetXMLValue( psSrcXML, "NameSet.name", "unnamed" );    if( EQUAL(pszClass,"AngularUnit") )        pszUnitsPer = CPLGetXMLValue( psSrcXML, "radiansPerUnit", NULL );    else        pszUnitsPer = CPLGetXMLValue( psSrcXML, "metresPerUnit", NULL );        if( pszUnitsPer == NULL )    {        CPLDebug( "OGR_SRS_XML",                   "Missing PerUnit value for %s.",                   pszClass );        goto DefaultTarget;    }        if( poNode == NULL )    {        CPLDebug( "OGR_SRS_XML", "Can't find %s in importXMLUnits.",                   pszTarget );        goto DefaultTarget;    }    if( poNode->FindChild("UNIT") != -1 )    {        poUnits = poNode->GetChild( poNode->FindChild( "UNIT" ) );        poUnits->GetChild(0)->SetValue( pszUnitName );        poUnits->GetChild(1)->SetValue( pszUnitsPer );    }    else    {        poUnits = new OGR_SRSNode( "UNIT" );        poUnits->AddChild( new OGR_SRSNode( pszUnitName ) );        poUnits->AddChild( new OGR_SRSNode( pszUnitsPer ) );                poNode->AddChild( poUnits );    }    return;  DefaultTarget:    poUnits = new OGR_SRSNode( "UNIT" );    if( EQUAL(pszClass,"AngularUnit") )    {        poUnits->AddChild( new OGR_SRSNode( SRS_UA_DEGREE ) );        poUnits->AddChild( new OGR_SRSNode( SRS_UA_DEGREE_CONV ) );    }    else    {        poUnits->AddChild( new OGR_SRSNode( SRS_UL_METER ) );        poUnits->AddChild( new OGR_SRSNode( "1.0" ) );    }    poNode->AddChild( poUnits );}#endif/************************************************************************//*                         importXMLAuthority()                         *//************************************************************************/static void importXMLAuthority( CPLXMLNode *psSrcXML,                                 OGRSpatialReference *poSRS,                                 const char *pszSourceKey,                                const char *pszTargetKey ){    CPLXMLNode *psIDNode = CPLGetXMLNode( psSrcXML, pszSourceKey );    CPLXMLNode *psNameNode = CPLGetXMLNode( psIDNode, "name" );    CPLXMLNode *psCodeSpace = CPLGetXMLNode( psNameNode, "codeSpace" );    char *pszAuthority, *pszCode, *pszURN;    int nCode = 0;    if( psIDNode == NULL || psNameNode == NULL || psCodeSpace == NULL )        return;    pszURN = CPLStrdup(CPLGetXMLValue( psCodeSpace, "", "" ));    if( !parseURN( pszURN, NULL, &pszAuthority, &pszCode ) )    {        CPLFree( pszURN );        return;    }    if( strlen(pszCode) == 0 )        pszCode = (char *) CPLGetXMLValue( psNameNode, "", "" );    if( pszCode != NULL )        nCode = atoi(pszCode);    if( nCode != 0 )        poSRS->SetAuthority( pszTargetKey, pszAuthority, nCode );    CPLFree( pszURN );}/************************************************************************//*                           ParseOGCDefURN()                           *//*                                                                      *//*      Parse out fields from a URN of the form:                        *//*        urn:ogc:def:parameter:EPSG:6.3:9707                           *//************************************************************************/static int ParseOGCDefURN( const char *pszURN,                            CPLString *poObjectType,                           CPLString *poAuthority,                           CPLString *poVersion,                            CPLString *poValue ){    if( poObjectType != NULL )        *poObjectType = "";    if( poAuthority != NULL )        *poAuthority = "";    if( poVersion != NULL )        *poVersion = "";    if( poValue != NULL )        *poValue = "";    if( pszURN == NULL || !EQUALN(pszURN,"urn:ogc:def:",12) )        return FALSE;    char **papszTokens = CSLTokenizeStringComplex( pszURN + 12, ":",                                                    FALSE, TRUE );    if( CSLCount(papszTokens) != 4 )    {        CSLDestroy( papszTokens );        return FALSE;    }    if( poObjectType != NULL )        *poObjectType = papszTokens[0];    if( poAuthority != NULL )        *poAuthority = papszTokens[1];    if( poVersion != NULL )        *poVersion = papszTokens[2];    if( poValue != NULL )        *poValue = papszTokens[3];    CSLDestroy( papszTokens );    return TRUE;}/************************************************************************//*                       getEPSGObjectCodeValue()                       *//*                                                                      *//*      Fetch a code value from the indicated node.  Should work on     *//*      something of the form <elem xlink:href="urn:...:n" /> or        *//*      something of the form <elem xlink:href="urn:...:">n</a>.        *//************************************************************************/static int getEPSGObjectCodeValue( CPLXMLNode *psNode,                                    const char *pszEPSGObjectType, /*"method" */                                   int nDefault ){    if( psNode == NULL )        return nDefault;        CPLString osObjectType, osAuthority, osValue;        if( !ParseOGCDefURN( CPLGetXMLValue( psNode, "href", NULL ),                         &osObjectType, &osAuthority, NULL, &osValue ) )        return nDefault;    if( !EQUAL(osAuthority,"EPSG")         || !EQUAL(osObjectType, pszEPSGObjectType) )        return nDefault;    if( strlen(osValue) > 0 )        return atoi(osValue);    const char *pszValue = CPLGetXMLValue( psNode, "", NULL);    if( pszValue != NULL )        return atoi(pszValue);    else        return nDefault;}/************************************************************************//*                         getProjectionParm()                          *//************************************************************************/static double getProjectionParm( CPLXMLNode *psRootNode,                                  int nParameterCode,                                  const char * /*pszMeasureType */,                                  double dfDefault ){    CPLXMLNode *psUsesParameter;    for( psUsesParameter = psRootNode->psChild;          psUsesParameter != NULL;         psUsesParameter = psUsesParameter->psNext )    {        if( psUsesParameter->eType != CXT_Element )            continue;        if( !EQUAL(psUsesParameter->pszValue,"usesParameterValue")             && !EQUAL(psUsesParameter->pszValue,"usesValue") )            continue;        if( getEPSGObjectCodeValue( CPLGetXMLNode(psUsesParameter,                                                  "valueOfParameter"),                                    "parameter", 0 ) == nParameterCode )        {            const char *pszValue = CPLGetXMLValue( psUsesParameter, "value",                                                    NULL );

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -