105
105
{ "OSGB36", "OSGB_1936", 4277, 6277}
110
const char* pszProj4PMName;
111
const char* pszWKTPMName;
112
const char* pszFromGreenwich;
116
/* Derived from pj_datums.c */
117
static const OGRProj4PM ogr_pj_pms [] = {
118
{ "greenwich", "Greenwich", "0dE", 8901 },
119
{ "lisbon", "Lisbon", "9d07'54.862\"W", 8902 },
120
{ "paris", "Paris", "2d20'14.025\"E", 8903 },
121
{ "bogota", "Bogota", "74d04'51.3\"W", 8904 },
122
{ "madrid", "Madrid", "3d41'16.58\"W", 8905 },
123
{ "rome", "Rome", "12d27'8.4\"E", 8906 },
124
{ "bern", "Bern", "7d26'22.5\"E", 8907 },
125
{ "jakarta", "Jakarta", "106d48'27.79\"E", 8908 },
126
{ "ferro", "Ferro", "17d40'W", 8909 },
127
{ "brussels", "Brussels", "4d22'4.71\"E", 8910 },
128
{ "stockholm", "Stockholm", "18d3'29.8\"E", 8911 },
129
{ "athens", "Athens", "23d42'58.815\"E", 8912 },
130
{ "oslo", "Oslo", "10d43'22.5\"E", 8913 }
108
133
static const char* OGRGetProj4Datum(const char* pszDatum,
361
425
if( pszPM != NULL )
363
if( EQUAL(pszPM,"lisbon") )
365
dfFromGreenwich = CPLDMSToDec( "9d07'54.862\"W" );
368
else if( EQUAL(pszPM,"paris") )
370
dfFromGreenwich = CPLDMSToDec( "2d20'14.025\"E" );
373
else if( EQUAL(pszPM,"bogota") )
375
dfFromGreenwich = CPLDMSToDec( "74d04'51.3\"W" );
378
else if( EQUAL(pszPM,"madrid") )
380
dfFromGreenwich = CPLDMSToDec( "3d41'16.48\"W" );
383
else if( EQUAL(pszPM,"rome") )
385
dfFromGreenwich = CPLDMSToDec( "12d27'8.4\"E" );
388
else if( EQUAL(pszPM,"bern") )
390
dfFromGreenwich = CPLDMSToDec( "7d26'22.5\"E" );
393
else if( EQUAL(pszPM,"jakarta") )
395
dfFromGreenwich = CPLDMSToDec( "106d48'27.79\"E" );
398
else if( EQUAL(pszPM,"ferro") )
400
dfFromGreenwich = CPLDMSToDec( "17d40'W" );
403
else if( EQUAL(pszPM,"brussels") )
405
dfFromGreenwich = CPLDMSToDec( "4d22'4.71\"E" );
408
else if( EQUAL(pszPM,"stockholm") )
410
dfFromGreenwich = CPLDMSToDec( "18d3'29.8\"E" );
413
else if( EQUAL(pszPM,"athens") )
415
dfFromGreenwich = CPLDMSToDec( "23d42'58.815\"E" );
418
else if( EQUAL(pszPM,"oslo") )
420
dfFromGreenwich = CPLDMSToDec( "10d43'22.5\"E" );
427
const OGRProj4PM* psProj4PM = OGRGetProj4PMFromProj4Name(pszPM);
430
dfFromGreenwich = CPLDMSToDec(psProj4PM->pszFromGreenwich);
431
pszPM = psProj4PM->pszWKTPMName;
432
nPMCode = psProj4PM->nPMCode;
480
496
else if( EQUAL(pszProj,"tmerc") )
482
SetTM( OSR_GDV( papszNV, "lat_0", 0.0 ),
483
OSR_GDV( papszNV, "lon_0", 0.0 ),
484
OSR_GDV( papszNV, "k", 1.0 ),
485
OSR_GDV( papszNV, "x_0", 0.0 ),
486
OSR_GDV( papszNV, "y_0", 0.0 ) );
498
const char *pszAxis = CSLFetchNameValue( papszNV, "axis" );
500
if( pszAxis == NULL || !EQUAL(pszAxis,"wsu") )
501
SetTM( OSR_GDV( papszNV, "lat_0", 0.0 ),
502
OSR_GDV( papszNV, "lon_0", 0.0 ),
503
OSR_GDV( papszNV, "k", 1.0 ),
504
OSR_GDV( papszNV, "x_0", 0.0 ),
505
OSR_GDV( papszNV, "y_0", 0.0 ) );
507
SetTMSO( OSR_GDV( papszNV, "lat_0", 0.0 ),
508
OSR_GDV( papszNV, "lon_0", 0.0 ),
509
OSR_GDV( papszNV, "k", 1.0 ),
510
OSR_GDV( papszNV, "x_0", 0.0 ),
511
OSR_GDV( papszNV, "y_0", 0.0 ) );
489
514
else if( EQUAL(pszProj,"utm") )
1095
/* -------------------------------------------------------------------- */
1096
/* Handle geoidgrids via an extension node and COMPD_CS. */
1097
/* -------------------------------------------------------------------- */
1098
pszValue = CSLFetchNameValue(papszNV, "geoidgrids");
1099
if( pszValue != NULL )
1101
OGR_SRSNode *poHorizSRS = GetRoot()->Clone();
1105
CPLString osName = poHorizSRS->GetChild(0)->GetValue();
1107
osName += "Unnamed Vertical Datum";
1109
SetNode( "COMPD_CS", osName );
1110
GetRoot()->AddChild( poHorizSRS );
1112
OGR_SRSNode *poVertSRS;
1114
poVertSRS = new OGR_SRSNode( "VERT_CS" );
1115
GetRoot()->AddChild( poVertSRS );
1116
poVertSRS->AddChild( new OGR_SRSNode( "Unnamed" ) );
1118
CPLString osTarget = GetRoot()->GetValue();
1119
osTarget += "|VERT_CS|VERT_DATUM";
1121
SetNode( osTarget, "Unnamed" );
1123
poVertSRS->GetChild(1)->AddChild( new OGR_SRSNode( "2005" ) );
1124
SetExtension( osTarget, "PROJ4_GRIDS", pszValue );
1126
OGR_SRSNode *poAxis = new OGR_SRSNode( "AXIS" );
1128
poAxis->AddChild( new OGR_SRSNode( "Up" ) );
1129
poAxis->AddChild( new OGR_SRSNode( "UP" ) );
1131
poVertSRS->AddChild( poAxis );
1134
/* -------------------------------------------------------------------- */
1135
/* Handle vertical units. */
1136
/* -------------------------------------------------------------------- */
1137
if( GetRoot()->GetNode( "VERT_CS" ) != NULL )
1139
const char *pszUnitName = NULL;
1140
const char *pszUnitConv = NULL;
1142
pszValue = CSLFetchNameValue(papszNV, "vto_meter");
1144
if( pszValue != NULL && CPLAtofM(pszValue) > 0.0 )
1146
double dfValue = CPLAtofM(pszValue);
1148
if( fabs(dfValue - CPLAtof(SRS_UL_US_FOOT_CONV)) < 0.00000001 )
1150
pszUnitName = SRS_UL_US_FOOT;
1151
pszUnitConv = SRS_UL_US_FOOT_CONV;
1153
else if( fabs(dfValue - CPLAtof(SRS_UL_FOOT_CONV)) < 0.00000001 )
1155
pszUnitName = SRS_UL_FOOT;
1156
pszUnitConv = SRS_UL_FOOT_CONV;
1158
else if( dfValue == 1.0 )
1160
pszUnitName = SRS_UL_METER;
1161
pszUnitConv = "1.0";
1165
pszUnitName = "unknown";
1166
pszUnitConv = pszValue;
1169
else if( (pszValue = CSLFetchNameValue(papszNV, "vunits")) != NULL )
1171
if( EQUAL(pszValue,"meter" ) || EQUAL(pszValue,"m") )
1173
pszUnitName = SRS_UL_METER;
1174
pszUnitConv = "1.0";
1176
else if( EQUAL(pszValue,"us-ft" ) )
1178
pszUnitName = SRS_UL_US_FOOT;
1179
pszUnitConv = SRS_UL_US_FOOT_CONV;
1181
else if( EQUAL(pszValue,"ft" ) )
1183
pszUnitName = SRS_UL_FOOT;
1184
pszUnitConv = SRS_UL_FOOT_CONV;
1186
else if( EQUAL(pszValue,"yd" ) )
1188
pszUnitName = "Yard";
1189
pszUnitConv = "0.9144";
1191
else if( EQUAL(pszValue,"us-yd" ) )
1193
pszUnitName = "US Yard";
1194
pszUnitConv = "0.914401828803658";
1198
if( pszUnitName != NULL )
1200
OGR_SRSNode *poVERT_CS = GetRoot()->GetNode( "VERT_CS" );
1201
OGR_SRSNode *poUnits;
1203
poUnits = new OGR_SRSNode( "UNIT" );
1204
poUnits->AddChild( new OGR_SRSNode( pszUnitName ) );
1205
poUnits->AddChild( new OGR_SRSNode( pszUnitConv ) );
1207
poVERT_CS->AddChild( poUnits );
1050
1211
/* -------------------------------------------------------------------- */
1051
1212
/* do we want to insert a PROJ.4 EXTENSION item? */
1058
1219
return OGRERR_NONE;
1222
/************************************************************************/
1223
/* LinearToProj4() */
1224
/************************************************************************/
1226
static const char *LinearToProj4( double dfLinearConv,
1227
const char *pszLinearUnits )
1230
if( dfLinearConv == 1.0 )
1233
else if( dfLinearConv == 1000.0 )
1236
else if( dfLinearConv == 0.0254 )
1239
else if( EQUAL(pszLinearUnits,SRS_UL_FOOT)
1240
|| fabs(dfLinearConv - atof(SRS_UL_FOOT_CONV)) < 0.000000001 )
1243
else if( EQUAL(pszLinearUnits,"IYARD") || dfLinearConv == 0.9144 )
1246
else if( dfLinearConv == 0.914401828803658 )
1249
else if( dfLinearConv == 0.001 )
1252
else if( dfLinearConv == 0.01 )
1255
else if( EQUAL(pszLinearUnits,SRS_UL_US_FOOT)
1256
|| fabs(dfLinearConv - atof(SRS_UL_US_FOOT_CONV)) < 0.00000001 )
1259
else if( EQUAL(pszLinearUnits,SRS_UL_NAUTICAL_MILE) )
1262
else if( EQUAL(pszLinearUnits,"Mile")
1263
|| EQUAL(pszLinearUnits,"IMILE") )
1062
1270
/************************************************************************/
1063
1271
/* OSRExportToProj4() */
1217
1437
sprintf( szProj4+strlen(szProj4),
1218
"+proj=tmerc +lat_0=%.16g +lon_0=%.16g +k=%.16g +x_0=%.16g +y_0=%.16g ",
1438
"+proj=tmerc +lat_0=%.16g +lon_0=%.16g +k=%.16g +x_0=%.16g +y_0=%.16g ",
1439
GetNormProjParm(SRS_PP_LATITUDE_OF_ORIGIN,0.0),
1440
GetNormProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0),
1441
GetNormProjParm(SRS_PP_SCALE_FACTOR,1.0),
1442
GetNormProjParm(SRS_PP_FALSE_EASTING,0.0),
1443
GetNormProjParm(SRS_PP_FALSE_NORTHING,0.0) );
1446
else if( EQUAL(pszProjection,SRS_PT_TRANSVERSE_MERCATOR_SOUTH_ORIENTED) )
1448
sprintf( szProj4+strlen(szProj4),
1449
"+proj=tmerc +lat_0=%.16g +lon_0=%.16g +k=%.16g +x_0=%.16g +y_0=%.16g +axis=wsu ",
1219
1450
GetNormProjParm(SRS_PP_LATITUDE_OF_ORIGIN,0.0),
1220
1451
GetNormProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0),
1221
1452
GetNormProjParm(SRS_PP_SCALE_FACTOR,1.0),
1317
1548
else if( EQUAL(pszProjection,SRS_PT_GAUSSSCHREIBERTMERCATOR) )
1319
sprintf( szProj4+strlen(szProj4),
1320
"+proj=gstmerc +lat_0=%.16g +lon_0=%.16g"
1321
" +k_0=%.16g +x_0=%.16g +y_0=%.16g ",
1322
GetNormProjParm(SRS_PP_LATITUDE_OF_ORIGIN,-21.116666667),
1323
GetNormProjParm(SRS_PP_CENTRAL_MERIDIAN,55.53333333309),
1324
GetNormProjParm(SRS_PP_SCALE_FACTOR,1.0),
1325
GetNormProjParm(SRS_PP_FALSE_EASTING,160000.000),
1326
GetNormProjParm(SRS_PP_FALSE_NORTHING,50000.000) );
1550
sprintf( szProj4+strlen(szProj4),
1551
"+proj=gstmerc +lat_0=%.16g +lon_0=%.16g"
1552
" +k_0=%.16g +x_0=%.16g +y_0=%.16g ",
1553
GetNormProjParm(SRS_PP_LATITUDE_OF_ORIGIN,-21.116666667),
1554
GetNormProjParm(SRS_PP_CENTRAL_MERIDIAN,55.53333333309),
1555
GetNormProjParm(SRS_PP_SCALE_FACTOR,1.0),
1556
GetNormProjParm(SRS_PP_FALSE_EASTING,160000.000),
1557
GetNormProjParm(SRS_PP_FALSE_NORTHING,50000.000) );
1329
1560
else if( EQUAL(pszProjection,SRS_PT_GNOMONIC) )
1824
2064
pszPROJ4Ellipse = "WGS84";
1826
else if( EQUAL(pszDatum,"North_American_Datum_1927") )
2066
else if( pszDatum != NULL && EQUAL(pszDatum,"North_American_Datum_1927") )
1828
2068
// pszPROJ4Ellipse = "clrk66:+datum=nad27"; /* NAD 27 */
1829
2069
pszPROJ4Ellipse = "clrk66";
1831
else if( EQUAL(pszDatum,"North_American_Datum_1983") )
2071
else if( pszDatum != NULL && EQUAL(pszDatum,"North_American_Datum_1983") )
1833
2073
// pszPROJ4Ellipse = "GRS80:+datum=nad83"; /* NAD 83 */
1834
2074
pszPROJ4Ellipse = "GRS80";
2077
char szEllipseDef[128];
1837
2079
if( pszPROJ4Ellipse == NULL )
1838
sprintf( szProj4+strlen(szProj4), "+a=%.16g +b=%.16g ",
2080
sprintf( szEllipseDef, "+a=%.16g +b=%.16g ",
1839
2081
GetSemiMajor(), GetSemiMinor() );
1841
sprintf( szProj4+strlen(szProj4), "+ellps=%s ",
2083
sprintf( szEllipseDef, "+ellps=%s ",
1842
2084
pszPROJ4Ellipse );
1844
2086
/* -------------------------------------------------------------------- */
1868
2111
else if( EQUAL(pszDatum,SRS_DN_NAD27) || nEPSGDatum == 6267 )
1869
pszPROJ4Datum = "+datum=NAD27";
2112
pszPROJ4Datum = "NAD27";
1871
2114
else if( EQUAL(pszDatum,SRS_DN_NAD83) || nEPSGDatum == 6269 )
1872
pszPROJ4Datum = "+datum=NAD83";
2115
pszPROJ4Datum = "NAD83";
1874
2117
else if( EQUAL(pszDatum,SRS_DN_WGS84) || nEPSGDatum == 6326 )
1875
pszPROJ4Datum = "+datum=WGS84";
2118
pszPROJ4Datum = "WGS84";
1877
2120
else if( (pszPROJ4Datum = OGRGetProj4Datum(pszDatum, nEPSGDatum)) != NULL )
1879
strcat( szProj4, "+datum=" );
1880
/* The datum name contained in pszPROJ4Datum will be appended below */
1883
else if( poTOWGS84 != NULL )
1885
int bOverflow = FALSE;
1887
for(iChild=0;iChild<poTOWGS84->GetChildCount() && !bOverflow;iChild++)
2125
if( pszProj4Grids != NULL )
2127
SAFE_PROJ4_STRCAT( szEllipseDef );
2128
szEllipseDef[0] = '\0';
2129
SAFE_PROJ4_STRCAT( "+nadgrids=" );
2130
SAFE_PROJ4_STRCAT( pszProj4Grids );
2131
SAFE_PROJ4_STRCAT( " " );
2132
pszPROJ4Datum = NULL;
2135
if( pszPROJ4Datum == NULL
2136
|| CSLTestBoolean(CPLGetConfigOption("OVERRIDE_PROJ_DATUM_WITH_TOWGS84", "YES")) )
2138
if( poTOWGS84 != NULL )
1889
if (strlen(poTOWGS84->GetChild(iChild)->GetValue()) > 24)
2141
if( poTOWGS84->GetChildCount() >= 3
2142
&& (poTOWGS84->GetChildCount() < 7
2143
|| (EQUAL(poTOWGS84->GetChild(3)->GetValue(),"")
2144
&& EQUAL(poTOWGS84->GetChild(4)->GetValue(),"")
2145
&& EQUAL(poTOWGS84->GetChild(5)->GetValue(),"")
2146
&& EQUAL(poTOWGS84->GetChild(6)->GetValue(),""))) )
2148
SAFE_PROJ4_STRCAT( szEllipseDef );
2149
szEllipseDef[0] = '\0';
2150
SAFE_PROJ4_STRCAT( "+towgs84=");
2151
for(iChild = 0; iChild < 3; iChild ++)
2153
if (iChild > 0 ) SAFE_PROJ4_STRCAT( "," );
2154
SAFE_PROJ4_STRCAT( poTOWGS84->GetChild(iChild)->GetValue() );
2156
SAFE_PROJ4_STRCAT( " " );
2157
pszPROJ4Datum = NULL;
2159
else if( poTOWGS84->GetChildCount() >= 7)
2161
SAFE_PROJ4_STRCAT( szEllipseDef );
2162
szEllipseDef[0] = '\0';
2163
SAFE_PROJ4_STRCAT( "+towgs84=");
2164
for(iChild = 0; iChild < 7; iChild ++)
2166
if (iChild > 0 ) SAFE_PROJ4_STRCAT( "," );
2167
SAFE_PROJ4_STRCAT( poTOWGS84->GetChild(iChild)->GetValue() );
2169
SAFE_PROJ4_STRCAT( " " );
2170
pszPROJ4Datum = NULL;
1893
if( !bOverflow && poTOWGS84->GetChildCount() > 2
1894
&& (poTOWGS84->GetChildCount() < 6
1895
|| (EQUAL(poTOWGS84->GetChild(3)->GetValue(),"")
1896
&& EQUAL(poTOWGS84->GetChild(4)->GetValue(),"")
1897
&& EQUAL(poTOWGS84->GetChild(5)->GetValue(),"")
1898
&& EQUAL(poTOWGS84->GetChild(6)->GetValue(),""))) )
1900
sprintf( szTOWGS84, "+towgs84=%s,%s,%s",
1901
poTOWGS84->GetChild(0)->GetValue(),
1902
poTOWGS84->GetChild(1)->GetValue(),
1903
poTOWGS84->GetChild(2)->GetValue() );
1904
pszPROJ4Datum = szTOWGS84;
1906
else if( !bOverflow && poTOWGS84->GetChildCount() > 6)
1908
sprintf( szTOWGS84, "+towgs84=%s,%s,%s,%s,%s,%s,%s",
1909
poTOWGS84->GetChild(0)->GetValue(),
1910
poTOWGS84->GetChild(1)->GetValue(),
1911
poTOWGS84->GetChild(2)->GetValue(),
1912
poTOWGS84->GetChild(3)->GetValue(),
1913
poTOWGS84->GetChild(4)->GetValue(),
1914
poTOWGS84->GetChild(5)->GetValue(),
1915
poTOWGS84->GetChild(6)->GetValue() );
1916
pszPROJ4Datum = szTOWGS84;
2174
// If we don't know the datum, trying looking up TOWGS84 parameters
2175
// based on the EPSG GCS code.
2176
else if( nEPSGGeogCS != -1 && pszPROJ4Datum == NULL )
2178
double padfTransform[7];
2179
if( EPSGGetWGS84Transform( nEPSGGeogCS, padfTransform ) )
2181
sprintf( szTOWGS84, "+towgs84=%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g",
2189
SAFE_PROJ4_STRCAT( szEllipseDef );
2190
szEllipseDef[0] = '\0';
1920
else if( nEPSGGeogCS != -1 )
1922
double padfTransform[7];
1923
if( EPSGGetWGS84Transform( nEPSGGeogCS, padfTransform ) )
1925
sprintf( szTOWGS84, "+towgs84=%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g",
1933
pszPROJ4Datum = szTOWGS84;
2192
SAFE_PROJ4_STRCAT( szTOWGS84 );
2193
SAFE_PROJ4_STRCAT( " " );
2194
pszPROJ4Datum = NULL;
1937
2199
if( pszPROJ4Datum != NULL )
1939
strcat( szProj4, pszPROJ4Datum );
1940
strcat( szProj4, " " );
2201
SAFE_PROJ4_STRCAT( "+datum=" );
2202
SAFE_PROJ4_STRCAT( pszPROJ4Datum );
2203
SAFE_PROJ4_STRCAT( " " );
2205
else // The ellipsedef may already have been appended and will now
2206
// be empty, otherwise append now.
2208
SAFE_PROJ4_STRCAT( szEllipseDef );
2209
szEllipseDef[0] = '\0';
1943
2212
/* -------------------------------------------------------------------- */
1953
2222
if( pszAuthority != NULL && EQUAL(pszAuthority,"EPSG") )
1954
2223
nCode = atoi(GetAuthorityCode( "PRIMEM" ));
1959
strcpy( szPMValue, "lisbon" );
1963
strcpy( szPMValue, "paris" );
1967
strcpy( szPMValue, "bogota" );
1971
strcpy( szPMValue, "madrid" );
1975
strcpy( szPMValue, "rome" );
1979
strcpy( szPMValue, "bern" );
1983
strcpy( szPMValue, "jakarta" );
1987
strcpy( szPMValue, "ferro" );
1991
strcpy( szPMValue, "brussels" );
1995
strcpy( szPMValue, "stockholm" );
1999
strcpy( szPMValue, "athens" );
2003
strcpy( szPMValue, "oslo" );
2225
const OGRProj4PM* psProj4PM = NULL;
2227
psProj4PM = OGRGetProj4PMFromCode(nCode);
2228
if (psProj4PM == NULL)
2229
psProj4PM = OGRGetProj4PMFromVal(dfFromGreenwich);
2231
if (psProj4PM != NULL)
2233
strcpy( szPMValue, psProj4PM->pszProj4PMName );
2007
2237
sprintf( szPMValue, "%.16g", dfFromGreenwich );
2010
sprintf( szProj4+strlen(szProj4), "+pm=%s ", szPMValue );
2240
SAFE_PROJ4_STRCAT( "+pm=" );
2241
SAFE_PROJ4_STRCAT( szPMValue );
2242
SAFE_PROJ4_STRCAT( " " );
2013
2245
/* -------------------------------------------------------------------- */
2022
2254
if( strstr(szProj4,"longlat") != NULL )
2023
2255
pszPROJ4Units = NULL;
2025
else if( dfLinearConv == 1.0 )
2026
pszPROJ4Units = "m";
2028
else if( dfLinearConv == 1000.0 )
2029
pszPROJ4Units = "km";
2031
else if( dfLinearConv == 0.0254 )
2032
pszPROJ4Units = "in";
2034
else if( EQUAL(pszLinearUnits,SRS_UL_FOOT)
2035
|| fabs(dfLinearConv - atof(SRS_UL_FOOT_CONV)) < 0.000000001 )
2036
pszPROJ4Units = "ft";
2038
else if( EQUAL(pszLinearUnits,"IYARD") || dfLinearConv == 0.9144 )
2039
pszPROJ4Units = "yd";
2041
else if( dfLinearConv == 0.001 )
2042
pszPROJ4Units = "mm";
2044
else if( dfLinearConv == 0.01 )
2045
pszPROJ4Units = "cm";
2047
else if( EQUAL(pszLinearUnits,SRS_UL_US_FOOT)
2048
|| fabs(dfLinearConv - atof(SRS_UL_US_FOOT_CONV)) < 0.00000001 )
2049
pszPROJ4Units = "us-ft";
2051
else if( EQUAL(pszLinearUnits,SRS_UL_NAUTICAL_MILE) )
2052
pszPROJ4Units = "kmi";
2054
else if( EQUAL(pszLinearUnits,"Mile")
2055
|| EQUAL(pszLinearUnits,"IMILE") )
2056
pszPROJ4Units = "mi";
2060
sprintf( szProj4+strlen(szProj4), "+to_meter=%.16g ",
2258
pszPROJ4Units = LinearToProj4( dfLinearConv, pszLinearUnits );
2260
if( pszPROJ4Units == NULL )
2262
char szLinearConv[128];
2263
sprintf( szLinearConv, "%.16g", dfLinearConv );
2264
SAFE_PROJ4_STRCAT( "+to_meter=" );
2265
SAFE_PROJ4_STRCAT( szLinearConv );
2266
SAFE_PROJ4_STRCAT( " " );
2064
2270
if( pszPROJ4Units != NULL )
2065
sprintf( szProj4+strlen(szProj4), "+units=%s ",
2272
SAFE_PROJ4_STRCAT( "+units=");
2273
SAFE_PROJ4_STRCAT( pszPROJ4Units );
2274
SAFE_PROJ4_STRCAT( " " );
2277
/* -------------------------------------------------------------------- */
2278
/* If we have vertical datum grids, attach them to the proj.4 string.*/
2279
/* -------------------------------------------------------------------- */
2280
const char *pszProj4Geoids = GetExtension( "VERT_DATUM", "PROJ4_GRIDS" );
2282
if( pszProj4Geoids != NULL )
2284
SAFE_PROJ4_STRCAT( "+geoidgrids=" );
2285
SAFE_PROJ4_STRCAT( pszProj4Geoids );
2286
SAFE_PROJ4_STRCAT( " " );
2289
/* -------------------------------------------------------------------- */
2290
/* Handle vertical units, but only if we have them. */
2291
/* -------------------------------------------------------------------- */
2292
const OGR_SRSNode *poVERT_CS = GetRoot()->GetNode( "VERT_CS" );
2293
const OGR_SRSNode *poVUNITS = NULL;
2295
if( poVERT_CS != NULL )
2296
poVUNITS = poVERT_CS->GetNode( "UNIT" );
2298
if( poVUNITS != NULL && poVUNITS->GetChildCount() >= 2 )
2300
pszPROJ4Units = NULL;
2302
dfLinearConv = CPLAtof( poVUNITS->GetChild(1)->GetValue() );
2304
pszPROJ4Units = LinearToProj4( dfLinearConv,
2305
poVUNITS->GetChild(0)->GetValue() );
2307
if( pszPROJ4Units == NULL )
2309
char szLinearConv[128];
2310
sprintf( szLinearConv, "%.16g", dfLinearConv );
2311
SAFE_PROJ4_STRCAT( "+vto_meter=" );
2312
SAFE_PROJ4_STRCAT( szLinearConv );
2313
SAFE_PROJ4_STRCAT( " " );
2317
SAFE_PROJ4_STRCAT( "+vunits=");
2318
SAFE_PROJ4_STRCAT( pszPROJ4Units );
2319
SAFE_PROJ4_STRCAT( " " );
2068
2323
/* -------------------------------------------------------------------- */
2069
2324
/* Add the no_defs flag to ensure that no values from */
2070
2325
/* proj_def.dat are implicitly used with our definitions. */
2071
2326
/* -------------------------------------------------------------------- */
2072
sprintf( szProj4+strlen(szProj4), "+no_defs " );
2327
SAFE_PROJ4_STRCAT( "+no_defs " );
2074
2329
*ppszProj4 = CPLStrdup( szProj4 );