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