diff --git a/gdal/ogr/ogr_srs_esri.cpp b/gdal/ogr/ogr_srs_esri.cpp index 5655668..48fc160 100644 --- a/gdal/ogr/ogr_srs_esri.cpp +++ b/gdal/ogr/ogr_srs_esri.cpp @@ -1434,24 +1474,35 @@ OGRErr OGRSpatialReference::morphFromESRI() { OGRErr eErr = OGRERR_NONE; + OGR_SRSNode *poDatum; + char *pszDatumOrig = NULL; if( GetRoot() == NULL ) return OGRERR_NONE; + InitDatumMappingTable(); + /* -------------------------------------------------------------------- */ -/* Translate DATUM keywords that are oddly named. */ +/* Save original datum name for later */ /* -------------------------------------------------------------------- */ - InitDatumMappingTable(); + poDatum = GetAttrNode( "DATUM" ); + if( poDatum != NULL ) + { + poDatum = poDatum->GetChild(0); + pszDatumOrig = CPLStrdup( poDatum->GetValue() ); + } +/* -------------------------------------------------------------------- */ +/* Translate DATUM keywords that are oddly named. */ +/* -------------------------------------------------------------------- */ GetRoot()->applyRemapper( "DATUM", (char **)papszDatumMapping+1, (char **)papszDatumMapping+2, 3 ); + /* -------------------------------------------------------------------- */ /* Try to remove any D_ in front of the datum name. */ /* -------------------------------------------------------------------- */ - OGR_SRSNode *poDatum; - poDatum = GetAttrNode( "DATUM" ); if( poDatum != NULL ) poDatum = poDatum->GetChild(0); @@ -1597,6 +1648,49 @@ OGRErr OGRSpatialReference::morphFromESRI() (char **)papszDatumMapping+1, (char **)papszDatumMapping+2, 3 ); +/* -------------------------------------------------------------------- */ +/* Add TOWGS84 parameters */ +/* -------------------------------------------------------------------- */ + if( poDatum != NULL ) + { + for( int i = 0; papszDatumMapping[i*3] != NULL; i++ ) + { + if( EQUAL(papszDatumMapping[i*3+1],pszDatumOrig) ) + { + int nGeogCS; + char *pszTemp; + const char *pszFilename=NULL; + + /* TODO add support for PROJCS - need examples */ + /* TODO test more ESRI WKT */ + pszFilename = CSVFilename("gcs.csv"); + nGeogCS = atoi(CSVGetField( pszFilename, "DATUM_CODE", + papszDatumMapping[i*3+0], CC_Integer, + "COORD_REF_SYS_CODE") ); + if ( nGeogCS >= 1 ) + { + OGRSpatialReference oSRSTemp; + oSRSTemp.importFromEPSG( nGeogCS ); + pszTemp = CPLStrdup(oSRSTemp.GetAttrNode( "DATUM|SPHEROID" )->GetChild(0)->GetValue()); + MorphNameToESRI( &pszTemp ); + /* another possibility is to morph oSRSTemp to ESRI, test IsSame() */ + /* and then this->importFromEPSG to copy everything */ + if( EQUAL( pszTemp,GetAttrNode( "DATUM|SPHEROID" )->GetChild(0)->GetValue())) + { + OGR_SRSNode *poNode=oSRSTemp.GetAttrNode( "DATUM|TOWGS84" )->Clone(); + GetAttrNode( "DATUM" )->AddChild( poNode ); + CPLFree(pszTemp); + break; + } + CPLFree(pszTemp); + } + + } + } + } + + CPLFree( pszDatumOrig ); + return eErr; }