📄 ogr_fromepsg.cpp
字号:
/* -------------------------------------------------------------------- */
/* We short cut meter to save work in the most common case. */
/* -------------------------------------------------------------------- */
if( nUOMLengthCode == 9001 )
{
if( ppszUOMName != NULL )
*ppszUOMName = CPLStrdup( "metre" );
if( pdfInMeters != NULL )
*pdfInMeters = 1.0;
return TRUE;
}
/* -------------------------------------------------------------------- */
/* Search the units database for this unit. If we don't find */
/* it return failure. */
/* -------------------------------------------------------------------- */
sprintf( szSearchKey, "%d", nUOMLengthCode );
papszUnitsRecord =
CSVScanFileByName( UOM_FILENAME, "UOM_CODE", szSearchKey, CC_Integer );
if( papszUnitsRecord == NULL )
return FALSE;
/* -------------------------------------------------------------------- */
/* Get the name, if requested. */
/* -------------------------------------------------------------------- */
if( ppszUOMName != NULL )
{
iNameField = CSVGetFileFieldId( UOM_FILENAME, "UNIT_OF_MEAS_NAME" );
*ppszUOMName = CPLStrdup( CSLGetField(papszUnitsRecord, iNameField) );
}
/* -------------------------------------------------------------------- */
/* Get the A and B factor fields, and create the multiplicative */
/* factor. */
/* -------------------------------------------------------------------- */
if( pdfInMeters != NULL )
{
int iBFactorField, iCFactorField;
iBFactorField = CSVGetFileFieldId( UOM_FILENAME, "FACTOR_B" );
iCFactorField = CSVGetFileFieldId( UOM_FILENAME, "FACTOR_C" );
if( atof(CSLGetField(papszUnitsRecord, iCFactorField)) > 0.0 )
*pdfInMeters = atof(CSLGetField(papszUnitsRecord, iBFactorField))
/ atof(CSLGetField(papszUnitsRecord, iCFactorField));
else
*pdfInMeters = 0.0;
}
return( TRUE );
}
/************************************************************************/
/* EPSGGetWGS84Transform() */
/* */
/* The following code attempts to find a bursa-wolf */
/* transformation from this GeogCS to WGS84 (4326). */
/* */
/* Faults: */
/* o I think there are codes other than 9603 and 9607 that */
/* return compatible, or easily transformed parameters. */
/* o Only the first path from the given GeogCS is checked due */
/* to limitations in the CSV API. */
/************************************************************************/
int EPSGGetWGS84Transform( int nGeogCS, double *padfTransform )
{
int nMethodCode, iDXField, iField;
char szCode[32];
const char *pszFilename = CSVFilename("gcs.csv");
/* -------------------------------------------------------------------- */
/* Fetch the line from the GCS table. */
/* -------------------------------------------------------------------- */
char **papszLine;
sprintf( szCode, "%d", nGeogCS );
papszLine = CSVScanFileByName( pszFilename,
"COORD_REF_SYS_CODE",
szCode, CC_Integer );
if( papszLine == NULL )
return FALSE;
/* -------------------------------------------------------------------- */
/* Verify that the method code is one of our accepted ones. */
/* -------------------------------------------------------------------- */
nMethodCode =
atoi(CSLGetField( papszLine,
CSVGetFileFieldId(pszFilename,
"COORD_OP_METHOD_CODE")));
if( nMethodCode != 9603 && nMethodCode != 9607 && nMethodCode != 9606 )
return FALSE;
/* -------------------------------------------------------------------- */
/* Fetch the transformation parameters. */
/* -------------------------------------------------------------------- */
iDXField = CSVGetFileFieldId(pszFilename, "DX");
for( iField = 0; iField < 7; iField++ )
padfTransform[iField] = atof(papszLine[iDXField+iField]);
/* -------------------------------------------------------------------- */
/* 9607 - coordinate frame rotation has reverse signs on the */
/* rotational coefficients. Fix up now since we internal */
/* operate according to method 9606 (position vector 7-parameter). */
/* -------------------------------------------------------------------- */
if( nMethodCode == 9607 )
{
padfTransform[3] *= -1;
padfTransform[4] *= -1;
padfTransform[5] *= -1;
}
return TRUE;
}
/************************************************************************/
/* EPSGGetPMInfo() */
/* */
/* Get the offset between a given prime meridian and Greenwich */
/* in degrees. */
/************************************************************************/
static int
EPSGGetPMInfo( int nPMCode, char ** ppszName, double *pdfOffset )
{
char szSearchKey[24];
int nUOMAngle;
#define PM_FILENAME CSVFilename("prime_meridian.csv")
/* -------------------------------------------------------------------- */
/* Use a special short cut for Greenwich, since it is so common. */
/* -------------------------------------------------------------------- */
if( nPMCode == 7022 /* PM_Greenwich */ )
{
if( pdfOffset != NULL )
*pdfOffset = 0.0;
if( ppszName != NULL )
*ppszName = CPLStrdup( "Greenwich" );
return TRUE;
}
/* -------------------------------------------------------------------- */
/* Search the database for the corresponding datum code. */
/* -------------------------------------------------------------------- */
sprintf( szSearchKey, "%d", nPMCode );
nUOMAngle =
atoi(CSVGetField( PM_FILENAME,
"PRIME_MERIDIAN_CODE", szSearchKey, CC_Integer,
"UOM_CODE" ) );
if( nUOMAngle < 1 )
return FALSE;
/* -------------------------------------------------------------------- */
/* Get the PM offset. */
/* -------------------------------------------------------------------- */
if( pdfOffset != NULL )
{
*pdfOffset =
EPSGAngleStringToDD(
CSVGetField( PM_FILENAME,
"PRIME_MERIDIAN_CODE", szSearchKey, CC_Integer,
"GREENWICH_LONGITUDE" ),
nUOMAngle );
}
/* -------------------------------------------------------------------- */
/* Get the name, if requested. */
/* -------------------------------------------------------------------- */
if( ppszName != NULL )
*ppszName =
CPLStrdup(
CSVGetField( PM_FILENAME,
"PRIME_MERIDIAN_CODE", szSearchKey, CC_Integer,
"PRIME_MERIDIAN_NAME" ));
return( TRUE );
}
/************************************************************************/
/* EPSGGetGCSInfo() */
/* */
/* Fetch the datum, and prime meridian related to a particular */
/* GCS. */
/************************************************************************/
static int
EPSGGetGCSInfo( int nGCSCode, char ** ppszName,
int * pnDatum, char **ppszDatumName,
int * pnPM, int *pnEllipsoid, int *pnUOMAngle )
{
char szSearchKey[24];
int nDatum, nPM, nUOMAngle, nEllipsoid;
const char *pszFilename = CSVFilename("gcs.csv");
/* -------------------------------------------------------------------- */
/* Search the database for the corresponding datum code. */
/* -------------------------------------------------------------------- */
sprintf( szSearchKey, "%d", nGCSCode );
nDatum = atoi(CSVGetField( pszFilename, "COORD_REF_SYS_CODE",
szSearchKey, CC_Integer,
"DATUM_CODE" ) );
if( nDatum < 1 )
return FALSE;
if( pnDatum != NULL )
*pnDatum = nDatum;
/* -------------------------------------------------------------------- */
/* Get the PM. */
/* -------------------------------------------------------------------- */
nPM = atoi(CSVGetField( pszFilename, "COORD_REF_SYS_CODE",
szSearchKey, CC_Integer,
"PRIME_MERIDIAN_CODE" ) );
if( nPM < 1 )
return FALSE;
if( pnPM != NULL )
*pnPM = nPM;
/* -------------------------------------------------------------------- */
/* Get the Ellipsoid. */
/* -------------------------------------------------------------------- */
nEllipsoid = atoi(CSVGetField( pszFilename, "COORD_REF_SYS_CODE",
szSearchKey, CC_Integer,
"ELLIPSOID_CODE" ) );
if( nEllipsoid < 1 )
return FALSE;
if( pnEllipsoid != NULL )
*pnEllipsoid = nEllipsoid;
/* -------------------------------------------------------------------- */
/* Get the angular units. */
/* -------------------------------------------------------------------- */
nUOMAngle = atoi(CSVGetField( pszFilename, "COORD_REF_SYS_CODE",
szSearchKey, CC_Integer,
"UOM_CODE" ) );
if( nUOMAngle < 1 )
return FALSE;
if( pnUOMAngle != NULL )
*pnUOMAngle = nUOMAngle;
/* -------------------------------------------------------------------- */
/* Get the name, if requested. */
/* -------------------------------------------------------------------- */
if( ppszName != NULL )
*ppszName =
CPLStrdup(CSVGetField( pszFilename, "COORD_REF_SYS_CODE",
szSearchKey, CC_Integer,
"COORD_REF_SYS_NAME" ));
/* -------------------------------------------------------------------- */
/* Get the datum name, if requested. */
/* -------------------------------------------------------------------- */
if( ppszDatumName != NULL )
*ppszDatumName =
CPLStrdup(CSVGetField( pszFilename, "COORD_REF_SYS_CODE",
szSearchKey, CC_Integer,
"DATUM_NAME" ));
return( TRUE );
}
/************************************************************************/
/* EPSGGetEllipsoidInfo() */
/* */
/* Fetch info about an ellipsoid. Axes are always returned in */
/* meters. SemiMajor computed based on inverse flattening */
/* where that is provided. */
/************************************************************************/
static int
EPSGGetEllipsoidInfo( int nCode, char ** ppszName,
double * pdfSemiMajor, double * pdfInvFlattening )
{
char szSearchKey[24];
double dfSemiMajor, dfToMeters = 1.0;
int nUOMLength;
/* -------------------------------------------------------------------- */
/* Get the semi major axis. */
/* -------------------------------------------------------------------- */
sprintf( szSearchKey, "%d", nCode );
dfSemiMajor =
atof(CSVGetField( CSVFilename("ellipsoid.csv" ),
"ELLIPSOID_CODE", szSearchKey, CC_Integer,
"SEMI_MAJOR_AXIS" ) );
if( dfSemiMajor == 0.0 )
return FALSE;
/* -------------------------------------------------------------------- */
/* Get the translation factor into meters. */
/* -------------------------------------------------------------------- */
nUOMLength = atoi(CSVGetField( CSVFilename("ellipsoid.csv" ),
"ELLIPSOID_CODE", szSearchKey, CC_Integer,
"UOM_CODE" ));
EPSGGetUOMLengthInfo( nUOMLength, NULL, &dfToMeters );
dfSemiMajor *= dfToMeters;
if( pdfSemiMajor != NULL )
*pdfSemiMajor = dfSemiMajor;
/* -------------------------------------------------------------------- */
/* Get the semi-minor if requested. If the Semi-minor axis */
/* isn't available, compute it based on the inverse flattening. */
/* -------------------------------------------------------------------- */
if( pdfInvFlattening != NULL )
{
*pdfInvFlattening =
atof(CSVGetField( CSVFilename("ellipsoid.csv" ),
"ELLIPSOID_CODE", szSearchKey, CC_Integer,
"INV_FLATTENING" ));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -