📄 ogr_srs_proj4.cpp
字号:
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)); } }/* -------------------------------------------------------------------- *//* do we want to insert a PROJ.4 EXTENSION item? *//* -------------------------------------------------------------------- */ if( strstr(pszProj4,"wktext") != NULL ) SetExtension( GetRoot()->GetValue(), "PROJ4", pszProj4 ); CSLDestroy( papszNV ); return OGRERR_NONE;}/************************************************************************//* OSRExportToProj4() *//************************************************************************/OGRErr CPL_STDCALL 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';/* -------------------------------------------------------------------- *//* Do we have a PROJ.4 override definition? *//* -------------------------------------------------------------------- */ const char *pszPredefProj4 = GetExtension( GetRoot()->GetValue(), "PROJ4", NULL ); if( pszPredefProj4 != NULL ) { *ppszProj4 = CPLStrdup( pszPredefProj4 ); return OGRERR_NONE; }/* -------------------------------------------------------------------- *//* 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( pszProjection == NULL && IsGeographic() ) { sprintf( szProj4+strlen(szProj4), "+proj=longlat " ); } else if( pszProjection == NULL && !IsGeographic() ) { // LOCAL_CS, or incompletely initialized coordinate systems. *ppszProj4 = CPLStrdup(""); return OGRERR_NONE; } 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_BONNE) ) { sprintf( szProj4+strlen(szProj4), "+proj=bonne +lon_0=%.16g +lat_1=%.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) || EQUAL(pszProjection,SRS_PT_TRANSVERSE_MERCATOR_MI_21) || EQUAL(pszProjection,SRS_PT_TRANSVERSE_MERCATOR_MI_22) || EQUAL(pszProjection,SRS_PT_TRANSVERSE_MERCATOR_MI_23) || EQUAL(pszProjection,SRS_PT_TRANSVERSE_MERCATOR_MI_24) || EQUAL(pszProjection,SRS_PT_TRANSVERSE_MERCATOR_MI_25) ) { 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 +lon_0=%.16g +k=%f +x_0=%.16g +y_0=%.16g ", 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_2SP) ) { sprintf( szProj4+strlen(szProj4), "+proj=merc +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_OBLIQUE_STEREOGRAPHIC) ) { sprintf( szProj4+strlen(szProj4), "+proj=sterea +lat_0=%.16g +lon_0=%.16g +k=%f +x_0=%.16g +y_0=%.16g ",// "+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 +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_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),
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -