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

📄 ogr_srs_proj4.cpp

📁 用于读取TAB、MIF、SHP文件的类
💻 CPP
📖 第 1 页 / 共 5 页
字号:
          case '\t':          case '\n':            pszFullWrk[i] = '\0';            break;          default:            break;        }    }    if( pszStart != NULL && strlen(pszStart) > 0 )        papszTokens = CSLAddString( papszTokens, pszStart );    CPLFree( pszFullWrk );    return papszTokens;}/************************************************************************//*                         OSRImportFromProj4()                         *//************************************************************************/OGRErr OSRImportFromProj4( OGRSpatialReferenceH hSRS, const char *pszProj4 ){    return ((OGRSpatialReference *) hSRS)->importFromProj4( pszProj4 );}/************************************************************************//*                              OSR_GDV()                               *//*                                                                      *//*      Fetch a particular parameter out of the parameter list, or      *//*      the indicated default if it isn't available.  This is a         *//*      helper function for importFromProj4().                          *//************************************************************************/static double OSR_GDV( char **papszNV, const char * pszField,                        double dfDefaultValue ){    const char * pszValue;    pszValue = CSLFetchNameValue( papszNV, pszField );    // special hack to use k_0 if available.    if( pszValue == NULL && EQUAL(pszField,"k") )        pszValue = CSLFetchNameValue( papszNV, "k_0" );    if( pszValue == NULL )        return dfDefaultValue;    else        return CPLDMSToDec(pszValue);}/************************************************************************//*                          importFromProj4()                           *//************************************************************************//** * Import PROJ.4 coordinate string. * * The OGRSpatialReference is initialized from the passed PROJ.4 style * coordinate system string.  In addition to many +proj formulations which * have OGC equivelents, it is also possible to import "+init=epsg:n" style * definitions.  These are passed to importFromEPSG().  Other init strings * (such as the state plane zones) are not currently supported.    * * Example: *   pszProj4 = "+proj=utm +zone=11 +datum=WGS84"  * * This method is the equivelent of the C function OSRImportFromProj4(). * * @param pszProj4 the PROJ.4 style string.  * * @return OGRERR_NONE on success or OGRERR_CORRUPT_DATA on failure. */OGRErr OGRSpatialReference::importFromProj4( const char * pszProj4 ){    char **papszNV = NULL;    char **papszTokens;    int  i;    char *pszCleanCopy;/* -------------------------------------------------------------------- *//*      Strip any newlines or other "funny" stuff that might occur      *//*      if this string just came from reading a file.                   *//* -------------------------------------------------------------------- */    pszCleanCopy = CPLStrdup( pszProj4 );    for( i = 0; pszCleanCopy[i] != '\0'; i++ )    {        if( pszCleanCopy[i] == 10             || pszCleanCopy[i] == 13             || pszCleanCopy[i] == 9 )            pszCleanCopy[i] = ' ';    }/* -------------------------------------------------------------------- *//*      Try to normalize the definition.  This should expand +init=     *//*      clauses and so forth.                                           *//* -------------------------------------------------------------------- */    char *pszNormalized;    pszNormalized = OCTProj4Normalize( pszCleanCopy );    CPLFree( pszCleanCopy );    /* -------------------------------------------------------------------- *//*      If we have an EPSG based init string, try to process it         *//*      directly to get the fullest possible EPSG definition.           *//* -------------------------------------------------------------------- */    if( strstr(pszNormalized,"init=epsg:") != NULL )    {        OGRErr eErr;        const char *pszNumber = strstr(pszNormalized,"init=epsg:") + 10;        eErr = importFromEPSG( atoi(pszNumber) );        if( eErr == OGRERR_NONE )        {            CPLFree( pszNormalized );            return eErr;        }    }/* -------------------------------------------------------------------- *//*      Parse the PROJ.4 string into a cpl_string.h style name/value    *//*      list.                                                           *//* -------------------------------------------------------------------- */    papszTokens = OSRProj4Tokenize( pszNormalized );    CPLFree( pszNormalized );        for( i = 0; papszTokens != NULL && papszTokens[i] != NULL; i++ )    {        char *pszEqual = strstr(papszTokens[i],"=");        if( pszEqual == NULL )            papszNV = CSLAddNameValue(papszNV, papszTokens[i], "" );        else        {            pszEqual[0] = '\0';            papszNV = CSLAddNameValue( papszNV, papszTokens[i], pszEqual+1 );        }    }    CSLDestroy( papszTokens );/* -------------------------------------------------------------------- *//*      Extract the prime meridian, if there is one set.                *//* -------------------------------------------------------------------- */    const char *pszPM = CSLFetchNameValue( papszNV, "pm" );    double dfFromGreenwich = 0.0;    int    nPMCode = -1;    if( pszPM != NULL )    {        if( EQUAL(pszPM,"lisbon") )        {            dfFromGreenwich = CPLDMSToDec( "9d07'54.862\"W" );            nPMCode = 8902;        }        else if( EQUAL(pszPM,"paris") )        {            dfFromGreenwich = CPLDMSToDec( "2d20'14.025\"E" );            nPMCode = 8903;        }        else if( EQUAL(pszPM,"bogota") )        {            dfFromGreenwich = CPLDMSToDec( "74d04'51.3\"W" );            nPMCode = 8904;        }        else if( EQUAL(pszPM,"madrid") )        {            dfFromGreenwich = CPLDMSToDec( "3d41'16.48\"W" );            nPMCode = 8905;        }        else if( EQUAL(pszPM,"rome") )        {            dfFromGreenwich = CPLDMSToDec( "12d27'8.4\"E" );            nPMCode = 8906;        }        else if( EQUAL(pszPM,"bern") )        {            dfFromGreenwich = CPLDMSToDec( "7d26'22.5\"E" );            nPMCode = 8907;        }        else if( EQUAL(pszPM,"jakarta") )        {            dfFromGreenwich = CPLDMSToDec( "106d48'27.79\"E" );            nPMCode = 8908;        }        else if( EQUAL(pszPM,"ferro") )        {            dfFromGreenwich = CPLDMSToDec( "17d40'W" );            nPMCode = 8909;        }        else if( EQUAL(pszPM,"brussels") )        {            dfFromGreenwich = CPLDMSToDec( "4d22'4.71\"E" );            nPMCode = 8910;        }        else if( EQUAL(pszPM,"stockholm") )        {            dfFromGreenwich = CPLDMSToDec( "18d3'29.8\"E" );            nPMCode = 8911;        }        else if( EQUAL(pszPM,"athens") )        {            dfFromGreenwich = CPLDMSToDec( "23d42'58.815\"E" );            nPMCode = 8912;        }        else if( EQUAL(pszPM,"oslo") )        {            dfFromGreenwich = CPLDMSToDec( "10d43'22.5\"E" );            nPMCode = 8913;        }        else        {            dfFromGreenwich = CPLDMSToDec( pszPM );            pszPM = "unnamed";        }    }    else        pszPM = "Greenwich";/* -------------------------------------------------------------------- *//*      Operate on the basis of the projection name.                    *//* -------------------------------------------------------------------- */    const char *pszProj = CSLFetchNameValue(papszNV,"proj");    if( pszProj == NULL )    {        CPLDebug( "OGR_PROJ4", "Can't find +proj= in:\n%s", pszProj4 );        CSLDestroy( papszNV );        return OGRERR_CORRUPT_DATA;    }    else if( EQUAL(pszProj,"longlat") || EQUAL(pszProj,"latlong") )    {    }        else if( EQUAL(pszProj,"bonne") )    {        SetBonne( OSR_GDV( papszNV, "lat_1", 0.0 ),                   OSR_GDV( papszNV, "lon_0", 0.0 ) + dfFromGreenwich,                   OSR_GDV( papszNV, "x_0", 0.0 ),                   OSR_GDV( papszNV, "y_0", 0.0 ) );    }    else if( EQUAL(pszProj,"cass") )    {        SetCS( OSR_GDV( papszNV, "lat_0", 0.0 ),                OSR_GDV( papszNV, "lon_0", 0.0 ) + dfFromGreenwich,                OSR_GDV( papszNV, "x_0", 0.0 ),                OSR_GDV( papszNV, "y_0", 0.0 ) );    }    else if( EQUAL(pszProj,"nzmg") )    {        SetNZMG( OSR_GDV( papszNV, "lat_0", -41.0 ),                  OSR_GDV( papszNV, "lon_0", 173.0 ) + dfFromGreenwich,                  OSR_GDV( papszNV, "x_0", 2510000.0 ),                  OSR_GDV( papszNV, "y_0", 6023150.0 ) );    }    else if( EQUAL(pszProj,"cea") )    {        SetCEA( OSR_GDV( papszNV, "lat_ts", 0.0 ),                 OSR_GDV( papszNV, "lon_0", 0.0 ) + dfFromGreenwich,                 OSR_GDV( papszNV, "x_0", 0.0 ),                 OSR_GDV( papszNV, "y_0", 0.0 ) );    }    else if( EQUAL(pszProj,"tmerc") )    {        SetTM( OSR_GDV( papszNV, "lat_0", 0.0 ),                OSR_GDV( papszNV, "lon_0", 0.0 ) + dfFromGreenwich,                OSR_GDV( papszNV, "k", 1.0 ),                OSR_GDV( papszNV, "x_0", 0.0 ),                OSR_GDV( papszNV, "y_0", 0.0 ) );    }    else if( EQUAL(pszProj,"utm") )    {        SetUTM( (int) OSR_GDV( papszNV, "zone", 0.0 ),                (int) OSR_GDV( papszNV, "south", 1.0 ) );    }    else if( EQUAL(pszProj,"merc") /* 2SP form */             && OSR_GDV(papszNV, "lat_ts", 1000.0) < 999.0 )    {        SetMercator2SP( OSR_GDV( papszNV, "lat_ts", 0.0 ),                         0.0,                        OSR_GDV( papszNV, "lon_0", 0.0 ) + dfFromGreenwich,                         OSR_GDV( papszNV, "x_0", 0.0 ),                         OSR_GDV( papszNV, "y_0", 0.0 ) );    }    else if( EQUAL(pszProj,"merc") ) /* 1SP form */    {        SetMercator( 0.0,                     OSR_GDV( papszNV, "lon_0", 0.0 ) + dfFromGreenwich,                      OSR_GDV( papszNV, "k", 1.0 ),                      OSR_GDV( papszNV, "x_0", 0.0 ),                      OSR_GDV( papszNV, "y_0", 0.0 ) );    }    else if( EQUAL(pszProj,"stere")              && ABS(OSR_GDV( papszNV, "lat_0", 0.0 ) - 90) < 0.001 )    {        SetPS( OSR_GDV( papszNV, "lat_ts", 90.0 ),                OSR_GDV( papszNV, "lon_0", 0.0 ) + dfFromGreenwich,                OSR_GDV( papszNV, "k", 1.0 ),                OSR_GDV( papszNV, "x_0", 0.0 ),                OSR_GDV( papszNV, "y_0", 0.0 ) );    }    else if( EQUAL(pszProj,"stere")              && ABS(OSR_GDV( papszNV, "lat_0", 0.0 ) + 90) < 0.001 )    {        SetPS( OSR_GDV( papszNV, "lat_ts", -90.0 ),                OSR_GDV( papszNV, "lon_0", 0.0 ) + dfFromGreenwich,                OSR_GDV( papszNV, "k", 1.0 ),                OSR_GDV( papszNV, "x_0", 0.0 ),                OSR_GDV( papszNV, "y_0", 0.0 ) );    }    else if( EQUALN(pszProj,"stere",5) /* mostly sterea */             && CSLFetchNameValue(papszNV,"k") != NULL )    {        SetOS( OSR_GDV( papszNV, "lat_0", 0.0 ),                OSR_GDV( papszNV, "lon_0", 0.0 ) + dfFromGreenwich,                OSR_GDV( papszNV, "k", 1.0 ),                OSR_GDV( papszNV, "x_0", 0.0 ),                OSR_GDV( papszNV, "y_0", 0.0 ) );    }    else if( EQUAL(pszProj,"stere") )

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -