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