📄 ogr_srs_proj4.cpp
字号:
} 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 + -