/src/gdal/ogr/ogrsf_frmts/edigeo/ogr_edigeo.h
Line | Count | Source |
1 | | /****************************************************************************** |
2 | | * |
3 | | * Project: EDIGEO Translator |
4 | | * Purpose: Definition of classes for OGR .edigeo driver. |
5 | | * Author: Even Rouault, even dot rouault at spatialys.com |
6 | | * |
7 | | ****************************************************************************** |
8 | | * Copyright (c) 2011, Even Rouault <even dot rouault at spatialys.com> |
9 | | * |
10 | | * SPDX-License-Identifier: MIT |
11 | | ****************************************************************************/ |
12 | | |
13 | | #ifndef OGR_EDIGEO_H_INCLUDED |
14 | | #define OGR_EDIGEO_H_INCLUDED |
15 | | |
16 | | #include "ogrsf_frmts.h" |
17 | | #include <vector> |
18 | | #include <map> |
19 | | #include <mutex> |
20 | | #include <set> |
21 | | |
22 | | /************************************************************************/ |
23 | | /* OGREDIGEOLayer */ |
24 | | /************************************************************************/ |
25 | | |
26 | | class OGREDIGEODataSource; |
27 | | |
28 | | class OGREDIGEOLayer final : public OGRLayer, |
29 | | public OGRGetNextFeatureThroughRaw<OGREDIGEOLayer> |
30 | | { |
31 | | OGREDIGEODataSource *poDS; |
32 | | |
33 | | OGRFeatureDefn *poFeatureDefn; |
34 | | OGRSpatialReference *poSRS; |
35 | | |
36 | | int nNextFID; |
37 | | |
38 | | OGRFeature *GetNextRawFeature(); |
39 | | |
40 | | std::vector<OGRFeature *> aosFeatures; |
41 | | |
42 | | /* Map attribute RID ('TEX2_id') to its index in the OGRFeatureDefn */ |
43 | | std::map<CPLString, int> mapAttributeToIndex; |
44 | | |
45 | | public: |
46 | | OGREDIGEOLayer(OGREDIGEODataSource *poDS, const char *pszName, |
47 | | OGRwkbGeometryType eType, OGRSpatialReference *poSRS); |
48 | | ~OGREDIGEOLayer() override; |
49 | | |
50 | | void ResetReading() override; |
51 | | DEFINE_GET_NEXT_FEATURE_THROUGH_RAW(OGREDIGEOLayer) |
52 | | OGRFeature *GetFeature(GIntBig nFID) override; |
53 | | GIntBig GetFeatureCount(int bForce) override; |
54 | | |
55 | | OGRFeatureDefn *GetLayerDefn() const override |
56 | 0 | { |
57 | 0 | return poFeatureDefn; |
58 | 0 | } |
59 | | |
60 | | bool TestCapability(const char *) const override; |
61 | | |
62 | | void AddFeature(OGRFeature *poFeature); |
63 | | |
64 | | int GetAttributeIndex(const CPLString &osRID); |
65 | | void AddFieldDefn(const CPLString &osName, OGRFieldType eType, |
66 | | const CPLString &osRID); |
67 | | }; |
68 | | |
69 | | /************************************************************************/ |
70 | | /* OGREDIGEODataSource */ |
71 | | /************************************************************************/ |
72 | | |
73 | | typedef std::pair<int, int> intintType; |
74 | | typedef std::pair<double, double> xyPairType; |
75 | | typedef std::vector<xyPairType> xyPairListType; |
76 | | typedef std::pair<CPLString, CPLString> strstrType; |
77 | | typedef std::vector<CPLString> strListType; |
78 | | |
79 | | /* From the .DIC file */ |
80 | | class OGREDIGEOAttributeDef |
81 | | { |
82 | | public: |
83 | | OGREDIGEOAttributeDef() |
84 | 0 | { |
85 | 0 | } |
86 | | |
87 | | CPLString osLAB; /* e.g. TEX2 */ |
88 | | CPLString osTYP; /* e.g. T */ |
89 | | }; |
90 | | |
91 | | /* From the .SCD file */ |
92 | | class OGREDIGEOObjectDescriptor |
93 | | { |
94 | | public: |
95 | | OGREDIGEOObjectDescriptor() |
96 | 0 | { |
97 | 0 | } |
98 | | |
99 | | CPLString osRID; /* e.g. BATIMENT_id */ |
100 | | CPLString osNameRID; /* e.g. ID_N_OBJ_E_2_1_0 */ |
101 | | CPLString osKND; /* e.g. ARE */ |
102 | | strListType aosAttrRID; /* e.g. DUR_id, TEX_id */ |
103 | | }; |
104 | | |
105 | | /* From the .SCD file */ |
106 | | class OGREDIGEOAttributeDescriptor |
107 | | { |
108 | | public: |
109 | 0 | OGREDIGEOAttributeDescriptor() : nWidth(0) |
110 | 0 | { |
111 | 0 | } |
112 | | |
113 | | CPLString osRID; /* e.g. TEX2_id */ |
114 | | CPLString osNameRID; /* e.g. ID_N_ATT_TEX2 */ |
115 | | int nWidth; /* e.g. 80 */ |
116 | | }; |
117 | | |
118 | | /* From the .VEC files */ |
119 | | class OGREDIGEOFEADesc |
120 | | { |
121 | | public: |
122 | | OGREDIGEOFEADesc() |
123 | 0 | { |
124 | 0 | } |
125 | | |
126 | | std::vector<strstrType> |
127 | | aosAttIdVal; /* e.g. (TEX2_id,BECHEREL),(IDU_id,022) */ |
128 | | CPLString osSCP; /* e.g. COMMUNE_id */ |
129 | | CPLString osQUP_RID; /* e.g. Actualite_Objet_X */ |
130 | | }; |
131 | | |
132 | | class OGREDIGEODataSource final : public GDALDataset |
133 | | { |
134 | | friend class OGREDIGEOLayer; |
135 | | |
136 | | mutable VSILFILE *fpTHF; |
137 | | |
138 | | mutable OGRLayer **papoLayers; |
139 | | mutable int nLayers; |
140 | | |
141 | | VSILFILE *OpenFile(const char *pszType, const CPLString &osExt) const; |
142 | | |
143 | | // TODO: Translate comments to English. |
144 | | mutable CPLString osLON; /* Nom du lot */ |
145 | | mutable CPLString osGNN; /* Nom du sous-ensemble de données générales */ |
146 | | mutable CPLString |
147 | | osGON; /* Nom du sous-ensemble de la référence de coordonnées */ |
148 | | mutable CPLString osQAN; /* Nom du sous-ensemble de qualité */ |
149 | | mutable CPLString |
150 | | osDIN; /* Nom du sous-ensemble de définition de la nomenclature */ |
151 | | mutable CPLString osSCN; /* Nom du sous-ensemble de définition du SCD */ |
152 | | mutable strListType |
153 | | aosGDN; /* Nom du sous-ensemble de données géographiques */ |
154 | | int ReadTHF(VSILFILE *fp) const; |
155 | | |
156 | | mutable CPLString osREL; |
157 | | mutable OGRSpatialReference *poSRS; |
158 | | int ReadGEO() const; |
159 | | |
160 | | /* Map from ID_N_OBJ_E_2_1_0 to OBJ_E_2_1_0 */ |
161 | | mutable std::map<CPLString, CPLString> mapObjects; |
162 | | |
163 | | /* Map from ID_N_ATT_TEX2 to (osLAB=TEX2, osTYP=T) */ |
164 | | mutable std::map<CPLString, OGREDIGEOAttributeDef> mapAttributes; |
165 | | int ReadDIC() const; |
166 | | |
167 | | mutable std::vector<OGREDIGEOObjectDescriptor> aoObjList; |
168 | | /* Map from TEX2_id to (osNameRID=ID_N_ATT_TEX2, nWidth=80) */ |
169 | | mutable std::map<CPLString, OGREDIGEOAttributeDescriptor> mapAttributesSCD; |
170 | | int ReadSCD() const; |
171 | | |
172 | | mutable int bExtentValid; |
173 | | mutable double dfMinX; |
174 | | mutable double dfMinY; |
175 | | mutable double dfMaxX; |
176 | | mutable double dfMaxY; |
177 | | int ReadGEN() const; |
178 | | |
179 | | /* Map from Actualite_Objet_X to (creationData, updateData) */ |
180 | | mutable std::map<CPLString, intintType> mapQAL; |
181 | | int ReadQAL() const; |
182 | | |
183 | | mutable std::map<CPLString, OGREDIGEOLayer *> mapLayer; |
184 | | |
185 | | int |
186 | | CreateLayerFromObjectDesc(const OGREDIGEOObjectDescriptor &objDesc) const; |
187 | | |
188 | | mutable std::map<CPLString, xyPairType> mapPNO; /* Map Noeud_X to (x,y) */ |
189 | | mutable std::map<CPLString, xyPairListType> |
190 | | mapPAR; /* Map Arc_X to ((x1,y1),...(xn,yn)) */ |
191 | | mutable std::map<CPLString, OGREDIGEOFEADesc> |
192 | | mapFEA; /* Map Object_X to FEADesc */ |
193 | | mutable std::map<CPLString, strListType> |
194 | | mapPFE_PAR; /* Map Face_X to (Arc_X1,..Arc_Xn) */ |
195 | | mutable std::vector<std::pair<CPLString, strListType>> |
196 | | listFEA_PFE; /* List of (Object_X,(Face_Y1,..Face_Yn)) */ |
197 | | mutable std::vector<std::pair<CPLString, strListType>> |
198 | | listFEA_PAR; /* List of (Object_X,(Arc_Y1,..Arc_Yn))) */ |
199 | | mutable std::vector<strstrType> |
200 | | listFEA_PNO; /* List of (Object_X,Noeud_Y) */ |
201 | | mutable std::map<CPLString, CPLString> |
202 | | mapFEA_FEA; /* Map Attribut_TEX{X}_id_Objet_{Y} to Objet_Y */ |
203 | | |
204 | | mutable int bRecodeToUTF8; |
205 | | mutable bool bHasUTF8ContentOnly; |
206 | | |
207 | | int ReadVEC(const char *pszVECName) const; |
208 | | |
209 | | OGRFeature *CreateFeature(const CPLString &osFEA) const; |
210 | | int BuildPoints() const; |
211 | | int BuildLineStrings() const; |
212 | | int BuildPolygon(const CPLString &osFEA, const strListType &aosPFE) const; |
213 | | int BuildPolygons() const; |
214 | | |
215 | | mutable int iATR, iDI3, iDI4, iHEI, iFON; |
216 | | mutable int iATR_VAL, iANGLE, iSIZE, iOBJ_LNK, iOBJ_LNK_LAYER; |
217 | | mutable double dfSizeFactor; |
218 | | mutable int bIncludeFontFamily; |
219 | | int SetStyle(const CPLString &osFEA, OGRFeature *poFeature) const; |
220 | | |
221 | | mutable std::set<CPLString> setLayersWithLabels; |
222 | | void CreateLabelLayers() const; |
223 | | |
224 | | mutable bool bHasReadEDIGEO = false; |
225 | | mutable std::recursive_mutex m_oMutex{}; |
226 | | void ReadEDIGEO() const; |
227 | | |
228 | | public: |
229 | | OGREDIGEODataSource(); |
230 | | ~OGREDIGEODataSource() override; |
231 | | |
232 | | int Open(const char *pszFilename); |
233 | | |
234 | | int GetLayerCount() const override; |
235 | | const OGRLayer *GetLayer(int) const override; |
236 | | |
237 | | bool HasUTF8ContentOnly() |
238 | 0 | { |
239 | 0 | return bHasUTF8ContentOnly; |
240 | 0 | } |
241 | | }; |
242 | | |
243 | | #endif /* ndef OGR_EDIGEO_H_INCLUDED */ |