📄 ogr_fromepsg.cpp
字号:
if( EPSGGetWGS84Transform( nGeogCS, adfBursaTransform ) )
{
OGR_SRSNode *poWGS84;
char szValue[48];
poWGS84 = new OGR_SRSNode( "TOWGS84" );
for( int iCoeff = 0; iCoeff < 7; iCoeff++ )
{
sprintf( szValue, "%g", adfBursaTransform[iCoeff] );
poWGS84->AddChild( new OGR_SRSNode( szValue ) );
}
poSRS->GetAttrNode( "DATUM" )->AddChild( poWGS84 );
}
poSRS->SetAuthority( "GEOGCS", "EPSG", nGeogCS );
poSRS->SetAuthority( "DATUM", "EPSG", nDatumCode );
poSRS->SetAuthority( "SPHEROID", "EPSG", nEllipsoidCode );
poSRS->SetAuthority( "PRIMEM", "EPSG", nPMCode );
if( nUOMAngle > 0 )
poSRS->SetAuthority( "GEOGCS|UNIT", "EPSG", nUOMAngle );
CPLFree( pszAngleName );
CPLFree( pszDatumName );
CPLFree( pszEllipsoidName );
CPLFree( pszGeogCSName );
CPLFree( pszPMName );
return OGRERR_NONE;
}
/************************************************************************/
/* OGR_FetchParm() */
/* */
/* Fetch a parameter from the parm list, based on it's EPSG */
/* parameter code. */
/************************************************************************/
static double OGR_FetchParm( double *padfProjParms, int *panParmIds,
int nTargetId, double dfFromGreenwich )
{
int i;
double dfResult;
/* -------------------------------------------------------------------- */
/* Set default in meters/degrees. */
/* -------------------------------------------------------------------- */
switch( nTargetId )
{
case NatOriginScaleFactor:
case InitialLineScaleFactor:
case PseudoStdParallelScaleFactor:
dfResult = 1.0;
break;
case AngleRectifiedToSkewedGrid:
dfResult = 90.0;
break;
default:
dfResult = 0.0;
}
/* -------------------------------------------------------------------- */
/* Try to find actual value in parameter list. */
/* -------------------------------------------------------------------- */
for( i = 0; i < 7; i++ )
{
if( panParmIds[i] == nTargetId )
{
dfResult = padfProjParms[i];
break;
}
}
/* -------------------------------------------------------------------- */
/* EPSG longitudes are relative to greenwich. The follow code */
/* could be used to make them relative to the prime meridian of */
/* the associated GCS if that was appropriate. However, the */
/* SetNormProjParm() method expects longitudes relative to */
/* greenwich, so there is nothing for us to do. */
/* -------------------------------------------------------------------- */
#ifdef notdef
switch( nTargetId )
{
case NatOriginLong:
case ProjCenterLong:
case FalseOriginLong:
case SphericalOriginLong:
case InitialLongitude:
// Note that the EPSG values are already relative to greenwich.
// This shift is really making it relative to the provided prime
// meridian, so that when SetTM() and company the correction back
// ends up back relative to greenwich.
dfResult = dfResult + dfFromGreenwich;
break;
default:
;
}
#endif
return dfResult;
}
#define OGR_FP(x) OGR_FetchParm( adfProjParms, anParmIds, (x), \
dfFromGreenwich )
/************************************************************************/
/* SetEPSGProjCS() */
/************************************************************************/
static OGRErr SetEPSGProjCS( OGRSpatialReference * poSRS, int nPCSCode )
{
int nGCSCode, nUOMAngleCode, nUOMLength, nTRFCode, nProjMethod;
int anParmIds[7];
char *pszPCSName = NULL, *pszUOMLengthName = NULL;
double adfProjParms[7], dfInMeters, dfFromGreenwich;
OGRErr nErr;
OGR_SRSNode *poNode;
if( !EPSGGetPCSInfo( nPCSCode, &pszPCSName, &nUOMLength, &nUOMAngleCode,
&nGCSCode, &nTRFCode ) )
return OGRERR_UNSUPPORTED_SRS;
poSRS->SetNode( "PROJCS", pszPCSName );
/* -------------------------------------------------------------------- */
/* Set GEOGCS. */
/* -------------------------------------------------------------------- */
nErr = SetEPSGGeogCS( poSRS, nGCSCode );
if( nErr != OGRERR_NONE )
return nErr;
dfFromGreenwich = poSRS->GetPrimeMeridian();
/* -------------------------------------------------------------------- */
/* Set linear units. */
/* -------------------------------------------------------------------- */
if( !EPSGGetUOMLengthInfo( nUOMLength, &pszUOMLengthName, &dfInMeters ) )
return OGRERR_UNSUPPORTED_SRS;
poSRS->SetLinearUnits( pszUOMLengthName, dfInMeters );
poSRS->SetAuthority( "PROJCS|UNIT", "EPSG", nUOMLength );
CPLFree( pszUOMLengthName );
CPLFree( pszPCSName );
/* -------------------------------------------------------------------- */
/* Set projection and parameters. */
/* -------------------------------------------------------------------- */
if( !EPSGGetProjTRFInfo( nPCSCode, &nProjMethod, anParmIds, adfProjParms ))
return OGRERR_UNSUPPORTED_SRS;
switch( nProjMethod )
{
case 9801:
case 9817: /* really LCC near conformal */
poSRS->SetLCC1SP( OGR_FP( NatOriginLat ), OGR_FP( NatOriginLong ),
OGR_FP( NatOriginScaleFactor ),
OGR_FP( FalseEasting ), OGR_FP( FalseNorthing ) );
break;
case 9802:
poSRS->SetLCC( OGR_FP( StdParallel1Lat ), OGR_FP( StdParallel2Lat ),
OGR_FP( FalseOriginLat ), OGR_FP( FalseOriginLong ),
OGR_FP( FalseOriginEasting ),
OGR_FP( FalseOriginNorthing ));
break;
case 9803:
poSRS->SetLCCB( OGR_FP( StdParallel1Lat ), OGR_FP( StdParallel2Lat ),
OGR_FP( FalseOriginLat ), OGR_FP( FalseOriginLong ),
OGR_FP( FalseOriginEasting ),
OGR_FP( FalseOriginNorthing ));
break;
case 9804:
case 9805: /* NOTE: treats 1SP and 2SP cases the same */
poSRS->SetMercator( OGR_FP( NatOriginLat ), OGR_FP( NatOriginLong ),
OGR_FP( NatOriginScaleFactor ),
OGR_FP( FalseEasting ), OGR_FP( FalseNorthing ) );
break;
case 9806:
poSRS->SetCS( OGR_FP( NatOriginLat ), OGR_FP( NatOriginLong ),
OGR_FP( FalseEasting ), OGR_FP( FalseNorthing ) );
break;
case 9807:
poSRS->SetTM( OGR_FP( NatOriginLat ), OGR_FP( NatOriginLong ),
OGR_FP( NatOriginScaleFactor ),
OGR_FP( FalseEasting ), OGR_FP( FalseNorthing ) );
break;
case 9808:
poSRS->SetTMSO( OGR_FP( NatOriginLat ), OGR_FP( NatOriginLong ),
OGR_FP( NatOriginScaleFactor ),
OGR_FP( FalseEasting ), OGR_FP( FalseNorthing ) );
break;
case 9809:
poSRS->SetOS( OGR_FP( NatOriginLat ), OGR_FP( NatOriginLong ),
OGR_FP( NatOriginScaleFactor ),
OGR_FP( FalseEasting ), OGR_FP( FalseNorthing ) );
break;
case 9810:
poSRS->SetPS( OGR_FP( NatOriginLat ), OGR_FP( NatOriginLong ),
OGR_FP( NatOriginScaleFactor ),
OGR_FP( FalseEasting ), OGR_FP( FalseNorthing ) );
break;
case 9811:
poSRS->SetNZMG( OGR_FP( NatOriginLat ), OGR_FP( NatOriginLong ),
OGR_FP( FalseEasting ), OGR_FP( FalseNorthing ) );
break;
case 9812:
case 9813:
poSRS->SetHOM( OGR_FP( ProjCenterLat ), OGR_FP( ProjCenterLong ),
OGR_FP( Azimuth ),
OGR_FP( AngleRectifiedToSkewedGrid ),
OGR_FP( InitialLineScaleFactor ),
OGR_FP( FalseEasting ), OGR_FP( FalseNorthing ) );
poNode = poSRS->GetAttrNode( "PROJECTION" )->GetChild( 0 );
if( nProjMethod == 9813 )
poNode->SetValue( SRS_PT_LABORDE_OBLIQUE_MERCATOR );
break;
case 9814:
/* NOTE: This is no longer used! Swiss Oblique Mercator gets
** implemented using 9815 instead.
*/
poSRS->SetSOC( OGR_FP( ProjCenterLat ), OGR_FP( ProjCenterLong ),
OGR_FP( FalseEasting ), OGR_FP( FalseNorthing ) );
break;
case 9815:
poSRS->SetHOM( OGR_FP( ProjCenterLat ), OGR_FP( ProjCenterLong ),
OGR_FP( Azimuth ),
OGR_FP( AngleRectifiedToSkewedGrid ),
OGR_FP( InitialLineScaleFactor ),
OGR_FP( ProjCenterEasting ),
OGR_FP( ProjCenterNorthing ) );
break;
case 9816:
poSRS->SetTMG( OGR_FP( FalseOriginLat ), OGR_FP( FalseOriginLong ),
OGR_FP( FalseOriginEasting ),
OGR_FP( FalseOriginNorthing ) );
break;
case 9818:
poSRS->SetPolyconic( OGR_FP( NatOriginLat ), OGR_FP( NatOriginLong ),
OGR_FP( FalseEasting ), OGR_FP( FalseNorthing ) );
break;
case 9819:
poSRS->SetKrovak( OGR_FP( ProjCenterLat ), OGR_FP( ProjCenterLong ),
OGR_FP( Azimuth ),
OGR_FP( PseudoStdParallelLat ),
OGR_FP( PseudoStdParallelScaleFactor ),
OGR_FP( ProjCenterEasting ),
OGR_FP( ProjCenterNorthing ) );
break;
case 9820:
poSRS->SetLAEA( OGR_FP( NatOriginLat ), OGR_FP( NatOriginLong ),
OGR_FP( FalseEasting ), OGR_FP( FalseNorthing ) );
break;
case 9821: /* this is the spherical form, and really needs different
equations which give different results but PROJ.4 doesn't
seem to support the spherical form. */
poSRS->SetLAEA( OGR_FP( SphericalOriginLat ),
OGR_FP( SphericalOriginLong ),
OGR_FP( FalseEasting ), OGR_FP( FalseNorthing ) );
break;
case 9822: /* Albers (Conic) Equal Area */
poSRS->SetACEA( OGR_FP( StdParallel1Lat ),
OGR_FP( StdParallel2Lat ),
OGR_FP( FalseOriginLat ),
OGR_FP( FalseOriginLong ),
OGR_FP( FalseOriginEasting ),
OGR_FP( FalseOriginNorthing ) );
break;
case 9823: /* Equidistant Cylindrical / Plate Carre / Equirectangular */
poSRS->SetEquirectangular( OGR_FP( NatOriginLat ),
OGR_FP( NatOriginLong ),
0.0, 0.0 );
break;
case 9829: /* Polar Stereographic (Variant B) */
poSRS->SetPS( OGR_FP( PolarLatStdParallel ), OGR_FP(PolarLongOrigin),
1.0,
OGR_FP( FalseEasting ), OGR_FP( FalseNorthing ) );
break;
default:
CPLDebug( "EPSG", "No WKT support for projection method %d.",
nProjMethod );
return OGRERR_UNSUPPORTED_SRS;
}
/* -------------------------------------------------------------------- */
/* Set overall PCS authority code. */
/* -------------------------------------------------------------------- */
poSRS->SetAuthority( "PROJCS", "EPSG", nPCSCode );
return OGRERR_NONE;
}
/************************************************************************/
/* importFromEPSG() */
/************************************************************************/
/**
* Initialize SRS based on EPSG GCS or PCS code.
*
* This code uses the GeoTIFF cpl_csv services to access the EPSG CSV
* data. If frmts/gtiff/libgeotiff isn't linked in, linking will fail.
* If EPSG tables can't be found at runtime, the method will fail.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -