📄 ntf_raster.cpp
字号:
/****************************************************************************** * $Id: ntf_raster.cpp 10646 2007-01-18 02:38:10Z warmerdam $ * * Project: NTF Translator * Purpose: Handle UK Ordnance Survey Raster DTM products. Includes some * raster related methods from NTFFileReader and the implementation * of OGRNTFRasterLayer. * 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 "ntf.h"CPL_CVSID("$Id: ntf_raster.cpp 10646 2007-01-18 02:38:10Z warmerdam $");/************************************************************************//* ==================================================================== *//* NTFFileReader Raster Methods *//* ==================================================================== *//************************************************************************//************************************************************************//* IsRasterProduct() *//************************************************************************/int NTFFileReader::IsRasterProduct(){ return GetProductId() == NPC_LANDRANGER_DTM || GetProductId() == NPC_LANDFORM_PROFILE_DTM;}/************************************************************************//* EstablishRasterAccess() *//************************************************************************/void NTFFileReader::EstablishRasterAccess(){/* -------------------------------------------------------------------- *//* Read the type 50 record. *//* -------------------------------------------------------------------- */ NTFRecord *poRecord; while( (poRecord = ReadRecord()) != NULL && poRecord->GetType() != NRT_GRIDHREC && poRecord->GetType() != NRT_VTR ) { delete poRecord; } if( poRecord->GetType() != NRT_GRIDHREC ) { delete poRecord; CPLError( CE_Failure, CPLE_AppDefined, "Unable to find GRIDHREC (type 50) record in what appears\n" "to be an NTF Raster DTM product." ); return; }/* -------------------------------------------------------------------- *//* Parse if LANDRANGER_DTM *//* -------------------------------------------------------------------- */ if( GetProductId() == NPC_LANDRANGER_DTM ) { nRasterXSize = atoi(poRecord->GetField(13,16)); nRasterYSize = atoi(poRecord->GetField(17,20)); // NOTE: unusual use of GeoTransform - the pixel origin is the // bottom left corner! adfGeoTransform[0] = atoi(poRecord->GetField(25,34)); adfGeoTransform[1] = 50; adfGeoTransform[2] = 0; adfGeoTransform[3] = atoi(poRecord->GetField(35,44)); adfGeoTransform[4] = 0; adfGeoTransform[5] = 50; nRasterDataType = 3; /* GDT_Int16 */ }/* -------------------------------------------------------------------- *//* Parse if LANDFORM_PROFILE_DTM *//* -------------------------------------------------------------------- */ else if( GetProductId() == NPC_LANDFORM_PROFILE_DTM ) { nRasterXSize = atoi(poRecord->GetField(23,30)); nRasterYSize = atoi(poRecord->GetField(31,38)); // NOTE: unusual use of GeoTransform - the pixel origin is the // bottom left corner! adfGeoTransform[0] = atoi(poRecord->GetField(13,17)) + GetXOrigin(); adfGeoTransform[1] = atoi(poRecord->GetField(39,42)); adfGeoTransform[2] = 0; adfGeoTransform[3] = atoi(poRecord->GetField(18,22)) + GetYOrigin(); adfGeoTransform[4] = 0; adfGeoTransform[5] = atoi(poRecord->GetField(43,46)); nRasterDataType = 3; /* GDT_Int16 */ }/* -------------------------------------------------------------------- *//* Initialize column offsets table. *//* -------------------------------------------------------------------- */ delete poRecord; panColumnOffset = (long *) CPLCalloc(sizeof(long),nRasterXSize); GetFPPos( panColumnOffset+0, NULL );/* -------------------------------------------------------------------- *//* Create an OGRSFLayer for this file readers raster points. *//* -------------------------------------------------------------------- */ if( poDS != NULL ) { poRasterLayer = new OGRNTFRasterLayer( poDS, this ); poDS->AddLayer( poRasterLayer ); }}/************************************************************************//* ReadRasterColumn() *//************************************************************************/CPLErr NTFFileReader::ReadRasterColumn( int iColumn, float *pafElev ){/* -------------------------------------------------------------------- *//* If we don't already have the scanline offset of the previous *//* line, force reading of previous records to establish it. *//* -------------------------------------------------------------------- */ if( panColumnOffset[iColumn] == 0 ) { int iPrev; for( iPrev = 0; iPrev < iColumn-1; iPrev++ ) { if( panColumnOffset[iPrev+1] == 0 ) { CPLErr eErr; eErr = ReadRasterColumn( iPrev, NULL ); if( eErr != CE_None ) return eErr; } } }/* -------------------------------------------------------------------- *//* If the dataset isn't open, open it now. *//* -------------------------------------------------------------------- */ if( GetFP() == NULL ) Open(); /* -------------------------------------------------------------------- *//* Read requested record. *//* -------------------------------------------------------------------- */ NTFRecord *poRecord; SetFPPos( panColumnOffset[iColumn], iColumn ); poRecord = ReadRecord(); if( iColumn < nRasterXSize-1 ) { GetFPPos( panColumnOffset+iColumn+1, NULL ); } /* -------------------------------------------------------------------- *//* Handle LANDRANGER DTM columns. *//* -------------------------------------------------------------------- */ if( pafElev != NULL && GetProductId() == NPC_LANDRANGER_DTM ) { double dfVScale, dfVOffset; dfVOffset = atoi(poRecord->GetField(56,65)); dfVScale = atoi(poRecord->GetField(66,75)) * 0.001; for( int iPixel = 0; iPixel < nRasterXSize; iPixel++ ) { pafElev[iPixel] = (float) (dfVOffset + dfVScale * atoi(poRecord->GetField(84+iPixel*4,87+iPixel*4))); } } /* -------------------------------------------------------------------- *//* Handle PROFILE *//* -------------------------------------------------------------------- */ else if( pafElev != NULL && GetProductId() == NPC_LANDFORM_PROFILE_DTM ) { for( int iPixel = 0; iPixel < nRasterXSize; iPixel++ ) { pafElev[iPixel] = (float) (atoi(poRecord->GetField(19+iPixel*5,23+iPixel*5)) * GetZMult()); } } delete poRecord; return CE_None;}/************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -