Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: GDAL 4 : * Purpose: Implements Arc/Info ASCII Grid Format. 5 : * Author: Frank Warmerdam, warmerdam@pobox.com 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) 2001, Frank Warmerdam (warmerdam@pobox.com) 9 : * Copyright (c) 2007-2012, Even Rouault <even dot rouault at spatialys.com> 10 : * Copyright (c) 2014, Kyle Shannon <kyle at pobox dot com> 11 : * 12 : * SPDX-License-Identifier: MIT 13 : ****************************************************************************/ 14 : 15 : #ifndef GDAL_FRMTS_AAIGRID_AAIGRIDDATASET_H_INCLUDED 16 : #define GDAL_FRMTS_AAIGRID_AAIGRIDDATASET_H_INCLUDED 17 : 18 : // We need cpl_port as first include to avoid VSIStatBufL being not 19 : // defined on i586-mingw32msvc. 20 : #include "cpl_port.h" 21 : #include "gdal_frmts.h" 22 : 23 : #include <cctype> 24 : #include <climits> 25 : #include <cmath> 26 : #include <cstddef> 27 : #include <cstdio> 28 : #include <cstdlib> 29 : #include <cstring> 30 : #if HAVE_FCNTL_H 31 : #include <fcntl.h> 32 : #endif 33 : 34 : #include <algorithm> 35 : #include <limits> 36 : #include <string> 37 : 38 : #include "cpl_conv.h" 39 : #include "cpl_error.h" 40 : #include "cpl_progress.h" 41 : #include "cpl_string.h" 42 : #include "cpl_vsi.h" 43 : #include "gdal.h" 44 : #include "gdal_pam.h" 45 : #include "gdal_priv.h" 46 : #include "ogr_core.h" 47 : #include "ogr_spatialref.h" 48 : 49 : typedef enum 50 : { 51 : FORMAT_AAIG, 52 : FORMAT_GRASSASCII, 53 : FORMAT_ISG, 54 : } GridFormat; 55 : 56 : /************************************************************************/ 57 : /* ==================================================================== */ 58 : /* AAIGDataset */ 59 : /* ==================================================================== */ 60 : /************************************************************************/ 61 : 62 : class AAIGRasterBand; 63 : 64 : class AAIGDataset CPL_NON_FINAL : public GDALPamDataset 65 : { 66 : friend class AAIGRasterBand; 67 : 68 : VSILFILE *fp; 69 : 70 : char **papszPrj; 71 : CPLString osPrjFilename; 72 : OGRSpatialReference m_oSRS{}; 73 : 74 : unsigned char achReadBuf[256]; 75 : GUIntBig nBufferOffset; 76 : int nOffsetInBuffer; 77 : 78 : char Getc(); 79 : GUIntBig Tell() const; 80 : int Seek(GUIntBig nOffset); 81 : 82 : protected: 83 : GDALDataType eDataType; 84 : double adfGeoTransform[6]; 85 : bool bNoDataSet; 86 : double dfNoDataValue; 87 : CPLString osUnits{}; 88 : 89 : virtual int ParseHeader(const char *pszHeader, const char *pszDataType); 90 : 91 : public: 92 : AAIGDataset(); 93 : ~AAIGDataset() override; 94 : 95 : char **GetFileList(void) override; 96 : 97 : static GDALDataset *CommonOpen(GDALOpenInfo *poOpenInfo, 98 : GridFormat eFormat); 99 : 100 : static GDALDataset *Open(GDALOpenInfo *); 101 : static int Identify(GDALOpenInfo *); 102 : static CPLErr Delete(const char *pszFilename); 103 : static CPLErr Remove(const char *pszFilename, int bRepError); 104 : static GDALDataset *CreateCopy(const char *pszFilename, 105 : GDALDataset *poSrcDS, int bStrict, 106 : char **papszOptions, 107 : GDALProgressFunc pfnProgress, 108 : void *pProgressData); 109 : 110 : CPLErr GetGeoTransform(double *) override; 111 : const OGRSpatialReference *GetSpatialRef() const override; 112 : }; 113 : 114 : /************************************************************************/ 115 : /* ==================================================================== */ 116 : /* GRASSASCIIDataset */ 117 : /* ==================================================================== */ 118 : /************************************************************************/ 119 : 120 : class GRASSASCIIDataset final : public AAIGDataset 121 : { 122 : int ParseHeader(const char *pszHeader, const char *pszDataType) override; 123 : 124 : public: 125 2 : GRASSASCIIDataset() : AAIGDataset() 126 : { 127 2 : } 128 : 129 4 : ~GRASSASCIIDataset() override 130 2 : { 131 4 : } 132 : 133 : static GDALDataset *Open(GDALOpenInfo *); 134 : static int Identify(GDALOpenInfo *); 135 : }; 136 : 137 : /************************************************************************/ 138 : /* ==================================================================== */ 139 : /* ISGDataset */ 140 : /* ==================================================================== */ 141 : /************************************************************************/ 142 : 143 : class ISGDataset final : public AAIGDataset 144 : { 145 : int ParseHeader(const char *pszHeader, const char *pszDataType) override; 146 : 147 : public: 148 8 : ISGDataset() : AAIGDataset() 149 : { 150 8 : } 151 : 152 : static GDALDataset *Open(GDALOpenInfo *); 153 : static int Identify(GDALOpenInfo *); 154 : }; 155 : 156 : /************************************************************************/ 157 : /* ==================================================================== */ 158 : /* AAIGRasterBand */ 159 : /* ==================================================================== */ 160 : /************************************************************************/ 161 : 162 : class AAIGRasterBand final : public GDALPamRasterBand 163 : { 164 : friend class AAIGDataset; 165 : 166 : GUIntBig *panLineOffset; 167 : 168 : public: 169 : AAIGRasterBand(AAIGDataset *, int); 170 : ~AAIGRasterBand() override; 171 : 172 : double GetNoDataValue(int *) override; 173 : CPLErr SetNoDataValue(double) override; 174 : CPLErr IReadBlock(int, int, void *) override; 175 : }; 176 : 177 : #endif // GDAL_FRMTS_AAIGRID_AAIGRIDDATASET_H_INCLUDED