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