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

📄 ogr_srs_proj4.cpp

📁 在linux环境下
💻 CPP
📖 第 1 页 / 共 4 页
字号:
        }                if( dfSemiMinor == -1.0 && dfInvFlattening == -1.0 )        {            CPLDebug( "OGR_PROJ4", "Can't find ellipse definition in:\n%s",                       pszProj4 );            CSLDestroy( papszNV );            return OGRERR_UNSUPPORTED_SRS;        }        if( dfInvFlattening == -1.0 )        {            if( ABS(dfSemiMajor/dfSemiMinor) - 1.0 < 0.0000000000001 )                dfInvFlattening = 0.0;            else                dfInvFlattening = -1.0 / (dfSemiMinor/dfSemiMajor - 1.0);        }                SetGeogCS( "unnamed ellipse", "unknown", "unnamed",                   dfSemiMajor, dfInvFlattening,                   pszPM, dfFromGreenwich );                bFullyDefined = TRUE;    }/* -------------------------------------------------------------------- *//*      Handle TOWGS84 conversion.                                      *//* -------------------------------------------------------------------- */    pszValue = CSLFetchNameValue(papszNV, "towgs84");    if(pszValue!=NULL)    {        char **papszToWGS84 = CSLTokenizeStringComplex( pszValue, ",",                                                         FALSE, TRUE );        if( CSLCount(papszToWGS84) >= 7 )            SetTOWGS84( atof(papszToWGS84[0]),                         atof(papszToWGS84[1]),                         atof(papszToWGS84[2]),                         atof(papszToWGS84[3]),                         atof(papszToWGS84[4]),                         atof(papszToWGS84[5]),                         atof(papszToWGS84[6]) );        else if( CSLCount(papszToWGS84) >= 3 )            SetTOWGS84( atof(papszToWGS84[0]),                         atof(papszToWGS84[1]),                         atof(papszToWGS84[2]) );        else            CPLError( CE_Warning, CPLE_AppDefined,                       "Seemingly corrupt +towgs84 option (%s), ignoring.",                       pszValue );                                CSLDestroy(papszToWGS84);    }/* -------------------------------------------------------------------- *//*      Linear units translation                                        *//* -------------------------------------------------------------------- */    if( IsProjected() || IsLocal() )    {        pszValue = CSLFetchNameValue(papszNV, "to_meter");        if( pszValue != NULL && atof(pszValue) > 0.0 )        {            SetLinearUnits( "unknown", atof(pszValue) );        }        else if( (pszValue = CSLFetchNameValue(papszNV, "units")) != NULL )        {            if( EQUAL(pszValue,"meter" ) || EQUAL(pszValue,"m") )                SetLinearUnits( SRS_UL_METER, 1.0 );            else if( EQUAL(pszValue,"us-ft" ) )                SetLinearUnits( SRS_UL_US_FOOT, atof(SRS_UL_US_FOOT_CONV) );            else if( EQUAL(pszValue,"ft" ) )                SetLinearUnits( SRS_UL_FOOT, atof(SRS_UL_FOOT_CONV) );            else if( EQUAL(pszValue,"yd" ) )                SetLinearUnits( pszValue, 0.9144 );            else if( EQUAL(pszValue,"us-yd" ) )                SetLinearUnits( pszValue, 0.914401828803658 );            else // This case is untranslatable.  Should add all proj.4 unts                SetLinearUnits( pszValue, 1.0 );        }    }/* -------------------------------------------------------------------- *//*      Adjust linear parameters into PROJCS units if the linear        *//*      units are not meters.                                           *//* -------------------------------------------------------------------- */    if( GetLinearUnits() != 1.0 && IsProjected() )    {        OGR_SRSNode *poPROJCS = GetAttrNode( "PROJCS" );        int  i;        for( i = 0; i < poPROJCS->GetChildCount(); i++ )        {            OGR_SRSNode *poParm = poPROJCS->GetChild(i);            if( !EQUAL(poParm->GetValue(),"PARAMETER")                 || poParm->GetChildCount() != 2 )                continue;            const char *pszParmName = poParm->GetChild(0)->GetValue();            if( IsLinearParameter(pszParmName) )                SetNormProjParm(pszParmName,GetProjParm(pszParmName));        }            }            CSLDestroy( papszNV );        return OGRERR_NONE;}/************************************************************************//*                          OSRExportToProj4()                          *//************************************************************************/OGRErr OSRExportToProj4( OGRSpatialReferenceH hSRS, char ** ppszReturn ){    *ppszReturn = NULL;    return ((OGRSpatialReference *) hSRS)->exportToProj4( ppszReturn );}/************************************************************************//*                           exportToProj4()                            *//************************************************************************//** * Export coordinate system in PROJ.4 format. * * Converts the loaded coordinate reference system into PROJ.4 format * to the extent possible.  The string returned in ppszProj4 should be * deallocated by the caller with CPLFree() when no longer needed. * * LOCAL_CS coordinate systems are not translatable.  An empty string * will be returned along with OGRERR_NONE.   * * This method is the equivelent of the C function OSRExportToProj4(). * * @param ppszProj4 pointer to which dynamically allocated PROJ.4 definition  * will be assigned.  * * @return OGRERR_NONE on success or an error code on failure.  */OGRErr OGRSpatialReference::exportToProj4( char ** ppszProj4 ) const{    char        szProj4[512];    const char *pszProjection = GetAttrValue("PROJECTION");    szProj4[0] = '\0';/* -------------------------------------------------------------------- *//*      Get the prime meridian info.                                    *//* -------------------------------------------------------------------- */    const OGR_SRSNode *poPRIMEM = GetAttrNode( "PRIMEM" );    double dfFromGreenwich = 0.0;    if( poPRIMEM != NULL && poPRIMEM->GetChildCount() >= 2         && atof(poPRIMEM->GetChild(1)->GetValue()) != 0.0 )    {        dfFromGreenwich = atof(poPRIMEM->GetChild(1)->GetValue());    }/* ==================================================================== *//*      Handle the projection definition.                               *//* ==================================================================== */    if( IsLocal() )    {        /* LOCAL_CS (NonEarth): return an empty PROJ4 string */        *ppszProj4 = CPLStrdup("");        return OGRERR_NONE;    }    else if( pszProjection == NULL )    {        sprintf( szProj4+strlen(szProj4), "+proj=longlat " );    }    else if( EQUAL(pszProjection,SRS_PT_CYLINDRICAL_EQUAL_AREA) )    {        sprintf( szProj4+strlen(szProj4),           "+proj=cea +lon_0=%.16g +lat_ts=%.16g +x_0=%.16g +y_0=%.16g ",                 GetNormProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0),                 GetNormProjParm(SRS_PP_STANDARD_PARALLEL_1,0.0),                 GetNormProjParm(SRS_PP_FALSE_EASTING,0.0),                 GetNormProjParm(SRS_PP_FALSE_NORTHING,0.0) );    }    else if( EQUAL(pszProjection,SRS_PT_CASSINI_SOLDNER) )    {        sprintf( szProj4+strlen(szProj4),           "+proj=cass +lat_0=%.16g +lon_0=%.16g +x_0=%.16g +y_0=%.16g ",                 GetNormProjParm(SRS_PP_LATITUDE_OF_ORIGIN,0.0),                 GetNormProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0),                 GetNormProjParm(SRS_PP_FALSE_EASTING,0.0),                 GetNormProjParm(SRS_PP_FALSE_NORTHING,0.0) );    }    else if( EQUAL(pszProjection,SRS_PT_NEW_ZEALAND_MAP_GRID) )    {        sprintf( szProj4+strlen(szProj4),                 "+proj=nzmg +lat_0=%.16g +lon_0=%.16g +x_0=%.16g +y_0=%.16g ",                 GetNormProjParm(SRS_PP_LATITUDE_OF_ORIGIN,0.0),                 GetNormProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0),                 GetNormProjParm(SRS_PP_FALSE_EASTING,0.0),                 GetNormProjParm(SRS_PP_FALSE_NORTHING,0.0) );    }    else if( EQUAL(pszProjection,SRS_PT_TRANSVERSE_MERCATOR) )    {        int bNorth;        int nZone = GetUTMZone( &bNorth );        if( nZone != 0 )        {            if( bNorth )                sprintf( szProj4+strlen(szProj4), "+proj=utm +zone=%d ",                          nZone );            else                sprintf( szProj4+strlen(szProj4),"+proj=utm +zone=%d +south ",                          nZone );        }                    else            sprintf( szProj4+strlen(szProj4),             "+proj=tmerc +lat_0=%.16g +lon_0=%.16g +k=%f +x_0=%.16g +y_0=%.16g ",                 GetNormProjParm(SRS_PP_LATITUDE_OF_ORIGIN,0.0),                 GetNormProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0),                 GetNormProjParm(SRS_PP_SCALE_FACTOR,1.0),                 GetNormProjParm(SRS_PP_FALSE_EASTING,0.0),                 GetNormProjParm(SRS_PP_FALSE_NORTHING,0.0) );    }    else if( EQUAL(pszProjection,SRS_PT_MERCATOR_1SP) )    {        sprintf( szProj4+strlen(szProj4),           "+proj=merc +lat_ts=%.16g +lon_0=%.16g +k=%f +x_0=%.16g +y_0=%.16g ",                 GetNormProjParm(SRS_PP_LATITUDE_OF_ORIGIN,0.0),                 GetNormProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0),                 GetNormProjParm(SRS_PP_SCALE_FACTOR,1.0),                 GetNormProjParm(SRS_PP_FALSE_EASTING,0.0),                 GetNormProjParm(SRS_PP_FALSE_NORTHING,0.0) );    }    else if( EQUAL(pszProjection,SRS_PT_OBLIQUE_STEREOGRAPHIC) )    {        sprintf( szProj4+strlen(szProj4),           "+proj=stere +lat_0=%.16g +lon_0=%.16g +k=%f +x_0=%.16g +y_0=%.16g ",                 GetNormProjParm(SRS_PP_LATITUDE_OF_ORIGIN,0.0),                 GetNormProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0),                 GetNormProjParm(SRS_PP_SCALE_FACTOR,1.0),                 GetNormProjParm(SRS_PP_FALSE_EASTING,0.0),                 GetNormProjParm(SRS_PP_FALSE_NORTHING,0.0) );    }    else if( EQUAL(pszProjection,SRS_PT_STEREOGRAPHIC) )    {        sprintf( szProj4+strlen(szProj4),           "+proj=stere +lat_0=%.16g +lon_0=%.16g +x_0=%.16g +y_0=%.16g ",                 GetNormProjParm(SRS_PP_LATITUDE_OF_ORIGIN,0.0),                 GetNormProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0),                 GetNormProjParm(SRS_PP_FALSE_EASTING,0.0),                 GetNormProjParm(SRS_PP_FALSE_NORTHING,0.0) );    }    else if( EQUAL(pszProjection,SRS_PT_POLAR_STEREOGRAPHIC) )    {        if( GetNormProjParm(SRS_PP_LATITUDE_OF_ORIGIN,0.0) >= 0.0 )            sprintf( szProj4+strlen(szProj4),                     "+proj=stere +lat_0=90 +lat_ts=%.16g +lon_0=%.16g "                     "+k=%.16g +x_0=%.16g +y_0=%.16g ",                     GetNormProjParm(SRS_PP_LATITUDE_OF_ORIGIN,90.0),                     GetNormProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0),                     GetNormProjParm(SRS_PP_SCALE_FACTOR,1.0),                     GetNormProjParm(SRS_PP_FALSE_EASTING,0.0),                     GetNormProjParm(SRS_PP_FALSE_NORTHING,0.0) );        else            sprintf( szProj4+strlen(szProj4),                     "+proj=stere +lat_0=-90 +lat_ts=%.16g +lon_0=%.16g "                     "+k=%.16g +x_0=%.16g +y_0=%.16g ",                     GetNormProjParm(SRS_PP_LATITUDE_OF_ORIGIN,-90.0),                     GetNormProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0),                     GetNormProjParm(SRS_PP_SCALE_FACTOR,1.0),                     GetNormProjParm(SRS_PP_FALSE_EASTING,0.0),                     GetNormProjParm(SRS_PP_FALSE_NORTHING,0.0) );    }    else if( EQUAL(pszProjection,SRS_PT_EQUIRECTANGULAR) )    {        sprintf( szProj4+strlen(szProj4),                 "+proj=eqc +lat_ts=%.16g +lon_0=%.16g +x_0=%.16g +y_0=%.16g ",                 GetNormProjParm(SRS_PP_LATITUDE_OF_ORIGIN,0.0),                 GetNormProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0),                 GetNormProjParm(SRS_PP_FALSE_EASTING,0.0),                 GetNormProjParm(SRS_PP_FALSE_NORTHING,0.0) );    }    else if( EQUAL(pszProjection,SRS_PT_GNOMONIC) )    {        sprintf( szProj4+strlen(szProj4),                 "+proj=gnom +lat_0=%.16g +lon_0=%.16g +x_0=%.16g +y_0=%.16g ",                 GetNormProjParm(SRS_PP_LATITUDE_OF_ORIGIN,0.0),                 GetNormProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0),                 GetNormProjParm(SRS_PP_FALSE_EASTING,0.0),                 GetNormProjParm(SRS_PP_FALSE_NORTHING,0.0) );    }    else if( EQUAL(pszProjection,SRS_PT_ORTHOGRAPHIC) )    {        sprintf( szProj4+strlen(szProj4),                 "+proj=ortho +lat_0=%.16g +lon_0=%.16g +x_0=%.16g +y_0=%.16g ",                 GetNormProjParm(SRS_PP_LATITUDE_OF_ORIGIN,0.0),                 GetNormProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0),                 GetNormProjParm(SRS_PP_FALSE_EASTING,0.0),                 GetNormProjParm(SRS_PP_FALSE_NORTHING,0.0) );    }    else if( EQUAL(pszProjection,SRS_PT_LAMBERT_AZIMUTHAL_EQUAL_AREA) )    {        sprintf( szProj4+strlen(szProj4),                 "+proj=laea +lat_0=%.16g +lon_0=%.16g +x_0=%.16g +y_0=%.16g ",                 GetNormProjParm(SRS_PP_LATITUDE_OF_ORIGIN,0.0),                 GetNormProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0),                 GetNormProjParm(SRS_PP_FALSE_EASTING,0.0),                 GetNormProjParm(SRS_PP_FALSE_NORTHING,0.0) );    }    else if( EQUAL(pszProjection,SRS_PT_AZIMUTHAL_EQUIDISTANT) )    {        sprintf( szProj4+strlen(szProj4),                 "+proj=aeqd +lat_0=%.16g +lon_0=%.16g +x_0=%.16g +y_0=%.16g ",                 GetNormProjParm(SRS_PP_LATITUDE_OF_ORIGIN,0.0),                 GetNormProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0),                 GetNormProjParm(SRS_PP_FALSE_EASTING,0.0),                 GetNormProjParm(SRS_PP_FALSE_NORTHING,0.0) );    }    else if( EQUAL(pszProjection,SRS_PT_EQUIDISTANT_CONIC) )    {        sprintf( szProj4+strlen(szProj4),                 "+proj=eqdc +lat_0=%.16g +lon_0=%.16g +lat_1=%.16g +lat_2=%.16g"                 " +x_0=%.16g +y_0=%.16g ",                 GetNormProjParm(SRS_PP_LATITUDE_OF_CENTER,0.0),                 GetNormProjParm(SRS_PP_LONGITUDE_OF_CENTER,0.0),                 GetNormProjParm(SRS_PP_STANDARD_PARALLEL_1,0.0),                 GetNormProjParm(SRS_PP_STANDARD_PARALLEL_2,0.0),                 GetNormProjParm(SRS_PP_FALSE_EASTING,0.0),                 GetNormProjParm(SRS_PP_FALSE_NORTHING,0.0) );    }    else if( EQUAL(pszProjection,SRS_PT_MILLER_CYLINDRICAL) )    {        sprintf( szProj4+strlen(szProj4),                "+proj=mill +lat_0=%.16g +lon_0=%.16g +x_0=%.16g +y_0=%.16g +R_A ",                 GetNormProjParm(SRS_PP_LATITUDE_OF_ORIGIN,0.0),                 GetNormProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0),                 GetNormProjParm(SRS_PP_FALSE_EASTING,0.0),                 GetNormProjParm(SRS_PP_FALSE_NORTHING,0.0) );    }    else if( EQUAL(pszProjection,SRS_PT_MOLLWEIDE) )    {        sprintf( szProj4+strlen(szProj4),                 "+proj=moll +lon_0=%.16g +x_0=%.16g +y_0=%.16g ",                 GetNormProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0),                 GetNormProjParm(SRS_PP_FALSE_EASTING,0.0),                 GetNormProjParm(SRS_PP_FALSE_NORTHING,0.0) );    }    else if( EQUAL(pszProjection,SRS_PT_ECKERT_IV) )    {        sprintf( szProj4+strlen(szProj4),                 "+proj=eck4 +lon_0=%.16g +x_0=%.16g +y_0=%.16g ",                 GetNormProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0),                 GetNormProjParm(SRS_PP_FALSE_EASTING,0.0),                 GetNormProjParm(SRS_PP_FALSE_NORTHING,0.0) );    }    else if( EQUAL(pszProjection,SRS_PT_ECKERT_VI) )    {        sprintf( szProj4+strlen(szProj4),                 "+proj=eck6 +lon_0=%.16g +x_0=%.16g +y_0=%.16g ",                 GetNormProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0),                 GetNormProjParm(SRS_PP_FALSE_EASTING,0.0),                 GetNormProjParm(SRS_PP_FALSE_NORTHING,0.0) );    }    else if( EQUAL(pszProjection,SRS_PT_POLYCONIC) )    {        sprintf( szProj4+strlen(szProj4),                 "+proj=poly +lat_0=%.16g +lon_0=%.16g +x_0=%.16g +y_0=%.16g ",                 GetNormProjParm(SRS_PP_LATITUDE_OF_ORIGIN,0.0),                 GetNormProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0),                 GetNormProjParm(SRS_PP_FALSE_EASTING,0.0),                 GetNormProjParm(SRS_PP_FALSE_NORTHING,0.0) );    }    else if( EQUAL(pszProjection,SRS_PT_ALBERS_CONIC_EQUAL_AREA) )    {        sprintf( szProj4+strlen(szProj4),                 "+proj=aea +lat_1=%.16g +lat_2=%.16g +lat_0=%.16g +lon_0=%.16g"                 " +x_0=%.16g +y_0=%.16g ",                 GetNormProjParm(SRS_PP_STANDARD_PARALLEL_1,0.0),                 GetNormProjParm(SRS_PP_STANDARD_PARALLEL_2,0.0),                 GetNormProjParm(SRS_PP_LATITUDE_OF_ORIGIN,0.0),                 GetNormProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0),                 GetNormProjParm(SRS_PP_FALSE_EASTING,0.0),                 GetNormProjParm(SRS_PP_FALSE_NORTHING,0.0) );    }

⌨️ 快捷键说明

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