Line data Source code
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 : public:
55 : PCIDSK2Dataset();
56 : virtual ~PCIDSK2Dataset();
57 :
58 : static GDALDataset *Open(GDALOpenInfo *);
59 : static GDALDataset *LLOpen(const char *pszFilename, PCIDSK::PCIDSKFile *,
60 : GDALAccess eAccess,
61 : char **papszSiblingFiles = nullptr);
62 : static GDALDataset *Create(const char *pszFilename, int nXSize, int nYSize,
63 : int nBands, GDALDataType eType,
64 : char **papszParamList);
65 :
66 : char **GetFileList() override;
67 : CPLErr GetGeoTransform(double *padfTransform) override;
68 : CPLErr SetGeoTransform(double *) override;
69 :
70 : const OGRSpatialReference *GetSpatialRef() const override;
71 : CPLErr SetSpatialRef(const OGRSpatialReference *poSRS) override;
72 :
73 : virtual char **GetMetadataDomainList() override;
74 : CPLErr SetMetadata(char **, const char *) override;
75 : char **GetMetadata(const char *) override;
76 : CPLErr SetMetadataItem(const char *, const char *, const char *) override;
77 : const char *GetMetadataItem(const char *, const char *) override;
78 :
79 : virtual CPLErr FlushCache(bool bAtClosing) override;
80 :
81 : virtual CPLErr IBuildOverviews(const char *, int, const int *, int,
82 : const int *, GDALProgressFunc, void *,
83 : CSLConstList papszOptions) override;
84 :
85 740 : virtual int GetLayerCount() override
86 : {
87 740 : return (int)apoLayers.size();
88 : }
89 :
90 : virtual OGRLayer *GetLayer(int) override;
91 :
92 : virtual int TestCapability(const char *) override;
93 :
94 : OGRLayer *ICreateLayer(const char *pszName,
95 : const OGRGeomFieldDefn *poGeomFieldDefn,
96 : CSLConstList papszOptions) override;
97 : };
98 :
99 : /************************************************************************/
100 : /* PCIDSK2Band */
101 : /************************************************************************/
102 :
103 : class PCIDSK2Band final : public GDALPamRasterBand
104 : {
105 : friend class PCIDSK2Dataset;
106 :
107 : PCIDSK::PCIDSKChannel *poChannel;
108 : PCIDSK::PCIDSKFile *poFile;
109 :
110 : void RefreshOverviewList();
111 : std::vector<PCIDSK2Band *> apoOverviews;
112 :
113 : std::unordered_map<std::string, std::string> m_oCacheMetadataItem{};
114 : char **papszLastMDListValue;
115 :
116 : bool CheckForColorTable();
117 : GDALColorTable *poColorTable;
118 : bool bCheckedForColorTable;
119 : int nPCTSegNumber;
120 :
121 : char **papszCategoryNames;
122 :
123 : void Initialize();
124 :
125 : public:
126 : PCIDSK2Band(PCIDSK::PCIDSKFile *poFileIn,
127 : PCIDSK::PCIDSKChannel *poChannelIn);
128 : explicit PCIDSK2Band(PCIDSK::PCIDSKChannel *);
129 : virtual ~PCIDSK2Band();
130 :
131 : virtual CPLErr IReadBlock(int, int, void *) override;
132 : virtual CPLErr IWriteBlock(int, int, void *) override;
133 :
134 : virtual int GetOverviewCount() override;
135 : virtual GDALRasterBand *GetOverview(int) override;
136 :
137 : virtual GDALColorInterp GetColorInterpretation() override;
138 : virtual GDALColorTable *GetColorTable() override;
139 : virtual CPLErr SetColorTable(GDALColorTable *) override;
140 :
141 : virtual void SetDescription(const char *) override;
142 :
143 : virtual char **GetMetadataDomainList() override;
144 : CPLErr SetMetadata(char **, const char *) override;
145 : char **GetMetadata(const char *) override;
146 : CPLErr SetMetadataItem(const char *, const char *, const char *) override;
147 : const char *GetMetadataItem(const char *, const char *) override;
148 :
149 : virtual char **GetCategoryNames() override;
150 : };
151 :
152 : /************************************************************************/
153 : /* OGRPCIDSKLayer */
154 : /************************************************************************/
155 :
156 : class OGRPCIDSKLayer final : public OGRLayer,
157 : public OGRGetNextFeatureThroughRaw<OGRPCIDSKLayer>
158 : {
159 : GDALDataset *m_poDS = nullptr;
160 : PCIDSK::PCIDSKVectorSegment *poVecSeg;
161 : PCIDSK::PCIDSKSegment *poSeg;
162 :
163 : OGRFeatureDefn *poFeatureDefn;
164 :
165 : OGRFeature *GetNextRawFeature();
166 :
167 : int iRingStartField;
168 : PCIDSK::ShapeId hLastShapeId;
169 :
170 : bool bUpdateAccess;
171 :
172 : OGRSpatialReference *poSRS;
173 :
174 : std::unordered_map<std::string, int> m_oMapFieldNameToIdx{};
175 : bool m_bEOF = false;
176 :
177 : public:
178 : OGRPCIDSKLayer(GDALDataset *poDS, PCIDSK::PCIDSKSegment *,
179 : PCIDSK::PCIDSKVectorSegment *, bool bUpdate);
180 : virtual ~OGRPCIDSKLayer();
181 :
182 : void ResetReading() override;
183 237 : DEFINE_GET_NEXT_FEATURE_THROUGH_RAW(OGRPCIDSKLayer)
184 :
185 : OGRFeature *GetFeature(GIntBig nFeatureId) override;
186 : virtual OGRErr ISetFeature(OGRFeature *poFeature) override;
187 :
188 2708 : OGRFeatureDefn *GetLayerDefn() override
189 : {
190 2708 : return poFeatureDefn;
191 : }
192 :
193 : int TestCapability(const char *) override;
194 :
195 : OGRErr DeleteFeature(GIntBig nFID) override;
196 : virtual OGRErr ICreateFeature(OGRFeature *poFeature) override;
197 : virtual OGRErr CreateField(const OGRFieldDefn *poField,
198 : int bApproxOK = TRUE) override;
199 :
200 : GIntBig GetFeatureCount(int) override;
201 : OGRErr GetExtent(OGREnvelope *psExtent, int bForce) override;
202 :
203 16 : virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent,
204 : int bForce) override
205 : {
206 16 : return OGRLayer::GetExtent(iGeomField, psExtent, bForce);
207 : }
208 :
209 17 : GDALDataset *GetDataset() override
210 : {
211 17 : return m_poDS;
212 : }
213 : };
214 :
215 : #endif /* PCIDSKDATASET2_H_INCLUDED */
|