Line data Source code
1 : /****************************************************************************** 2 : * $Id$ 3 : * 4 : * Project: ENVI .hdr Driver 5 : * Purpose: Implementation of ENVI .hdr labelled raw raster support. 6 : * Author: Frank Warmerdam, warmerdam@pobox.com 7 : * Maintainer: Chris Padwick (cpadwick at ittvis.com) 8 : * 9 : ****************************************************************************** 10 : * Copyright (c) 2002, Frank Warmerdam 11 : * Copyright (c) 2007-2013, Even Rouault <even dot rouault at spatialys.com> 12 : * 13 : * SPDX-License-Identifier: MIT 14 : ****************************************************************************/ 15 : 16 : #ifndef GDAL_FRMTS_RAW_ENVIDATASET_H_INCLUDED 17 : #define GDAL_FRMTS_RAW_ENVIDATASET_H_INCLUDED 18 : 19 : #include "cpl_port.h" 20 : #include "rawdataset.h" 21 : 22 : #include <climits> 23 : #include <cmath> 24 : #include <cstdlib> 25 : #include <cstring> 26 : #if HAVE_FCNTL_H 27 : #include <fcntl.h> 28 : #endif 29 : 30 : #include <algorithm> 31 : #include <limits> 32 : #include <string> 33 : 34 : #include "cpl_conv.h" 35 : #include "cpl_error.h" 36 : #include "cpl_string.h" 37 : #include "cpl_vsi.h" 38 : #include "gdal.h" 39 : #include "gdal_frmts.h" 40 : #include "gdal_priv.h" 41 : #include "ogr_core.h" 42 : #include "ogr_spatialref.h" 43 : #include "ogr_srs_api.h" 44 : 45 : class ENVIRasterBand; 46 : 47 : class ENVIDataset final : public RawDataset 48 : { 49 : friend class ENVIRasterBand; 50 : 51 : VSILFILE *fpImage; // Image data file. 52 : VSILFILE *fp; // Header file 53 : char *pszHDRFilename; 54 : 55 : bool bFoundMapinfo; 56 : bool bHeaderDirty; 57 : bool bFillFile; 58 : 59 : double adfGeoTransform[6]; 60 : 61 : OGRSpatialReference m_oSRS{}; 62 : 63 : CPLStringList m_aosHeader{}; 64 : 65 : CPLString osStaFilename{}; 66 : 67 : std::vector<GDAL_GCP> m_asGCPs{}; 68 : 69 : bool ReadHeader(VSILFILE *); 70 : bool ProcessMapinfo(const char *); 71 : void ProcessRPCinfo(const char *, int, int); 72 : void ProcessGeoPoints(const char *); 73 : void ProcessStatsFile(); 74 : static int byteSwapInt(int); 75 : static float byteSwapFloat(float); 76 : static double byteSwapDouble(double); 77 : static void SetENVIDatum(OGRSpatialReference *, const char *); 78 : static void SetENVIEllipse(OGRSpatialReference *, char **); 79 : void WriteProjectionInfo(); 80 : bool ParseRpcCoeffsMetaDataString(const char *psName, char *papszVal[], 81 : int &idx); 82 : bool WriteRpcInfo(); 83 : bool WritePseudoGcpInfo(); 84 : 85 92 : void SetFillFile() 86 : { 87 92 : bFillFile = true; 88 92 : } 89 : 90 : static char **SplitList(const char *); 91 : 92 : enum Interleave 93 : { 94 : BSQ, 95 : BIL, 96 : BIP 97 : } interleave; 98 : 99 : static int GetEnviType(GDALDataType eType); 100 : 101 : CPL_DISALLOW_COPY_ASSIGN(ENVIDataset) 102 : 103 : CPLErr Close() override; 104 : 105 : public: 106 : ENVIDataset(); 107 : ~ENVIDataset() override; 108 : 109 : CPLErr FlushCache(bool bAtClosing) override; 110 : CPLErr GetGeoTransform(double *padfTransform) override; 111 : CPLErr SetGeoTransform(double *) override; 112 : 113 : const OGRSpatialReference *GetSpatialRef() const override; 114 : CPLErr SetSpatialRef(const OGRSpatialReference *poSRS) override; 115 : 116 : char **GetFileList() override; 117 : 118 : void SetDescription(const char *) override; 119 : 120 : CPLErr SetMetadata(char **papszMetadata, 121 : const char *pszDomain = "") override; 122 : CPLErr SetMetadataItem(const char *pszName, const char *pszValue, 123 : const char *pszDomain = "") override; 124 : CPLErr SetGCPs(int nGCPCount, const GDAL_GCP *pasGCPList, 125 : const OGRSpatialReference *poSRS) override; 126 : int GetGCPCount() override; 127 : const GDAL_GCP *GetGCPs() override; 128 : 129 : bool GetRawBinaryLayout(GDALDataset::RawBinaryLayout &) override; 130 : 131 : static GDALDataset *Open(GDALOpenInfo *); 132 : static ENVIDataset *Open(GDALOpenInfo *, bool bFileSizeCheck); 133 : static GDALDataset *Create(const char *pszFilename, int nXSize, int nYSize, 134 : int nBands, GDALDataType eType, 135 : char **papszOptions); 136 : }; 137 : 138 : /************************************************************************/ 139 : /* ==================================================================== */ 140 : /* ENVIRasterBand */ 141 : /* ==================================================================== */ 142 : /************************************************************************/ 143 : 144 : class ENVIRasterBand final : public RawRasterBand 145 : { 146 : CPL_DISALLOW_COPY_ASSIGN(ENVIRasterBand) 147 : 148 : public: 149 : ENVIRasterBand(GDALDataset *poDSIn, int nBandIn, VSILFILE *fpRawIn, 150 : vsi_l_offset nImgOffsetIn, int nPixelOffsetIn, 151 : int nLineOffsetIn, GDALDataType eDataTypeIn, 152 : RawRasterBand::ByteOrder eByteOrderIn); 153 : 154 : void SetDescription(const char *) override; 155 : CPLErr SetNoDataValue(double) override; 156 : CPLErr SetColorInterpretation(GDALColorInterp eColorInterp) override; 157 : CPLErr SetOffset(double) override; 158 : CPLErr SetScale(double) override; 159 : 160 : CPLErr SetCategoryNames(char **) override; 161 : }; 162 : 163 : #endif // GDAL_FRMTS_RAW_ENVIDATASET_H_INCLUDED