?? ogr_srs_xml.cpp
字號:
/******************************************************************************
* $Id: ogr_srs_xml.cpp 10646 2007-01-18 02:38:10Z warmerdam $
*
* Project: OpenGIS Simple Features Reference Implementation
* Purpose: OGRSpatialReference interface to OGC XML (014r4).
* Author: Frank Warmerdam, warmerdam@pobox.com
*
******************************************************************************
* Copyright (c) 2001, Frank Warmerdam (warmerdam@pobox.com)
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
****************************************************************************/
#include "ogr_spatialref.h"
#include "ogr_p.h"
#include "cpl_minixml.h"
/************************************************************************/
/* parseURN() */
/* */
/* Parses requested sections out of URN. The passed in URN */
/* *is* altered but the returned values point into the */
/* original string. */
/************************************************************************/
static int parseURN( char *pszURN,
char **ppszObjectType,
char **ppszAuthority,
char **ppszCode,
char **ppszVersion = NULL )
{
int i;
if( ppszObjectType != NULL )
*ppszObjectType = "";
if( ppszAuthority != NULL )
*ppszAuthority = "";
if( ppszCode != NULL )
*ppszCode = "";
if( ppszVersion != NULL )
*ppszVersion = "";
/* -------------------------------------------------------------------- */
/* Verify prefix. */
/* -------------------------------------------------------------------- */
if( !EQUALN(pszURN,"urn:ogc:def:",12) )
return FALSE;
/* -------------------------------------------------------------------- */
/* Extract object type */
/* -------------------------------------------------------------------- */
if( ppszObjectType != NULL )
*ppszObjectType = (char *) pszURN + 12;
i = 12;
while( pszURN[i] != ':' && pszURN[i] != '\0' )
i++;
if( pszURN[i] == '\0' )
return FALSE;
pszURN[i] = '\0';
i++;
/* -------------------------------------------------------------------- */
/* Extract authority */
/* -------------------------------------------------------------------- */
if( ppszAuthority != NULL )
*ppszAuthority = (char *) pszURN + i;
while( pszURN[i] != ':' && pszURN[i] != '\0' )
i++;
if( pszURN[i] == '\0' )
return FALSE;
pszURN[i] = '\0';
i++;
/* -------------------------------------------------------------------- */
/* Extract version */
/* -------------------------------------------------------------------- */
if( ppszVersion != NULL )
*ppszVersion = (char *) pszURN + i;
while( pszURN[i] != ':' && pszURN[i] != '\0' )
i++;
if( pszURN[i] == '\0' )
return FALSE;
pszURN[i] = '\0';
i++;
/* -------------------------------------------------------------------- */
/* Extract code. */
/* -------------------------------------------------------------------- */
if( ppszCode != NULL )
*ppszCode = (char *) pszURN + i;
return TRUE;
}
/************************************************************************/
/* addURN() */
/************************************************************************/
static void addURN( CPLXMLNode *psTarget,
const char *pszAuthority,
const char *pszObjectType,
int nCode,
const char *pszVersion = "" )
{
char szURN[200];
if( pszVersion == NULL )
pszVersion = "";
CPLAssert( strlen(pszAuthority)+strlen(pszObjectType) < sizeof(szURN)-30 );
sprintf( szURN, "urn:ogc:def:%s:%s:%s:",
pszObjectType, pszAuthority, pszVersion );
if( nCode != 0 )
sprintf( szURN + strlen(szURN), "%d", nCode );
CPLCreateXMLNode(
CPLCreateXMLNode( psTarget, CXT_Attribute, "xlink:href" ),
CXT_Text, szURN );
}
/************************************************************************/
/* AddValueIDWithURN() */
/* */
/* Adds element of the form <ElementName */
/* xlink:href="urn_without_id">id</ElementName>" */
/************************************************************************/
static CPLXMLNode *
AddValueIDWithURN( CPLXMLNode *psTarget,
const char *pszElement,
const char *pszAuthority,
const char *pszObjectType,
int nCode,
const char *pszVersion = "" )
{
CPLXMLNode *psElement;
psElement = CPLCreateXMLNode( psTarget, CXT_Element, pszElement );
addURN( psElement, pszAuthority, pszObjectType, nCode, pszVersion );
return psElement;
}
/************************************************************************/
/* addAuthorityIDBlock() */
/* */
/* Creates a structure like: */
/* <srsId> */
/* <name codeSpace="urn">code</name> */
/* </srsId> */
/************************************************************************/
static CPLXMLNode *addAuthorityIDBlock( CPLXMLNode *psTarget,
const char *pszElement,
const char *pszAuthority,
const char *pszObjectType,
int nCode,
const char *pszVersion = "" )
{
char szURN[200];
/* -------------------------------------------------------------------- */
/* Prepare partial URN without the actual code. */
/* -------------------------------------------------------------------- */
if( pszVersion == NULL )
pszVersion = "";
CPLAssert( strlen(pszAuthority)+strlen(pszObjectType) < sizeof(szURN)-30 );
sprintf( szURN, "urn:ogc:def:%s:%s:%s:",
pszObjectType, pszAuthority, pszVersion );
/* -------------------------------------------------------------------- */
/* Prepare the base name, eg. <srsID>. */
/* -------------------------------------------------------------------- */
CPLXMLNode *psElement =
CPLCreateXMLNode( psTarget, CXT_Element, pszElement );
/* -------------------------------------------------------------------- */
/* Prepare the name element. */
/* -------------------------------------------------------------------- */
CPLXMLNode * psName =
CPLCreateXMLNode( psElement, CXT_Element, "gml:name" );
/* -------------------------------------------------------------------- */
/* Prepare the codespace attribute. */
/* -------------------------------------------------------------------- */
CPLCreateXMLNode(
CPLCreateXMLNode( psName, CXT_Attribute, "gml:codeSpace" ),
CXT_Text, szURN );
/* -------------------------------------------------------------------- */
/* Attach code value to name node. */
/* -------------------------------------------------------------------- */
char szCode[32];
sprintf( szCode, "%d", nCode );
CPLCreateXMLNode( psName, CXT_Text, szCode );
return psElement;
}
/************************************************************************/
/* addGMLId() */
/************************************************************************/
static void addGMLId( CPLXMLNode *psParent )
{
CPLXMLNode *psId;
static int nNextGMLId = 1;
char szIdText[40];
sprintf( szIdText, "ogrcrs%d", nNextGMLId++ );
psId =
CPLCreateXMLNode(
CPLCreateXMLNode( psParent, CXT_Attribute, "gml:id" ),
CXT_Text, szIdText );
}
/************************************************************************/
/* exportAuthorityToXML() */
/************************************************************************/
static CPLXMLNode *exportAuthorityToXML( const OGR_SRSNode *poAuthParent,
const char *pszTagName,
CPLXMLNode *psXMLParent,
const char *pszObjectType,
int bUseSubName = TRUE )
{
const OGR_SRSNode *poAuthority;
/* -------------------------------------------------------------------- */
/* Get authority node from parent. */
/* -------------------------------------------------------------------- */
if( poAuthParent->FindChild( "AUTHORITY" ) == -1 )
return NULL;
poAuthority = poAuthParent->GetChild(
poAuthParent->FindChild( "AUTHORITY" ));
/* -------------------------------------------------------------------- */
/* Create identification. */
/* -------------------------------------------------------------------- */
const char *pszCode, *pszCodeSpace, *pszEdition;
pszCode = poAuthority->GetChild(1)->GetValue();
pszCodeSpace = poAuthority->GetChild(0)->GetValue();
pszEdition = NULL;
if( bUseSubName )
return addAuthorityIDBlock( psXMLParent, pszTagName, pszCodeSpace,
pszObjectType, atoi(pszCode), pszEdition );
else
return AddValueIDWithURN( psXMLParent, pszTagName, pszCodeSpace,
pszObjectType, atoi(pszCode), pszEdition );
}
/************************************************************************/
/* addProjArg() */
/************************************************************************/
static void addProjArg( const OGRSpatialReference *poSRS, CPLXMLNode *psBase,
const char *pszMeasureType, double dfDefault,
int nParameterID, const char *pszWKTName )
{
CPLXMLNode *psNode, *psValue;
psNode = CPLCreateXMLNode( psBase, CXT_Element, "gml:usesParameterValue" );
/* -------------------------------------------------------------------- */
/* Handle the UOM. */
/* -------------------------------------------------------------------- */
const char *pszUOMValue;
if( EQUAL(pszMeasureType,"Angular") )
pszUOMValue = "urn:ogc:def:uom:EPSG::9102";
else
pszUOMValue = "urn:ogc:def:uom:EPSG::9001";
psValue = CPLCreateXMLNode( psNode, CXT_Element, "gml:value" );
CPLCreateXMLNode(
CPLCreateXMLNode( psValue, CXT_Attribute, "gml:uom" ),
CXT_Text, pszUOMValue );
/* -------------------------------------------------------------------- */
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -