/src/gdal/frmts/pcidsk/pcidskdataset2.h
Line | Count | Source |
1 | | /****************************************************************************** |
2 | | * |
3 | | * Project: PCIDSK Database File |
4 | | * Purpose: Read/write PCIDSK Database File used by the PCI software, using |
5 | | * the external PCIDSK library. |
6 | | * Author: Frank Warmerdam, warmerdam@pobox.com |
7 | | * |
8 | | ****************************************************************************** |
9 | | * Copyright (c) 2009, Frank Warmerdam <warmerdam@pobox.com> |
10 | | * Copyright (c) 2009-2013, Even Rouault <even dot rouault at spatialys.com> |
11 | | * |
12 | | * SPDX-License-Identifier: MIT |
13 | | ****************************************************************************/ |
14 | | |
15 | | #ifndef PCIDSKDATASET2_H_INCLUDED |
16 | | #define PCIDSKDATASET2_H_INCLUDED |
17 | | |
18 | | #define GDAL_PCIDSK_DRIVER |
19 | | |
20 | | #include "cpl_string.h" |
21 | | #include "gdal_pam.h" |
22 | | #include "ogrsf_frmts.h" |
23 | | #include "ogr_spatialref.h" |
24 | | #include "pcidsk.h" |
25 | | #include "pcidsk_pct.h" |
26 | | #include "pcidsk_vectorsegment.h" |
27 | | |
28 | | #include <unordered_map> |
29 | | |
30 | | using namespace PCIDSK; |
31 | | |
32 | | class OGRPCIDSKLayer; |
33 | | |
34 | | /************************************************************************/ |
35 | | /* PCIDSK2Dataset */ |
36 | | /************************************************************************/ |
37 | | |
38 | | class PCIDSK2Dataset final : public GDALPamDataset |
39 | | { |
40 | | friend class PCIDSK2Band; |
41 | | |
42 | | mutable OGRSpatialReference *m_poSRS = nullptr; |
43 | | |
44 | | std::unordered_map<std::string, std::string> m_oCacheMetadataItem{}; |
45 | | char **papszLastMDListValue; |
46 | | |
47 | | PCIDSK::PCIDSKFile *poFile; |
48 | | |
49 | | std::vector<OGRPCIDSKLayer *> apoLayers; |
50 | | |
51 | | static GDALDataType PCIDSKTypeToGDAL(PCIDSK::eChanType eType); |
52 | | void ProcessRPC(); |
53 | | |
54 | | const OGRSpatialReference *GetSpatialRef(bool bRasterOnly) const; |
55 | | |
56 | | public: |
57 | | PCIDSK2Dataset(); |
58 | | ~PCIDSK2Dataset() override; |
59 | | |
60 | | static GDALDataset *Open(GDALOpenInfo *); |
61 | | static GDALDataset *LLOpen(const char *pszFilename, PCIDSK::PCIDSKFile *, |
62 | | GDALAccess eAccess, |
63 | | char **papszSiblingFiles = nullptr); |
64 | | static GDALDataset *Create(const char *pszFilename, int nXSize, int nYSize, |
65 | | int nBands, GDALDataType eType, |
66 | | CSLConstList papszParamList); |
67 | | |
68 | | char **GetFileList() override; |
69 | | CPLErr GetGeoTransform(GDALGeoTransform >) const override; |
70 | | CPLErr SetGeoTransform(const GDALGeoTransform >) override; |
71 | | |
72 | | const OGRSpatialReference *GetSpatialRef() const override; |
73 | | const OGRSpatialReference *GetSpatialRefRasterOnly() const override; |
74 | | CPLErr SetSpatialRef(const OGRSpatialReference *poSRS) override; |
75 | | |
76 | | char **GetMetadataDomainList() override; |
77 | | CPLErr SetMetadata(CSLConstList, const char *) override; |
78 | | CSLConstList GetMetadata(const char *) override; |
79 | | CPLErr SetMetadataItem(const char *, const char *, const char *) override; |
80 | | const char *GetMetadataItem(const char *, const char *) override; |
81 | | |
82 | | CPLErr FlushCache(bool bAtClosing) override; |
83 | | |
84 | | CPLErr IBuildOverviews(const char *, int, const int *, int, const int *, |
85 | | GDALProgressFunc, void *, |
86 | | CSLConstList papszOptions) override; |
87 | | |
88 | | int GetLayerCount() const override |
89 | 15.4k | { |
90 | 15.4k | return (int)apoLayers.size(); |
91 | 15.4k | } |
92 | | |
93 | | const OGRLayer *GetLayer(int) const override; |
94 | | |
95 | | int TestCapability(const char *) const override; |
96 | | |
97 | | OGRLayer *ICreateLayer(const char *pszName, |
98 | | const OGRGeomFieldDefn *poGeomFieldDefn, |
99 | | CSLConstList papszOptions) override; |
100 | | }; |
101 | | |
102 | | /************************************************************************/ |
103 | | /* PCIDSK2Band */ |
104 | | /************************************************************************/ |
105 | | |
106 | | class PCIDSK2Band final : public GDALPamRasterBand |
107 | | { |
108 | | friend class PCIDSK2Dataset; |
109 | | |
110 | | PCIDSK::PCIDSKChannel *poChannel; |
111 | | PCIDSK::PCIDSKFile *poFile; |
112 | | |
113 | | void RefreshOverviewList(); |
114 | | std::vector<PCIDSK2Band *> apoOverviews; |
115 | | |
116 | | std::unordered_map<std::string, std::string> m_oCacheMetadataItem{}; |
117 | | char **papszLastMDListValue; |
118 | | |
119 | | bool CheckForColorTable(); |
120 | | GDALColorTable *poColorTable; |
121 | | bool bCheckedForColorTable; |
122 | | int nPCTSegNumber; |
123 | | |
124 | | char **papszCategoryNames; |
125 | | |
126 | | void Initialize(); |
127 | | |
128 | | public: |
129 | | PCIDSK2Band(PCIDSK::PCIDSKFile *poFileIn, |
130 | | PCIDSK::PCIDSKChannel *poChannelIn); |
131 | | explicit PCIDSK2Band(PCIDSK::PCIDSKChannel *); |
132 | | ~PCIDSK2Band() override; |
133 | | |
134 | | CPLErr IReadBlock(int, int, void *) override; |
135 | | CPLErr IWriteBlock(int, int, void *) override; |
136 | | |
137 | | int GetOverviewCount() override; |
138 | | GDALRasterBand *GetOverview(int) override; |
139 | | |
140 | | GDALColorInterp GetColorInterpretation() override; |
141 | | GDALColorTable *GetColorTable() override; |
142 | | CPLErr SetColorTable(GDALColorTable *) override; |
143 | | |
144 | | void SetDescription(const char *) override; |
145 | | |
146 | | char **GetMetadataDomainList() override; |
147 | | CPLErr SetMetadata(CSLConstList, const char *) override; |
148 | | CSLConstList GetMetadata(const char *) override; |
149 | | CPLErr SetMetadataItem(const char *, const char *, const char *) override; |
150 | | const char *GetMetadataItem(const char *, const char *) override; |
151 | | double GetNoDataValue(int *) override; |
152 | | CPLErr SetNoDataValue(double dfNoData) override; |
153 | | |
154 | | char **GetCategoryNames() override; |
155 | | }; |
156 | | |
157 | | /************************************************************************/ |
158 | | /* OGRPCIDSKLayer */ |
159 | | /************************************************************************/ |
160 | | |
161 | | class OGRPCIDSKLayer final : public OGRLayer, |
162 | | public OGRGetNextFeatureThroughRaw<OGRPCIDSKLayer> |
163 | | { |
164 | | GDALDataset *m_poDS = nullptr; |
165 | | PCIDSK::PCIDSKVectorSegment *poVecSeg; |
166 | | PCIDSK::PCIDSKSegment *poSeg; |
167 | | |
168 | | OGRFeatureDefn *poFeatureDefn; |
169 | | |
170 | | OGRFeature *GetNextRawFeature(); |
171 | | |
172 | | int iRingStartField; |
173 | | PCIDSK::ShapeId hLastShapeId; |
174 | | |
175 | | bool bUpdateAccess; |
176 | | |
177 | | OGRSpatialReference *poSRS; |
178 | | |
179 | | std::unordered_map<std::string, int> m_oMapFieldNameToIdx{}; |
180 | | bool m_bEOF = false; |
181 | | |
182 | | public: |
183 | | OGRPCIDSKLayer(GDALDataset *poDS, PCIDSK::PCIDSKSegment *, |
184 | | PCIDSK::PCIDSKVectorSegment *, bool bUpdate); |
185 | | ~OGRPCIDSKLayer() override; |
186 | | |
187 | | void ResetReading() override; |
188 | | DEFINE_GET_NEXT_FEATURE_THROUGH_RAW(OGRPCIDSKLayer) |
189 | | |
190 | | OGRFeature *GetFeature(GIntBig nFeatureId) override; |
191 | | OGRErr ISetFeature(OGRFeature *poFeature) override; |
192 | | |
193 | | const OGRFeatureDefn *GetLayerDefn() const override |
194 | 1.40M | { |
195 | 1.40M | return poFeatureDefn; |
196 | 1.40M | } |
197 | | |
198 | | int TestCapability(const char *) const override; |
199 | | |
200 | | OGRErr DeleteFeature(GIntBig nFID) override; |
201 | | OGRErr ICreateFeature(OGRFeature *poFeature) override; |
202 | | virtual OGRErr CreateField(const OGRFieldDefn *poField, |
203 | | int bApproxOK = TRUE) override; |
204 | | |
205 | | GIntBig GetFeatureCount(int) override; |
206 | | OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, |
207 | | bool bForce) override; |
208 | | |
209 | | GDALDataset *GetDataset() override |
210 | 0 | { |
211 | 0 | return m_poDS; |
212 | 0 | } |
213 | | }; |
214 | | |
215 | | #endif /* PCIDSKDATASET2_H_INCLUDED */ |