📄 dteddataset.cpp
字号:
/****************************************************************************** * $Id: dteddataset.cpp 10646 2007-01-18 02:38:10Z warmerdam $ * * Project: DTED Translator * Purpose: GDALDataset driver for DTED translator. * Author: Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 1999, Frank Warmerdam * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/#include "dted_api.h"#include "gdal_pam.h"CPL_CVSID("$Id: dteddataset.cpp 10646 2007-01-18 02:38:10Z warmerdam $");CPL_C_STARTvoid GDALRegister_DTED(void);CPL_C_END/************************************************************************//* ==================================================================== *//* DTEDDataset *//* ==================================================================== *//************************************************************************/class DTEDRasterBand;class DTEDDataset : public GDALPamDataset{ friend class DTEDRasterBand; DTEDInfo *psDTED; public: virtual ~DTEDDataset(); virtual const char *GetProjectionRef(void); virtual CPLErr GetGeoTransform( double * ); static GDALDataset *Open( GDALOpenInfo * );};/************************************************************************//* ==================================================================== *//* DTEDRasterBand *//* ==================================================================== *//************************************************************************/class DTEDRasterBand : public GDALPamRasterBand{ friend class DTEDDataset; int bNoDataSet; double dfNoDataValue; public: DTEDRasterBand( DTEDDataset *, int ); virtual CPLErr IReadBlock( int, int, void * ); virtual double GetNoDataValue( int *pbSuccess = NULL ); virtual const char* GetUnitType() { return "m"; }};/************************************************************************//* DTEDRasterBand() *//************************************************************************/DTEDRasterBand::DTEDRasterBand( DTEDDataset *poDS, int nBand ){ this->poDS = poDS; this->nBand = nBand; eDataType = GDT_Int16; bNoDataSet = TRUE; dfNoDataValue = (double) DTED_NODATA_VALUE; nBlockXSize = 1; nBlockYSize = poDS->GetRasterYSize();;}/************************************************************************//* IReadBlock() *//************************************************************************/CPLErr DTEDRasterBand::IReadBlock( int nBlockXOff, int nBlockYOff, void * pImage ){ DTEDDataset *poDTED_DS = (DTEDDataset *) poDS; int nYSize = poDTED_DS->psDTED->nYSize; GInt16 *panData; (void) nBlockXOff; CPLAssert( nBlockYOff == 0 );/* -------------------------------------------------------------------- *//* Read the data. *//* -------------------------------------------------------------------- */ panData = (GInt16 *) pImage; if( !DTEDReadProfile( poDTED_DS->psDTED, nBlockXOff, panData ) ) return CE_Failure;/* -------------------------------------------------------------------- *//* Flip line to orient it top to bottom instead of bottom to *//* top. *//* -------------------------------------------------------------------- */ for( int i = nYSize/2; i >= 0; i-- ) { GInt16 nTemp; nTemp = panData[i]; panData[i] = panData[nYSize - i - 1]; panData[nYSize - i - 1] = nTemp; } return CE_None;}/************************************************************************//* GetNoDataValue() *//************************************************************************/double DTEDRasterBand::GetNoDataValue( int * pbSuccess ){ if( pbSuccess ) *pbSuccess = bNoDataSet; return dfNoDataValue;}/************************************************************************//* ~DTEDDataset() *//************************************************************************/DTEDDataset::~DTEDDataset(){ FlushCache(); if( psDTED != NULL ) DTEDClose( psDTED );}/************************************************************************//* Open() *//************************************************************************/GDALDataset *DTEDDataset::Open( GDALOpenInfo * poOpenInfo ){ int i; DTEDInfo *psDTED;/* -------------------------------------------------------------------- *//* Try opening the dataset. *//* -------------------------------------------------------------------- */ psDTED = DTEDOpen( poOpenInfo->pszFilename, "rb", TRUE ); if( psDTED == NULL ) return( NULL );/* -------------------------------------------------------------------- *//* Create a corresponding GDALDataset. *//* -------------------------------------------------------------------- */ DTEDDataset *poDS; poDS = new DTEDDataset(); poDS->psDTED = psDTED; /* -------------------------------------------------------------------- *//* Capture some information from the file that is of interest. *//* -------------------------------------------------------------------- */ poDS->nRasterXSize = psDTED->nXSize; poDS->nRasterYSize = psDTED->nYSize; /* -------------------------------------------------------------------- *//* Create band information objects. *//* -------------------------------------------------------------------- */ poDS->nBands = 1;; for( i = 0; i < poDS->nBands; i++ ) poDS->SetBand( i+1, new DTEDRasterBand( poDS, i+1 ) );/* -------------------------------------------------------------------- *//* Collect any metadata available. *//* -------------------------------------------------------------------- */ char *pszValue; pszValue = DTEDGetMetadata( psDTED, DTEDMD_VERTACCURACY_UHL ); poDS->SetMetadataItem( "DTED_VerticalAccuracy_UHL", pszValue ); CPLFree( pszValue ); pszValue = DTEDGetMetadata( psDTED, DTEDMD_VERTACCURACY_ACC ); poDS->SetMetadataItem( "DTED_VerticalAccuracy_ACC", pszValue ); CPLFree( pszValue ); pszValue = DTEDGetMetadata( psDTED, DTEDMD_SECURITYCODE_UHL ); poDS->SetMetadataItem( "DTED_SecurityCode_UHL", pszValue ); CPLFree( pszValue ); pszValue = DTEDGetMetadata( psDTED, DTEDMD_SECURITYCODE_DSI ); poDS->SetMetadataItem( "DTED_SecurityCode_DSI", pszValue ); CPLFree( pszValue ); pszValue = DTEDGetMetadata( psDTED, DTEDMD_UNIQUEREF_UHL ); poDS->SetMetadataItem( "DTED_UniqueRef_UHL", pszValue ); CPLFree( pszValue ); pszValue = DTEDGetMetadata( psDTED, DTEDMD_UNIQUEREF_DSI ); poDS->SetMetadataItem( "DTED_UniqueRef_DSI", pszValue ); CPLFree( pszValue ); pszValue = DTEDGetMetadata( psDTED, DTEDMD_DATA_EDITION ); poDS->SetMetadataItem( "DTED_DataEdition", pszValue ); CPLFree( pszValue ); pszValue = DTEDGetMetadata( psDTED, DTEDMD_MATCHMERGE_VERSION ); poDS->SetMetadataItem( "DTED_MatchMergeVersion", pszValue ); CPLFree( pszValue ); pszValue = DTEDGetMetadata( psDTED, DTEDMD_MAINT_DATE ); poDS->SetMetadataItem( "DTED_MaintenanceDate", pszValue ); CPLFree( pszValue ); pszValue = DTEDGetMetadata( psDTED, DTEDMD_MATCHMERGE_DATE ); poDS->SetMetadataItem( "DTED_MatchMergeDate", pszValue ); CPLFree( pszValue ); pszValue = DTEDGetMetadata( psDTED, DTEDMD_MAINT_DESCRIPTION ); poDS->SetMetadataItem( "DTED_MaintenanceDescription", pszValue ); CPLFree( pszValue ); pszValue = DTEDGetMetadata( psDTED, DTEDMD_PRODUCER ); poDS->SetMetadataItem( "DTED_Producer", pszValue ); CPLFree( pszValue ); pszValue = DTEDGetMetadata( psDTED, DTEDMD_VERTDATUM ); poDS->SetMetadataItem( "DTED_VerticalDatum", pszValue ); CPLFree( pszValue ); pszValue = DTEDGetMetadata( psDTED, DTEDMD_DIGITIZING_SYS ); poDS->SetMetadataItem( "DTED_DigitizingSystem", pszValue ); CPLFree( pszValue ); pszValue = DTEDGetMetadata( psDTED, DTEDMD_COMPILATION_DATE ); poDS->SetMetadataItem( "DTED_CompilationDate", pszValue ); CPLFree( pszValue ); pszValue = DTEDGetMetadata( psDTED, DTEDMD_HORIZACCURACY ); poDS->SetMetadataItem( "DTED_HorizontalAccuracy", pszValue ); CPLFree( pszValue ); pszValue = DTEDGetMetadata( psDTED, DTEDMD_REL_HORIZACCURACY ); poDS->SetMetadataItem( "DTED_RelHorizontalAccuracy", pszValue ); CPLFree( pszValue ); pszValue = DTEDGetMetadata( psDTED, DTEDMD_REL_VERTACCURACY ); poDS->SetMetadataItem( "DTED_RelVerticalAccuracy", pszValue ); CPLFree( pszValue ); poDS->SetMetadataItem( GDALMD_AREA_OR_POINT, GDALMD_AOP_POINT );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -