📄 ogr_srs_xml.cpp
字号:
}
/* -------------------------------------------------------------------- */
/* 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 );
if( pszValue != NULL )
return atof(pszValue);
else
return dfDefault;
}
}
return dfDefault;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -