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