Line data Source code
1 : /******************************************************************************
2 : * $Id$
3 : *
4 : * Project: PCIDSK Database File
5 : * Purpose: Read/write PCIDSK Database File used by the PCI software, using
6 : * the external PCIDSK library.
7 : * Author: Frank Warmerdam, warmerdam@pobox.com
8 : *
9 : ******************************************************************************
10 : * Copyright (c) 2009, Frank Warmerdam <warmerdam@pobox.com>
11 : * Copyright (c) 2009-2013, Even Rouault <even dot rouault at spatialys.com>
12 : *
13 : * Permission is hereby granted, free of charge, to any person obtaining a
14 : * copy of this software and associated documentation files (the "Software"),
15 : * to deal in the Software without restriction, including without limitation
16 : * the rights to use, copy, modify, merge, publish, distribute, sublicense,
17 : * and/or sell copies of the Software, and to permit persons to whom the
18 : * Software is furnished to do so, subject to the following conditions:
19 : *
20 : * The above copyright notice and this permission notice shall be included
21 : * in all copies or substantial portions of the Software.
22 : *
23 : * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
24 : * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25 : * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
26 : * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27 : * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
28 : * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
29 : * DEALINGS IN THE SOFTWARE.
30 : ****************************************************************************/
31 :
32 : #ifndef PCIDSKDATASET2_H_INCLUDED
33 : #define PCIDSKDATASET2_H_INCLUDED
34 :
35 : #define GDAL_PCIDSK_DRIVER
36 :
37 : #include "cpl_string.h"
38 : #include "gdal_pam.h"
39 : #include "ogrsf_frmts.h"
40 : #include "ogr_spatialref.h"
41 : #include "pcidsk.h"
42 : #include "pcidsk_pct.h"
43 : #include "pcidsk_vectorsegment.h"
44 :
45 : #include <unordered_map>
46 :
47 : using namespace PCIDSK;
48 :
49 : class OGRPCIDSKLayer;
50 :
51 : /************************************************************************/
52 : /* PCIDSK2Dataset */
53 : /************************************************************************/
54 :
55 : class PCIDSK2Dataset final : public GDALPamDataset
56 : {
57 : friend class PCIDSK2Band;
58 :
59 : mutable OGRSpatialReference *m_poSRS = nullptr;
60 :
61 : std::unordered_map<std::string, std::string> m_oCacheMetadataItem{};
62 : char **papszLastMDListValue;
63 :
64 : PCIDSK::PCIDSKFile *poFile;
65 :
66 : std::vector<OGRPCIDSKLayer *> apoLayers;
67 :
68 : static GDALDataType PCIDSKTypeToGDAL(PCIDSK::eChanType eType);
69 : void ProcessRPC();
70 :
71 : public:
72 : PCIDSK2Dataset();
73 : virtual ~PCIDSK2Dataset();
74 :
75 : static GDALDataset *Open(GDALOpenInfo *);
76 : static GDALDataset *LLOpen(const char *pszFilename, PCIDSK::PCIDSKFile *,
77 : GDALAccess eAccess,
78 : char **papszSiblingFiles = nullptr);
79 : static GDALDataset *Create(const char *pszFilename, int nXSize, int nYSize,
80 : int nBands, GDALDataType eType,
81 : char **papszParamList);
82 :
83 : char **GetFileList() override;
84 : CPLErr GetGeoTransform(double *padfTransform) override;
85 : CPLErr SetGeoTransform(double *) override;
86 :
87 : const OGRSpatialReference *GetSpatialRef() const override;
88 : CPLErr SetSpatialRef(const OGRSpatialReference *poSRS) override;
89 :
90 : virtual char **GetMetadataDomainList() override;
91 : CPLErr SetMetadata(char **, const char *) override;
92 : char **GetMetadata(const char *) override;
93 : CPLErr SetMetadataItem(const char *, const char *, const char *) override;
94 : const char *GetMetadataItem(const char *, const char *) override;
95 :
96 : virtual CPLErr FlushCache(bool bAtClosing) override;
97 :
98 : virtual CPLErr IBuildOverviews(const char *, int, const int *, int,
99 : const int *, GDALProgressFunc, void *,
100 : CSLConstList papszOptions) override;
101 :
102 740 : virtual int GetLayerCount() override
103 : {
104 740 : return (int)apoLayers.size();
105 : }
106 :
107 : virtual OGRLayer *GetLayer(int) override;
108 :
109 : virtual int TestCapability(const char *) override;
110 :
111 : OGRLayer *ICreateLayer(const char *pszName,
112 : const OGRGeomFieldDefn *poGeomFieldDefn,
113 : CSLConstList papszOptions) override;
114 : };
115 :
116 : /************************************************************************/
117 : /* PCIDSK2Band */
118 : /************************************************************************/
119 :
120 : class PCIDSK2Band final : public GDALPamRasterBand
121 : {
122 : friend class PCIDSK2Dataset;
123 :
124 : PCIDSK::PCIDSKChannel *poChannel;
125 : PCIDSK::PCIDSKFile *poFile;
126 :
127 : void RefreshOverviewList();
128 : std::vector<PCIDSK2Band *> apoOverviews;
129 :
130 : std::unordered_map<std::string, std::string> m_oCacheMetadataItem{};
131 : char **papszLastMDListValue;
132 :
133 : bool CheckForColorTable();
134 : GDALColorTable *poColorTable;
135 : bool bCheckedForColorTable;
136 : int nPCTSegNumber;
137 :
138 : char **papszCategoryNames;
139 :
140 : void Initialize();
141 :
142 : public:
143 : PCIDSK2Band(PCIDSK::PCIDSKFile *poFileIn,
144 : PCIDSK::PCIDSKChannel *poChannelIn);
145 : explicit PCIDSK2Band(PCIDSK::PCIDSKChannel *);
146 : virtual ~PCIDSK2Band();
147 :
148 : virtual CPLErr IReadBlock(int, int, void *) override;
149 : virtual CPLErr IWriteBlock(int, int, void *) override;
150 :
151 : virtual int GetOverviewCount() override;
152 : virtual GDALRasterBand *GetOverview(int) override;
153 :
154 : virtual GDALColorInterp GetColorInterpretation() override;
155 : virtual GDALColorTable *GetColorTable() override;
156 : virtual CPLErr SetColorTable(GDALColorTable *) override;
157 :
158 : virtual void SetDescription(const char *) override;
159 :
160 : virtual char **GetMetadataDomainList() override;
161 : CPLErr SetMetadata(char **, const char *) override;
162 : char **GetMetadata(const char *) override;
163 : CPLErr SetMetadataItem(const char *, const char *, const char *) override;
164 : const char *GetMetadataItem(const char *, const char *) override;
165 :
166 : virtual char **GetCategoryNames() override;
167 : };
168 :
169 : /************************************************************************/
170 : /* OGRPCIDSKLayer */
171 : /************************************************************************/
172 :
173 : class OGRPCIDSKLayer final : public OGRLayer,
174 : public OGRGetNextFeatureThroughRaw<OGRPCIDSKLayer>
175 : {
176 : GDALDataset *m_poDS = nullptr;
177 : PCIDSK::PCIDSKVectorSegment *poVecSeg;
178 : PCIDSK::PCIDSKSegment *poSeg;
179 :
180 : OGRFeatureDefn *poFeatureDefn;
181 :
182 : OGRFeature *GetNextRawFeature();
183 :
184 : int iRingStartField;
185 : PCIDSK::ShapeId hLastShapeId;
186 :
187 : bool bUpdateAccess;
188 :
189 : OGRSpatialReference *poSRS;
190 :
191 : std::unordered_map<std::string, int> m_oMapFieldNameToIdx{};
192 : bool m_bEOF = false;
193 :
194 : public:
195 : OGRPCIDSKLayer(GDALDataset *poDS, PCIDSK::PCIDSKSegment *,
196 : PCIDSK::PCIDSKVectorSegment *, bool bUpdate);
197 : virtual ~OGRPCIDSKLayer();
198 :
199 : void ResetReading() override;
200 237 : DEFINE_GET_NEXT_FEATURE_THROUGH_RAW(OGRPCIDSKLayer)
201 :
202 : OGRFeature *GetFeature(GIntBig nFeatureId) override;
203 : virtual OGRErr ISetFeature(OGRFeature *poFeature) override;
204 :
205 2726 : OGRFeatureDefn *GetLayerDefn() override
206 : {
207 2726 : return poFeatureDefn;
208 : }
209 :
210 : int TestCapability(const char *) override;
211 :
212 : OGRErr DeleteFeature(GIntBig nFID) override;
213 : virtual OGRErr ICreateFeature(OGRFeature *poFeature) override;
214 : virtual OGRErr CreateField(const OGRFieldDefn *poField,
215 : int bApproxOK = TRUE) override;
216 :
217 : GIntBig GetFeatureCount(int) override;
218 : OGRErr GetExtent(OGREnvelope *psExtent, int bForce) override;
219 :
220 16 : virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent,
221 : int bForce) override
222 : {
223 16 : return OGRLayer::GetExtent(iGeomField, psExtent, bForce);
224 : }
225 :
226 17 : GDALDataset *GetDataset() override
227 : {
228 17 : return m_poDS;
229 : }
230 : };
231 :
232 : #endif /* PCIDSKDATASET2_H_INCLUDED */
|