OGRSpatialReference *OGROCIDataSource::FetchSRS( int nId ) { if( nId < 0 ) return NULL; /* -------------------------------------------------------------------- */ /* First, we look through our SRID cache, is it there? */ /* -------------------------------------------------------------------- */ int i; for( i = 0; i < nKnownSRID; i++ ) { if( panSRID[i] == nId ) return papoSRS[i]; } /* -------------------------------------------------------------------- */ /* Try looking up in MDSYS.CS_SRS table. */ /* -------------------------------------------------------------------- */ OGROCIStatement oStatement( GetSession() ); char szSelect[200], **papszResult; snprintf( szSelect, sizeof(szSelect), "SELECT WKTEXT, AUTH_SRID, AUTH_NAME FROM MDSYS.CS_SRS " "WHERE SRID = %d AND WKTEXT IS NOT NULL", nId ); if( oStatement.Execute( szSelect ) != CE_None ) return NULL; papszResult = oStatement.SimpleFetchRow(); if( CSLCount(papszResult) < 1 ) return NULL; /* -------------------------------------------------------------------- */ /* Turn into a spatial reference. */ /* -------------------------------------------------------------------- */ char *pszWKT = papszResult[0]; OGRSpatialReference *poSRS = NULL; poSRS = new OGRSpatialReference(); if( poSRS->importFromWkt( &pszWKT ) != OGRERR_NONE ) { delete poSRS; poSRS = NULL; } /* -------------------------------------------------------------------- */ /* If we have a corresponding EPSG code for this SRID, use that */ /* authority. */ /* -------------------------------------------------------------------- */ int bGotEPSGMapping = FALSE; for( i = 0; anEPSGOracleMapping[i] != 0; i += 2 ) { if( anEPSGOracleMapping[i] == nId ) { poSRS->SetAuthority( poSRS->GetRoot()->GetValue(), "EPSG", anEPSGOracleMapping[i+1] ); bGotEPSGMapping = TRUE; break; } } /* -------------------------------------------------------------------- */ /* Insert authority information, if it is available. */ /* -------------------------------------------------------------------- */ if( papszResult[1] != NULL && atoi(papszResult[1]) != 0 && papszResult[2] != NULL && strlen(papszResult[1]) != 0 && poSRS->GetRoot() != NULL && !bGotEPSGMapping ) { poSRS->SetAuthority( poSRS->GetRoot()->GetValue(), papszResult[2], atoi(papszResult[1]) ); } /* -------------------------------------------------------------------- */ /* Add to the cache. */ /* -------------------------------------------------------------------- */ panSRID = (int *) CPLRealloc(panSRID,sizeof(int) * (nKnownSRID+1) ); papoSRS = (OGRSpatialReference **) CPLRealloc(papoSRS, sizeof(void*) * (nKnownSRID + 1) ); panSRID[nKnownSRID] = nId; papoSRS[nKnownSRID] = poSRS; nKnownSRID++; return poSRS; }