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