📄 ogr_srs_xml.cpp
字号:
/* -------------------------------------------------------------------- *//* 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 + -