⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ogr_fromepsg.cpp

📁 在linux环境下
💻 CPP
📖 第 1 页 / 共 4 页
字号:
    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 + -