?? ogrspatialreference.cpp
字號(hào):
*
* This method does the same as the C function OSRSetGeogCS().
*
* @param pszGeogName user visible name for the geographic coordinate system
* (not to serve as a key).
*
* @param pszDatumName key name for this datum. The OpenGIS specification
* lists some known values, and otherwise EPSG datum names with a standard
* transformation are considered legal keys.
*
* @param pszSpheroidName user visible spheroid name (not to serve as a key)
*
* @param dfSemiMajor the semi major axis of the spheroid.
*
* @param dfInvFlattening the inverse flattening for the spheroid.
* This can be computed from the semi minor axis as
* 1/f = 1.0 / (1.0 - semiminor/semimajor).
*
* @param pszPMName the name of the prime merdidian (not to serve as a key)
* If this is NULL a default value of "Greenwich" will be used.
*
* @param dfPMOffset the longitude of greenwich relative to this prime
* meridian.
*
* @param pszAngularUnits the angular units name (see ogr_srs_api.h for some
* standard names). If NULL a value of "degrees" will be assumed.
*
* @param dfConvertToRadians value to multiply angular units by to transform
* them to radians. A value of SRS_UL_DEGREE_CONV will be used if
* pszAngularUnits is NULL.
*
* @return OGRERR_NONE on success.
*/
OGRErr
OGRSpatialReference::SetGeogCS( const char * pszGeogName,
const char * pszDatumName,
const char * pszSpheroidName,
double dfSemiMajor, double dfInvFlattening,
const char * pszPMName, double dfPMOffset,
const char * pszAngularUnits,
double dfConvertToRadians )
{
bNormInfoSet = FALSE;
/* -------------------------------------------------------------------- */
/* Do we already have a GEOGCS? If so, blow it away so it can */
/* be properly replaced. */
/* -------------------------------------------------------------------- */
if( GetAttrNode( "GEOGCS" ) != NULL )
{
OGR_SRSNode *poPROJCS;
if( EQUAL(GetRoot()->GetValue(),"GEOGCS") )
Clear();
else if( (poPROJCS = GetAttrNode( "PROJCS" )) != NULL
&& poPROJCS->FindChild( "GEOGCS" ) != -1 )
poPROJCS->DestroyChild( poPROJCS->FindChild( "GEOGCS" ) );
else
return OGRERR_FAILURE;
}
/* -------------------------------------------------------------------- */
/* Set defaults for various parameters. */
/* -------------------------------------------------------------------- */
if( pszGeogName == NULL )
pszGeogName = "unnamed";
if( pszPMName == NULL )
pszPMName = SRS_PM_GREENWICH;
if( pszDatumName == NULL )
pszDatumName = "unknown";
if( pszSpheroidName == NULL )
pszSpheroidName = "unnamed";
if( pszAngularUnits == NULL )
{
pszAngularUnits = SRS_UA_DEGREE;
dfConvertToRadians = atof(SRS_UA_DEGREE_CONV);
}
/* -------------------------------------------------------------------- */
/* Build the GEOGCS object. */
/* -------------------------------------------------------------------- */
char szValue[128];
OGR_SRSNode *poGeogCS, *poSpheroid, *poDatum, *poPM, *poUnits;
poGeogCS = new OGR_SRSNode( "GEOGCS" );
poGeogCS->AddChild( new OGR_SRSNode( pszGeogName ) );
/* -------------------------------------------------------------------- */
/* Setup the spheroid. */
/* -------------------------------------------------------------------- */
poSpheroid = new OGR_SRSNode( "SPHEROID" );
poSpheroid->AddChild( new OGR_SRSNode( pszSpheroidName ) );
OGRPrintDouble( szValue, dfSemiMajor );
poSpheroid->AddChild( new OGR_SRSNode(szValue) );
OGRPrintDouble( szValue, dfInvFlattening );
poSpheroid->AddChild( new OGR_SRSNode(szValue) );
/* -------------------------------------------------------------------- */
/* Setup the Datum. */
/* -------------------------------------------------------------------- */
poDatum = new OGR_SRSNode( "DATUM" );
poDatum->AddChild( new OGR_SRSNode(pszDatumName) );
poDatum->AddChild( poSpheroid );
/* -------------------------------------------------------------------- */
/* Setup the prime meridian. */
/* -------------------------------------------------------------------- */
if( dfPMOffset == 0.0 )
strcpy( szValue, "0" );
else
OGRPrintDouble( szValue, dfPMOffset );
poPM = new OGR_SRSNode( "PRIMEM" );
poPM->AddChild( new OGR_SRSNode( pszPMName ) );
poPM->AddChild( new OGR_SRSNode( szValue ) );
/* -------------------------------------------------------------------- */
/* Setup the rotational units. */
/* -------------------------------------------------------------------- */
OGRPrintDouble( szValue, dfConvertToRadians );
poUnits = new OGR_SRSNode( "UNIT" );
poUnits->AddChild( new OGR_SRSNode(pszAngularUnits) );
poUnits->AddChild( new OGR_SRSNode(szValue) );
/* -------------------------------------------------------------------- */
/* Complete the GeogCS */
/* -------------------------------------------------------------------- */
poGeogCS->AddChild( poDatum );
poGeogCS->AddChild( poPM );
poGeogCS->AddChild( poUnits );
/* -------------------------------------------------------------------- */
/* Attach below the PROJCS if there is one, or make this the root. */
/* -------------------------------------------------------------------- */
if( GetRoot() != NULL && EQUAL(GetRoot()->GetValue(),"PROJCS") )
poRoot->InsertChild( poGeogCS, 1 );
else
SetRoot( poGeogCS );
return OGRERR_NONE;
}
/************************************************************************/
/* OSRSetGeogCS() */
/************************************************************************/
OGRErr OSRSetGeogCS( OGRSpatialReferenceH hSRS,
const char * pszGeogName,
const char * pszDatumName,
const char * pszSpheroidName,
double dfSemiMajor, double dfInvFlattening,
const char * pszPMName, double dfPMOffset,
const char * pszAngularUnits,
double dfConvertToRadians )
{
return ((OGRSpatialReference *) hSRS)->SetGeogCS(
pszGeogName, pszDatumName,
pszSpheroidName, dfSemiMajor, dfInvFlattening,
pszPMName, dfPMOffset, pszAngularUnits, dfConvertToRadians );
}
/************************************************************************/
/* SetWellKnownGeogCS() */
/************************************************************************/
/**
* Set a GeogCS based on well known name.
*
* This may be called on an empty OGRSpatialReference to make a geographic
* coordinate system, or on something with an existing PROJCS node to
* set the underlying geographic coordinate system of a projected coordinate
* system.
*
* The following well known text values are currently supported:
* <ul>
* <li> "WGS84": same as "EPSG:4326" but has no dependence on EPSG data files.
* <li> "WGS72": same as "EPSG:4322" but has no dependence on EPSG data files.
* <li> "NAD27": same as "EPSG:4267" but has no dependence on EPSG data files.
* <li> "NAD83": same as "EPSG:4269" but has no dependence on EPSG data files.
* <li> "EPSG:n": same as doing an ImportFromEPSG(n).
* </ul>
*
* @param pszName name of well known geographic coordinate system.
* @return OGRERR_NONE on success, or OGRERR_FAILURE if the name isn't
* recognised, the target object is already initialized, or an EPSG value
* can't be successfully looked up.
*/
OGRErr OGRSpatialReference::SetWellKnownGeogCS( const char * pszName )
{
OGRSpatialReference oSRS2;
OGRErr eErr;
/* -------------------------------------------------------------------- */
/* Check for EPSG authority numbers. */
/* -------------------------------------------------------------------- */
if( EQUALN(pszName, "EPSG:",5) )
{
eErr = oSRS2.importFromEPSG( atoi(pszName+5) );
if( eErr != OGRERR_NONE )
return eErr;
if( !oSRS2.IsGeographic() )
return OGRERR_FAILURE;
return CopyGeogCSFrom( &oSRS2 );
}
/* -------------------------------------------------------------------- */
/* Check for simple names. */
/* -------------------------------------------------------------------- */
char *pszWKT = NULL;
if( EQUAL(pszName, "WGS84") || EQUAL(pszName,"CRS84") )
pszWKT = "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9108\"]],AXIS[\"Lat\",NORTH],AXIS[\"Long\",EAST],AUTHORITY[\"EPSG\",\"4326\"]]";
else if( EQUAL(pszName, "WGS72") )
pszWKT = "GEOGCS[\"WGS 72\",DATUM[\"WGS_1972\",SPHEROID[\"WGS 72\",6378135,298.26,AUTHORITY[\"EPSG\",\"7043\"]],TOWGS84[0,0,4.5,0,0,0.554,0.2263],AUTHORITY[\"EPSG\",\"6322\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9108\"]],AXIS[\"Lat\",NORTH],AXIS[\"Long\",EAST],AUTHORITY[\"EPSG\",\"4322\"]]";
else if( EQUAL(pszName, "NAD27") || EQUAL(pszName, "CRS27") )
pszWKT = "GEOGCS[\"NAD27\",DATUM[\"North_American_Datum_1927\",SPHEROID[\"Clarke 1866\",6378206.4,294.978698213898,AUTHORITY[\"EPSG\",\"7008\"]],TOWGS84[-3,142,183,0,0,0,0],AUTHORITY[\"EPSG\",\"6267\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9108\"]],AXIS[\"Lat\",NORTH],AXIS[\"Long\",EAST],AUTHORITY[\"EPSG\",\"4267\"]]";
else if( EQUAL(pszName, "NAD83") || EQUAL(pszName,"CRS83") )
pszWKT = "GEOGCS[\"NAD83\",DATUM[\"North_American_Datum_1983\",SPHEROID[\"GRS 1980\",6378137,298.257222101,AUTHORITY[\"EPSG\",\"7019\"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY[\"EPSG\",\"6269\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9108\"]],AXIS[\"Lat\",NORTH],AXIS[\"Long\",EAST],AUTHORITY[\"EPSG\",\"4269\"]]";
else
return OGRERR_FAILURE;
/* -------------------------------------------------------------------- */
/* Import the WKT */
/* -------------------------------------------------------------------- */
eErr = oSRS2.importFromWkt( &pszWKT );
if( eErr != OGRERR_NONE )
return eErr;
/* -------------------------------------------------------------------- */
/* Copy over. */
/* -------------------------------------------------------------------- */
return CopyGeogCSFrom( &oSRS2 );
}
/************************************************************************/
/* OSRSetWellKnownGeogCS() */
/************************************************************************/
OGRErr OSRSetWellKnownGeogCS( OGRSpatialReferenceH hSRS, const char *pszName )
{
return ((OGRSpatialReference *) hSRS)->SetWellKnownGeogCS( pszName );
}
/************************************************************************/
/* CopyGeogCSFrom() */
/************************************************************************/
/**
* Copy GEOGCS from another OGRSpatialReference.
*
* The GEOGCS information is copied into this OGRSpatialReference from another.
* If this object has a PROJCS root already, the GEOGCS is installed within
* it, otherwise it is installed as the root.
*
* @param poSrcSRS the spatial reference to copy the GEOGCS information from.
*
* @return OGRERR_NONE on success or an error code.
*/
OGRErr OGRSpatialReference::CopyGeogCSFrom(
const OGRSpatialReference * poSrcSRS )
{
const OGR_SRSNode *poGeogCS = NULL;
bNormInfoSet = FALSE;
/* -------------------------------------------------------------------- */
/* Do we already have a GEOGCS? If so, blow it away so it can */
/* be properly replaced. */
/* -------------------------------------------------------------------- */
if( GetAttrNode( "GEOGCS" ) != NULL )
{
OGR_SRSNode *poPROJCS;
if( EQUAL(GetRoot()->GetValue(),"GEOGCS") )
Clear();
else if( (poPROJCS = GetAttrNode( "PROJCS" )) != NULL
&& poPROJCS->FindChild( "GEOGCS" ) != -1 )
poPROJCS->DestroyChild( poPROJCS->FindChild( "GEOGCS" ) );
else
return OGRERR_FAILURE;
}
/* -------------------------------------------------------------------- */
/* Find the GEOGCS node on the source. */
/* -------------------------------------------------------------------- */
poGeogCS = poSrcSRS->GetAttrNode( "GEOGCS" );
if( poGeogCS == NULL )
return OGRERR_FAILURE;
/* -------------------------------------------------------------------- */
/* Attach below the PROJCS if there is one, or make this the root. */
/* -------------------------------------------------------------------- */
if( GetRoot() != NULL && EQUAL(GetRoot()->GetValue(),"PROJCS") )
poRoot->InsertChild( poGeogCS->Clone(), 1 );
else
SetRoot( poGeogCS->Clone() );
return OGRERR_NONE;
}
/************************************************************************/
/* OSRCopyGeogCSFrom() */
/************************************************************************/
OGRErr OSRCopyGeogCSFrom( OGRSpatialReferenceH hSRS,
OGRSpatialReferenceH hSrcSRS )
{
return ((OGRSpatialReference *) hSRS)->CopyGeogCSFrom(
(const OGRSpatialReference *) hSrcSRS );
}
/************************************************************************/
/* SetFromUserInput() */
/************************************************************************/
/**
* Set spatial reference from various text formats.
*
* This method will examine the provided input, and try to deduce the
* format, and then use it to initialize the spatial reference system. It
* may take the following forms:
*
* <ol>
* <li> Well Known Text definition - passed on to importFromWkt().
* <li> "EPSG:n" - number passed on to importFromEPSG().
* <li> "AUTO:proj_id,unit_id,lon0,lat0" - WMS auto projections.
* <li> "urn:ogc:def:crs:EPSG::n" - ogc urns
* <li> PROJ.4 definitions - passed on to importFromProj4().
* <li> filename - file read for WKT, XML or PROJ.4 definition.
* <li> well known name accepted by SetWellKnownGeogCS(), such as NAD27, NAD83,
* WGS84 or WGS72.
* <li> WKT (directly or in a file) in ESRI format should be prefixed with
* ESRI:: to trigger an automatic morphFromESRI().
* </ol>
*
* It is expected that this method will be extended in the future to support
* XML and perhaps a simplified "minilanguage" for indicating common UTM and
* State Plane definitions.
*
* This method is intended to be flexible, but by it's nature it is
* imprecise as it must guess information about the format intended. When
* possible applications should call the specific method appropriate if the
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -