⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ntf_raster.cpp

📁 支持各种栅格图像和矢量图像读取的库
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************** * $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 + -