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