GDALDataset *JDEMDataset::Open( GDALOpenInfo *poOpenInfo ) { // Confirm that the header is compatible with a JDEM dataset. if (!Identify(poOpenInfo)) return nullptr; // Confirm the requested access is supported. if( poOpenInfo->eAccess == GA_Update ) { CPLError(CE_Failure, CPLE_NotSupported, "The JDEM driver does not support update access to existing " "datasets."); return nullptr; } // Check that the file pointer from GDALOpenInfo* is available. if( poOpenInfo->fpL == nullptr ) { return nullptr; } // Create a corresponding GDALDataset. JDEMDataset *poDS = new JDEMDataset(); // Borrow the file pointer from GDALOpenInfo*. poDS->fp = poOpenInfo->fpL; poOpenInfo->fpL = nullptr; // Read the header. CPL_IGNORE_RET_VAL(VSIFReadL(poDS->abyHeader, 1, 1012, poDS->fp)); const char *psHeader = reinterpret_cast<char *>(poDS->abyHeader); poDS->nRasterXSize = JDEMGetField(psHeader + 23, 3); poDS->nRasterYSize = JDEMGetField(psHeader + 26, 3); if( poDS->nRasterXSize <= 0 || poDS->nRasterYSize <= 0 ) { CPLError(CE_Failure, CPLE_AppDefined, "Invalid dimensions : %d x %d", poDS->nRasterXSize, poDS->nRasterYSize); delete poDS; return nullptr; } // Create band information objects. poDS->SetBand(1, new JDEMRasterBand(poDS, 1)); // Initialize any PAM information. poDS->SetDescription(poOpenInfo->pszFilename); poDS->TryLoadXML(); // Check for overviews. poDS->oOvManager.Initialize(poDS, poOpenInfo->pszFilename); return poDS; }
CPLErr JDEMRasterBand::IReadBlock( CPL_UNUSED int nBlockXOff, int nBlockYOff, void * pImage ) { JDEMDataset *poGDS = (JDEMDataset *) poDS; int i; if (pszRecord == NULL) { if (bBufferAllocFailed) return CE_Failure; pszRecord = (char *) VSIMalloc(nRecordSize); if (pszRecord == NULL) { CPLError(CE_Failure, CPLE_OutOfMemory, "Cannot allocate scanline buffer"); bBufferAllocFailed = TRUE; return CE_Failure; } } VSIFSeekL( poGDS->fp, 1011 + nRecordSize*nBlockYOff, SEEK_SET ); VSIFReadL( pszRecord, 1, nRecordSize, poGDS->fp ); if( !EQUALN((char *) poGDS->abyHeader,pszRecord,6) ) { CPLError( CE_Failure, CPLE_AppDefined, "JDEM Scanline corrupt. Perhaps file was not transferred\n" "in binary mode?" ); return CE_Failure; } if( JDEMGetField( pszRecord + 6, 3 ) != nBlockYOff + 1 ) { CPLError( CE_Failure, CPLE_AppDefined, "JDEM scanline out of order, JDEM driver does not\n" "currently support partial datasets." ); return CE_Failure; } for( i = 0; i < nBlockXSize; i++ ) ((float *) pImage)[i] = (float) (JDEMGetField( pszRecord + 9 + 5 * i, 5) * 0.1); return CE_None; }
CPLErr JDEMRasterBand::IReadBlock( CPL_UNUSED int nBlockXOff, int nBlockYOff, void * pImage ) { JDEMDataset *poGDS = static_cast<JDEMDataset *>(poDS); if (pszRecord == nullptr) { if (bBufferAllocFailed) return CE_Failure; pszRecord = static_cast<char *>(VSI_MALLOC_VERBOSE(nRecordSize)); if (pszRecord == nullptr) { bBufferAllocFailed = true; return CE_Failure; } } CPL_IGNORE_RET_VAL( VSIFSeekL(poGDS->fp, 1011 + nRecordSize * nBlockYOff, SEEK_SET)); CPL_IGNORE_RET_VAL(VSIFReadL(pszRecord, 1, nRecordSize, poGDS->fp)); if( !EQUALN(reinterpret_cast<char *>(poGDS->abyHeader), pszRecord, 6) ) { CPLError(CE_Failure, CPLE_AppDefined, "JDEM Scanline corrupt. Perhaps file was not transferred " "in binary mode?"); return CE_Failure; } if( JDEMGetField(pszRecord + 6, 3) != nBlockYOff + 1 ) { CPLError(CE_Failure, CPLE_AppDefined, "JDEM scanline out of order, JDEM driver does not " "currently support partial datasets."); return CE_Failure; } for( int i = 0; i < nBlockXSize; i++ ) static_cast<float *>(pImage)[i] = JDEMGetField(pszRecord + 9 + 5 * i, 5) * 0.1f; return CE_None; }
static double JDEMGetAngle( char *pszField ) { int nAngle = JDEMGetField( pszField, 7 ); // Note, this isn't very general purpose, but it would appear // from the field widths that angles are never negative. Nice // to be a country in the "first quadrant". const int nDegree = nAngle / 10000; const int nMin = (nAngle / 100) % 100; const int nSec = nAngle % 100; return nDegree + nMin / 60.0 + nSec / 3600.0; }
GDALDataset *JDEMDataset::Open( GDALOpenInfo * poOpenInfo ) { /* -------------------------------------------------------------------- */ /* Confirm that the header is compatible with a JDEM dataset. */ /* -------------------------------------------------------------------- */ if (!Identify(poOpenInfo)) return NULL; /* -------------------------------------------------------------------- */ /* Confirm the requested access is supported. */ /* -------------------------------------------------------------------- */ if( poOpenInfo->eAccess == GA_Update ) { CPLError( CE_Failure, CPLE_NotSupported, "The JDEM driver does not support update access to existing" " datasets.\n" ); return NULL; } /* Check that the file pointer from GDALOpenInfo* is available */ if( poOpenInfo->fpL == NULL ) { return NULL; } /* -------------------------------------------------------------------- */ /* Create a corresponding GDALDataset. */ /* -------------------------------------------------------------------- */ JDEMDataset *poDS; poDS = new JDEMDataset(); /* Borrow the file pointer from GDALOpenInfo* */ poDS->fp = poOpenInfo->fpL; poOpenInfo->fpL = NULL; /* -------------------------------------------------------------------- */ /* Read the header. */ /* -------------------------------------------------------------------- */ VSIFReadL( poDS->abyHeader, 1, 1012, poDS->fp ); poDS->nRasterXSize = JDEMGetField( (char *) poDS->abyHeader + 23, 3 ); poDS->nRasterYSize = JDEMGetField( (char *) poDS->abyHeader + 26, 3 ); if (poDS->nRasterXSize <= 0 || poDS->nRasterYSize <= 0 ) { CPLError( CE_Failure, CPLE_AppDefined, "Invalid dimensions : %d x %d", poDS->nRasterXSize, poDS->nRasterYSize); delete poDS; return NULL; } /* -------------------------------------------------------------------- */ /* Create band information objects. */ /* -------------------------------------------------------------------- */ poDS->SetBand( 1, new JDEMRasterBand( poDS, 1 )); /* -------------------------------------------------------------------- */ /* Initialize any PAM information. */ /* -------------------------------------------------------------------- */ poDS->SetDescription( poOpenInfo->pszFilename ); poDS->TryLoadXML(); /* -------------------------------------------------------------------- */ /* Check for overviews. */ /* -------------------------------------------------------------------- */ poDS->oOvManager.Initialize( poDS, poOpenInfo->pszFilename ); return( poDS ); }