SDTSRasterReader *SDTSTransfer::GetLayerRasterReader( int iEntry ) { SDTSRasterReader *poRasterReader; if( iEntry < 0 || iEntry >= nLayers || oCATD.GetEntryType( panLayerCATDEntry[iEntry] ) != SLTRaster ) { return NULL; } poRasterReader = new SDTSRasterReader(); if( !poRasterReader->Open( &oCATD, &oIREF, oCATD.GetEntryModule(panLayerCATDEntry[iEntry] ) ) ) { delete poRasterReader; return NULL; } else { return poRasterReader; } }
CPLErr SDTSDataset::GetGeoTransform( double * padfTransform ) { if( poRL->GetTransform( padfTransform ) ) return CE_None; else return CE_Failure; }
CPLErr SDTSRasterBand::IReadBlock( int nBlockXOff, int nBlockYOff, void * pImage ) { if( poRL->GetBlock( nBlockXOff, nBlockYOff, pImage ) ) return CE_None; else return CE_Failure; }
SDTSRasterReader *SDTSTransfer::GetLayerRasterReader( int iEntry ) { if( iEntry < 0 || iEntry >= nLayers || oCATD.GetEntryType( panLayerCATDEntry[iEntry] ) != SLTRaster ) { return nullptr; } SDTSRasterReader *poRasterReader = new SDTSRasterReader(); if( !poRasterReader->Open( &oCATD, &oIREF, oCATD.GetEntryModule(panLayerCATDEntry[iEntry] ) ) ) { panLayerCATDEntry[iEntry] = SLTUnknown; // to prevent further attempt delete poRasterReader; return nullptr; } return poRasterReader; }
GDALDataset *SDTSDataset::Open( GDALOpenInfo * poOpenInfo ) { int i; /* -------------------------------------------------------------------- */ /* Before trying SDTSOpen() we first verify that the first */ /* record is in fact a SDTS file descriptor record. */ /* -------------------------------------------------------------------- */ char *pachLeader = (char *) poOpenInfo->pabyHeader; if( poOpenInfo->nHeaderBytes < 24 ) return NULL; if( pachLeader[5] != '1' && pachLeader[5] != '2' && pachLeader[5] != '3' ) return NULL; if( pachLeader[6] != 'L' ) return NULL; if( pachLeader[8] != '1' && pachLeader[8] != ' ' ) return NULL; /* -------------------------------------------------------------------- */ /* Try opening the dataset. */ /* -------------------------------------------------------------------- */ SDTSTransfer *poTransfer = new SDTSTransfer; if( !poTransfer->Open( poOpenInfo->pszFilename ) ) { delete poTransfer; return NULL; } /* -------------------------------------------------------------------- */ /* Confirm the requested access is supported. */ /* -------------------------------------------------------------------- */ if( poOpenInfo->eAccess == GA_Update ) { delete poTransfer; CPLError( CE_Failure, CPLE_NotSupported, "The SDTS driver does not support update access to existing" " datasets.\n" ); return NULL; } /* -------------------------------------------------------------------- */ /* Find the first raster layer. If there are none, abort */ /* returning an error. */ /* -------------------------------------------------------------------- */ SDTSRasterReader *poRL = NULL; for( i = 0; i < poTransfer->GetLayerCount(); i++ ) { if( poTransfer->GetLayerType( i ) == SLTRaster ) { poRL = poTransfer->GetLayerRasterReader( i ); break; } } if( poRL == NULL ) { delete poTransfer; CPLError( CE_Warning, CPLE_AppDefined, "%s is an SDTS transfer, but has no raster cell layers.\n" "Perhaps it is a vector transfer?\n", poOpenInfo->pszFilename ); return NULL; } /* -------------------------------------------------------------------- */ /* Initialize a corresponding GDALDataset. */ /* -------------------------------------------------------------------- */ SDTSDataset *poDS = new SDTSDataset(); poDS->poTransfer = poTransfer; poDS->poRL = poRL; /* -------------------------------------------------------------------- */ /* Capture some information from the file that is of interest. */ /* -------------------------------------------------------------------- */ poDS->nRasterXSize = poRL->GetXSize(); poDS->nRasterYSize = poRL->GetYSize(); /* -------------------------------------------------------------------- */ /* Create band information objects. */ /* -------------------------------------------------------------------- */ poDS->nBands = 1; poDS->papoBands = (GDALRasterBand **) VSICalloc(sizeof(GDALRasterBand *),poDS->nBands); for( i = 0; i < poDS->nBands; i++ ) poDS->SetBand( i+1, new SDTSRasterBand( poDS, i+1, poRL ) ); /* -------------------------------------------------------------------- */ /* Try to establish the projection string. For now we only */ /* support UTM and GEO. */ /* -------------------------------------------------------------------- */ OGRSpatialReference oSRS; SDTS_XREF *poXREF = poTransfer->GetXREF(); if( EQUAL(poXREF->pszSystemName,"UTM") ) { oSRS.SetUTM( poXREF->nZone ); } else if( EQUAL(poXREF->pszSystemName,"GEO") ) { /* we set datum later */ } else oSRS.SetLocalCS( poXREF->pszSystemName ); if( oSRS.IsLocal() ) /* don't try to set datum. */; else if( EQUAL(poXREF->pszDatum,"NAS") ) oSRS.SetWellKnownGeogCS( "NAD27" ); else if( EQUAL(poXREF->pszDatum, "NAX") ) oSRS.SetWellKnownGeogCS( "NAD83" ); else if( EQUAL(poXREF->pszDatum, "WGC") ) oSRS.SetWellKnownGeogCS( "WGS72" ); else if( EQUAL(poXREF->pszDatum, "WGE") ) oSRS.SetWellKnownGeogCS( "WGS84" ); else oSRS.SetWellKnownGeogCS( "WGS84" ); oSRS.Fixup(); poDS->pszProjection = NULL; if( oSRS.exportToWkt( &poDS->pszProjection ) != OGRERR_NONE ) poDS->pszProjection = CPLStrdup(""); /* -------------------------------------------------------------------- */ /* Get metadata from the IDEN file. */ /* -------------------------------------------------------------------- */ const char* pszIDENFilePath = poTransfer->GetCATD()->GetModuleFilePath("IDEN"); if (pszIDENFilePath) { DDFModule oIDENFile; if( oIDENFile.Open( pszIDENFilePath ) ) { DDFRecord* poRecord; while( (poRecord = oIDENFile.ReadRecord()) != NULL ) { if( poRecord->GetStringSubfield( "IDEN", 0, "MODN", 0 ) == NULL ) continue; static const char* fields[][2] = { { "TITL", "TITLE" }, { "DAID", "DATASET_ID" }, { "DAST", "DATA_STRUCTURE" }, { "MPDT", "MAP_DATE" }, { "DCDT", "DATASET_CREATION_DATE" } }; for (i = 0; i < (int)sizeof(fields) / (int)sizeof(fields[0]) ; i++) { const char* pszFieldValue = poRecord->GetStringSubfield( "IDEN", 0, fields[i][0], 0 ); if ( pszFieldValue ) poDS->SetMetadataItem(fields[i][1], pszFieldValue); } break; } } } /* -------------------------------------------------------------------- */ /* Initialize any PAM information. */ /* -------------------------------------------------------------------- */ poDS->SetDescription( poOpenInfo->pszFilename ); poDS->TryLoadXML(); return( poDS ); }
int SDTSTransfer::GetBounds( double *pdfMinX, double *pdfMinY, double *pdfMaxX, double *pdfMaxY ) { bool bFirst = true; for( int iLayer = 0; iLayer < GetLayerCount(); iLayer++ ) { if( GetLayerType( iLayer ) == SLTPoint ) { SDTSPointReader *poLayer = reinterpret_cast<SDTSPointReader *>( GetLayerIndexedReader( iLayer ) ); if( poLayer == nullptr ) continue; poLayer->Rewind(); SDTSRawPoint *poPoint = nullptr; while( (poPoint = reinterpret_cast<SDTSRawPoint *>( poLayer->GetNextFeature() ) ) != nullptr ) { if( bFirst ) { *pdfMinX = poPoint->dfX; *pdfMaxX = poPoint->dfX; *pdfMinY = poPoint->dfY; *pdfMaxY = poPoint->dfY; bFirst = false; } else { *pdfMinX = std::min( *pdfMinX, poPoint->dfX ); *pdfMaxX = std::max( *pdfMaxX, poPoint->dfX ); *pdfMinY = std::min( *pdfMinY, poPoint->dfY ); *pdfMaxY = std::max( *pdfMaxY, poPoint->dfY ); } if( !poLayer->IsIndexed() ) delete poPoint; } } else if( GetLayerType( iLayer ) == SLTRaster ) { SDTSRasterReader *poRL = GetLayerRasterReader( iLayer ); if( poRL == nullptr ) continue; double adfGeoTransform[6]; poRL->GetTransform( adfGeoTransform ); const double dfMinX = adfGeoTransform[0]; const double dfMaxY = adfGeoTransform[3]; const double dfMaxX = adfGeoTransform[0] + poRL->GetXSize() * adfGeoTransform[1]; const double dfMinY = adfGeoTransform[3] + poRL->GetYSize() * adfGeoTransform[5]; if( bFirst ) { *pdfMinX = dfMinX; *pdfMaxX = dfMaxX; *pdfMinY = dfMinY; *pdfMaxY = dfMaxY; bFirst = false; } else { *pdfMinX = std::min( dfMinX, *pdfMinX ); *pdfMaxX = std::max( dfMaxX, *pdfMaxX ); *pdfMinY = std::min( dfMinY, *pdfMinY ); *pdfMaxY = std::max( dfMaxY, *pdfMaxY ); } delete poRL; } } return !bFirst; }
int SDTSTransfer::GetBounds( double *pdfMinX, double *pdfMinY, double *pdfMaxX, double *pdfMaxY ) { int bFirst = TRUE; for( int iLayer = 0; iLayer < GetLayerCount(); iLayer++ ) { if( GetLayerType( iLayer ) == SLTPoint ) { SDTSPointReader *poLayer; SDTSRawPoint *poPoint; poLayer = (SDTSPointReader *) GetLayerIndexedReader( iLayer ); if( poLayer == NULL ) continue; poLayer->Rewind(); while( (poPoint = (SDTSRawPoint*) poLayer->GetNextFeature()) ) { if( bFirst ) { *pdfMinX = *pdfMaxX = poPoint->dfX; *pdfMinY = *pdfMaxY = poPoint->dfY; bFirst = FALSE; } else { *pdfMinX = MIN(*pdfMinX,poPoint->dfX); *pdfMaxX = MAX(*pdfMaxX,poPoint->dfX); *pdfMinY = MIN(*pdfMinY,poPoint->dfY); *pdfMaxY = MAX(*pdfMaxY,poPoint->dfY); } if( !poLayer->IsIndexed() ) delete poPoint; } } else if( GetLayerType( iLayer ) == SLTRaster ) { SDTSRasterReader *poRL; double adfGeoTransform[6]; double dfMinX, dfMaxX, dfMinY, dfMaxY; poRL = GetLayerRasterReader( iLayer ); if( poRL == NULL ) continue; poRL->GetTransform( adfGeoTransform ); dfMinX = adfGeoTransform[0]; dfMaxY = adfGeoTransform[3]; dfMaxX = adfGeoTransform[0] + poRL->GetXSize()*adfGeoTransform[1]; dfMinY = adfGeoTransform[3] + poRL->GetYSize()*adfGeoTransform[5]; if( bFirst ) { *pdfMinX = dfMinX; *pdfMaxX = dfMaxX; *pdfMinY = dfMinY; *pdfMaxY = dfMaxY; bFirst = FALSE; } else { *pdfMinX = MIN(dfMinX,*pdfMinX); *pdfMaxX = MAX(dfMaxX,*pdfMaxX); *pdfMinY = MIN(dfMinY,*pdfMinY); *pdfMaxY = MAX(dfMaxY,*pdfMaxY); } delete poRL; } } return !bFirst; }