?? ogrspatialreference.cpp
字號:
/******************************************************************************
* $Id: ogrspatialreference.cpp 11724 2007-07-05 15:53:06Z dron $
*
* Project: OpenGIS Simple Features Reference Implementation
* Purpose: The OGRSpatialReference class.
* Author: Frank Warmerdam, warmerdam@pobox.com
*
******************************************************************************
* Copyright (c) 1999, Les Technologies SoftMap Inc.
*
* 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_csv.h"
CPL_CVSID("$Id: ogrspatialreference.cpp 11724 2007-07-05 15:53:06Z dron $");
// The current opinion is that WKT longitudes like central meridian
// should be relative to greenwich, not the prime meridian in use.
// Define the following if they should be relative to the prime meridian
// of then geogcs.
#undef WKT_LONGITUDE_RELATIVE_TO_PM
/************************************************************************/
/* OGRPrintDouble() */
/************************************************************************/
static void OGRPrintDouble( char * pszStrBuf, double dfValue )
{
sprintf( pszStrBuf, "%.16g", dfValue );
int nLen = strlen(pszStrBuf);
// The following hack is intended to truncate some "precision" in cases
// that appear to be roundoff error.
if( nLen > 15
&& (strcmp(pszStrBuf+nLen-6,"999999") == 0
|| strcmp(pszStrBuf+nLen-6,"000001") == 0) )
{
sprintf( pszStrBuf, "%.15g", dfValue );
}
}
/************************************************************************/
/* OGRSpatialReference() */
/************************************************************************/
/**
* Constructor.
*
* This constructor takes an optional string argument which if passed
* should be a WKT representation of an SRS. Passing this is equivelent
* to not passing it, and then calling importFromWkt() with the WKT string.
*
* Note that newly created objects are given a reference count of one.
*
* The C function OSRNewSpatialReference() does the same thing as this
* constructor.
*
* @param pszWKT well known text definition to which the object should
* be initialized, or NULL (the default).
*/
OGRSpatialReference::OGRSpatialReference( const char * pszWKT )
{
bNormInfoSet = FALSE;
nRefCount = 1;
poRoot = NULL;
if( pszWKT != NULL )
importFromWkt( (char **) &pszWKT );
}
/************************************************************************/
/* OSRNewSpatialReference() */
/************************************************************************/
OGRSpatialReferenceH CPL_STDCALL OSRNewSpatialReference( const char *pszWKT )
{
OGRSpatialReference * poSRS;
poSRS = new OGRSpatialReference();
if( pszWKT != NULL && strlen(pszWKT) > 0 )
{
if( poSRS->importFromWkt( (char **) (&pszWKT) ) != OGRERR_NONE )
{
delete poSRS;
poSRS = NULL;
}
}
return poSRS;
}
/************************************************************************/
/* OGRSpatialReference() */
/* */
/* Simple copy constructor. See also Clone(). */
/************************************************************************/
OGRSpatialReference::OGRSpatialReference(const OGRSpatialReference &oOther)
{
bNormInfoSet = FALSE;
nRefCount = 1;
poRoot = NULL;
if( oOther.poRoot != NULL )
poRoot = oOther.poRoot->Clone();
}
/************************************************************************/
/* ~OGRSpatialReference() */
/************************************************************************/
/**
* OGRSpatialReference destructor.
*
* The C function OSRDestroySpatialReference() does the same thing as this
* method.
*/
OGRSpatialReference::~OGRSpatialReference()
{
if( poRoot != NULL )
delete poRoot;
}
/************************************************************************/
/* OSRDestroySpatialReference() */
/************************************************************************/
void CPL_STDCALL OSRDestroySpatialReference( OGRSpatialReferenceH hSRS )
{
delete ((OGRSpatialReference *) hSRS);
}
/************************************************************************/
/* Clear() */
/************************************************************************/
/**
* Wipe current definition.
*
* Returns OGRSpatialReference to a state with no definition, as it
* exists when first created. It does not affect reference counts.
*/
void OGRSpatialReference::Clear()
{
if( poRoot )
delete poRoot;
poRoot = NULL;
}
/************************************************************************/
/* operator=() */
/************************************************************************/
OGRSpatialReference &
OGRSpatialReference::operator=(const OGRSpatialReference &oSource)
{
if( poRoot != NULL )
{
delete poRoot;
poRoot = NULL;
}
if( oSource.poRoot != NULL )
poRoot = oSource.poRoot->Clone();
return *this;
}
/************************************************************************/
/* Reference() */
/************************************************************************/
/**
* Increments the reference count by one.
*
* The reference count is used keep track of the number of OGRGeometry objects
* referencing this SRS.
*
* The method does the same thing as the C function OSRReference().
*
* @return the updated reference count.
*/
int OGRSpatialReference::Reference()
{
return ++nRefCount;
}
/************************************************************************/
/* OSRReference() */
/************************************************************************/
int OSRReference( OGRSpatialReferenceH hSRS )
{
return ((OGRSpatialReference *) hSRS)->Reference();
}
/************************************************************************/
/* Dereference() */
/************************************************************************/
/**
* Decrements the reference count by one.
*
* The method does the same thing as the C function OSRDereference().
*
* @return the updated reference count.
*/
int OGRSpatialReference::Dereference()
{
return --nRefCount;
}
/************************************************************************/
/* OSRDereference() */
/************************************************************************/
int OSRDereference( OGRSpatialReferenceH hSRS )
{
return ((OGRSpatialReference *) hSRS)->Dereference();
}
/************************************************************************/
/* GetReferenceCount() */
/************************************************************************/
/**
* \fn int OGRSpatialReference::GetReferenceCount() const;
*
* Fetch current reference count.
*
* @return the current reference count.
*/
/************************************************************************/
/* Release() */
/************************************************************************/
/**
* Decrements the reference count by one, and destroy if zero.
*
* The method does the same thing as the C function OSRRelease().
*/
void OGRSpatialReference::Release()
{
if( this && Dereference() <= 0 )
delete this;
}
/************************************************************************/
/* OSRRelease() */
/************************************************************************/
void OSRRelease( OGRSpatialReferenceH hSRS )
{
((OGRSpatialReference *) hSRS)->Release();
}
/************************************************************************/
/* SetRoot() */
/************************************************************************/
/**
* Set the root SRS node.
*
* If the object has an existing tree of OGR_SRSNodes, they are destroyed
* as part of assigning the new root. Ownership of the passed OGR_SRSNode is
* is assumed by the OGRSpatialReference.
*
* @param poNewRoot object to assign as root.
*/
void OGRSpatialReference::SetRoot( OGR_SRSNode * poNewRoot )
{
if( poRoot != NULL )
delete poRoot;
poRoot = poNewRoot;
}
/************************************************************************/
/* GetAttrNode() */
/************************************************************************/
/**
* Find named node in tree.
*
* This method does a pre-order traversal of the node tree searching for
* a node with this exact value (case insensitive), and returns it. Leaf
* nodes are not considered, under the assumption that they are just
* attribute value nodes.
*
* If a node appears more than once in the tree (such as UNIT for instance),
* the first encountered will be returned. Use GetNode() on a subtree to be
* more specific.
*
* @param pszNodePath the name of the node to search for. May contain multiple
* components such as "GEOGCS|UNITS".
*
* @return a pointer to the node found, or NULL if none.
*/
OGR_SRSNode *OGRSpatialReference::GetAttrNode( const char * pszNodePath )
{
char **papszPathTokens;
OGR_SRSNode *poNode;
papszPathTokens = CSLTokenizeStringComplex(pszNodePath, "|", TRUE, FALSE);
if( CSLCount( papszPathTokens ) < 1 )
return NULL;
poNode = GetRoot();
for( int i = 0; poNode != NULL && papszPathTokens[i] != NULL; i++ )
{
poNode = poNode->GetNode( papszPathTokens[i] );
}
CSLDestroy( papszPathTokens );
return poNode;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -