📄 ogr_fromepsg.cpp
字号:
return( TRUE );}/************************************************************************//* EPSGGetUOMLengthInfo() *//* *//* Note: This function should eventually also know how to *//* lookup length aliases in the UOM_LE_ALIAS table. *//************************************************************************/static int EPSGGetUOMLengthInfo( int nUOMLengthCode, char **ppszUOMName, double * pdfInMeters ){ char **papszUnitsRecord; char szSearchKey[24]; int iNameField;#define UOM_FILENAME CSVFilename( "unit_of_measure.csv" )/* -------------------------------------------------------------------- *//* 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 intEPSGGetGCSInfo( 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" )); if( *pdfInvFlattening == 0.0 ) { double dfSemiMinor; dfSemiMinor = atof(CSVGetField( CSVFilename("ellipsoid.csv" ), "ELLIPSOID_CODE", szSearchKey, CC_Integer, "SEMI_MINOR_AXIS" )) * dfToMeters; if( dfSemiMajor != 0.0 && dfSemiMajor != dfSemiMinor ) *pdfInvFlattening = -1.0 / (dfSemiMinor/dfSemiMajor - 1.0); else *pdfInvFlattening = 0.0; } }/* -------------------------------------------------------------------- *//* Get the name, if requested. *//* -------------------------------------------------------------------- */ if( ppszName != NULL ) *ppszName = CPLStrdup(CSVGetField( CSVFilename("ellipsoid.csv" ), "ELLIPSOID_CODE", szSearchKey, CC_Integer, "ELLIPSOID_NAME" )); return( TRUE );}#define NatOriginLat 8801#define NatOriginLong 8802#define NatOriginScaleFactor 8805#define FalseEasting 8806#define FalseNorthing 8807#define ProjCenterLat 8811#define ProjCenterLong 8812#define Azimuth 8813#define AngleRectifiedToSkewedGrid 8814#define InitialLineScaleFactor 8815#define ProjCenterEasting 8816#define ProjCenterNorthing 8817
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -