Line data Source code
1 : /******************************************************************************
2 : * $Id$
3 : *
4 : * Project: GML Reader
5 : * Purpose: Public Declarations for OGR free GML Reader code.
6 : * Author: Frank Warmerdam, warmerdam@pobox.com
7 : *
8 : ******************************************************************************
9 : * Copyright (c) 2002, Frank Warmerdam
10 : * Copyright (c) 2008-2013, Even Rouault <even dot rouault at spatialys.com>
11 : *
12 : * SPDX-License-Identifier: MIT
13 : ****************************************************************************/
14 :
15 : #ifndef GMLFEATURE_H_INCLUDED
16 : #define GMLFEATURE_H_INCLUDED
17 :
18 : #include "cpl_port.h"
19 : #include "cpl_vsi.h"
20 : #include "cpl_minixml.h"
21 : #include "ogr_core.h"
22 : #include "ogr_geomcoordinateprecision.h"
23 :
24 : #include <map>
25 : #include <vector>
26 :
27 : typedef enum
28 : {
29 : GMLPT_Untyped = 0,
30 : GMLPT_String = 1,
31 : GMLPT_Integer = 2,
32 : GMLPT_Real = 3,
33 : GMLPT_Complex = 4,
34 : GMLPT_StringList = 5,
35 : GMLPT_IntegerList = 6,
36 : GMLPT_RealList = 7,
37 : GMLPT_FeatureProperty = 8,
38 : GMLPT_FeaturePropertyList = 9,
39 : GMLPT_Boolean = 10,
40 : GMLPT_BooleanList = 11,
41 : GMLPT_Short = 12,
42 : GMLPT_Float = 13,
43 : GMLPT_Integer64 = 14,
44 : GMLPT_Integer64List = 15,
45 : GMLPT_DateTime = 16,
46 : GMLPT_Date = 17,
47 : GMLPT_Time = 18,
48 : } GMLPropertyType;
49 :
50 : /************************************************************************/
51 : /* GMLPropertyDefn */
52 : /************************************************************************/
53 :
54 : typedef struct
55 : {
56 : int nSubProperties;
57 : char **papszSubProperties;
58 : char *aszSubProperties[2]; /* Optimization in the case of nSubProperties ==
59 : 1 */
60 : } GMLProperty;
61 :
62 : class CPL_DLL GMLPropertyDefn
63 : {
64 : char *m_pszName = nullptr;
65 : GMLPropertyType m_eType = GMLPT_Untyped;
66 : int m_nWidth = 0;
67 : int m_nPrecision = 0;
68 : char *m_pszSrcElement = nullptr;
69 : size_t m_nSrcElementLen = 0;
70 : char *m_pszCondition = nullptr;
71 : bool m_bNullable = true;
72 : bool m_bUnique = false;
73 : std::string m_osDocumentation{};
74 :
75 : CPL_DISALLOW_COPY_ASSIGN(GMLPropertyDefn)
76 :
77 : public:
78 : explicit GMLPropertyDefn(const char *pszName,
79 : const char *pszSrcElement = nullptr);
80 : ~GMLPropertyDefn();
81 :
82 9125 : const char *GetName() const
83 : {
84 9125 : return m_pszName;
85 : }
86 :
87 16327 : GMLPropertyType GetType() const
88 : {
89 16327 : return m_eType;
90 : }
91 :
92 2460 : void SetType(GMLPropertyType eType)
93 : {
94 2460 : m_eType = eType;
95 2460 : }
96 :
97 2568 : void SetWidth(int nWidth)
98 : {
99 2568 : m_nWidth = nWidth;
100 2568 : }
101 :
102 4450 : int GetWidth() const
103 : {
104 4450 : return m_nWidth;
105 : }
106 :
107 1704 : void SetPrecision(int nPrecision)
108 : {
109 1704 : m_nPrecision = nPrecision;
110 1704 : }
111 :
112 2725 : int GetPrecision() const
113 : {
114 2725 : return m_nPrecision;
115 : }
116 :
117 : void SetSrcElement(const char *pszSrcElement);
118 :
119 15611 : const char *GetSrcElement() const
120 : {
121 15611 : return m_pszSrcElement;
122 : }
123 :
124 : size_t GetSrcElementLen() const
125 : {
126 : return m_nSrcElementLen;
127 : }
128 :
129 : void SetCondition(const char *pszCondition);
130 :
131 2700 : const char *GetCondition() const
132 : {
133 2700 : return m_pszCondition;
134 : }
135 :
136 2334 : void SetNullable(bool bNullable)
137 : {
138 2334 : m_bNullable = bNullable;
139 2334 : }
140 :
141 108 : bool IsNullable() const
142 : {
143 108 : return m_bNullable;
144 : }
145 :
146 641 : void SetUnique(bool bUnique)
147 : {
148 641 : m_bUnique = bUnique;
149 641 : }
150 :
151 2043 : bool IsUnique() const
152 : {
153 2043 : return m_bUnique;
154 : }
155 :
156 12 : void SetDocumentation(const std::string &osDocumentation)
157 : {
158 12 : m_osDocumentation = osDocumentation;
159 12 : }
160 :
161 2448 : const std::string &GetDocumentation() const
162 : {
163 2448 : return m_osDocumentation;
164 : }
165 :
166 : void AnalysePropertyValue(const GMLProperty *psGMLProperty,
167 : bool bSetWidth = true);
168 :
169 117 : static bool IsSimpleType(GMLPropertyType eType)
170 : {
171 117 : return eType == GMLPT_String || eType == GMLPT_Integer ||
172 117 : eType == GMLPT_Real;
173 : }
174 : };
175 :
176 : /************************************************************************/
177 : /* GMLGeometryPropertyDefn */
178 : /************************************************************************/
179 :
180 : class CPL_DLL GMLGeometryPropertyDefn
181 : {
182 : char *m_pszName = nullptr;
183 : char *m_pszSrcElement = nullptr;
184 : OGRwkbGeometryType m_nGeometryType = wkbUnknown;
185 : const int m_nAttributeIndex = -1;
186 : const bool m_bNullable = true;
187 : bool m_bSRSNameConsistent = true;
188 : std::string m_osSRSName{};
189 : OGRGeomCoordinatePrecision m_oCoordPrecision{};
190 :
191 : CPL_DISALLOW_COPY_ASSIGN(GMLGeometryPropertyDefn)
192 :
193 : public:
194 : GMLGeometryPropertyDefn(const char *pszName, const char *pszSrcElement,
195 : OGRwkbGeometryType nType, int nAttributeIndex,
196 : bool bNullable,
197 : const OGRGeomCoordinatePrecision &oCoordPrec =
198 : OGRGeomCoordinatePrecision());
199 : ~GMLGeometryPropertyDefn();
200 :
201 848 : const char *GetName() const
202 : {
203 848 : return m_pszName;
204 : }
205 :
206 2070 : OGRwkbGeometryType GetType() const
207 : {
208 2070 : return m_nGeometryType;
209 : }
210 :
211 503 : void SetType(OGRwkbGeometryType nType)
212 : {
213 503 : m_nGeometryType = nType;
214 503 : }
215 :
216 3662 : const char *GetSrcElement() const
217 : {
218 3662 : return m_pszSrcElement;
219 : }
220 :
221 288 : int GetAttributeIndex() const
222 : {
223 288 : return m_nAttributeIndex;
224 : }
225 :
226 809 : bool IsNullable() const
227 : {
228 809 : return m_bNullable;
229 : }
230 :
231 589 : const OGRGeomCoordinatePrecision &GetCoordinatePrecision() const
232 : {
233 589 : return m_oCoordPrecision;
234 : }
235 :
236 523 : void SetSRSName(const std::string &srsName)
237 : {
238 523 : m_bSRSNameConsistent = true;
239 523 : m_osSRSName = srsName;
240 523 : }
241 :
242 : void MergeSRSName(const std::string &osSRSName);
243 :
244 589 : const std::string &GetSRSName() const
245 : {
246 589 : return m_osSRSName;
247 : }
248 : };
249 :
250 : /************************************************************************/
251 : /* GMLFeatureClass */
252 : /************************************************************************/
253 :
254 : class CPL_DLL GMLFeatureClass
255 : {
256 : char *m_pszName;
257 : char *m_pszElementName;
258 : int n_nNameLen;
259 : int n_nElementNameLen;
260 : int m_nPropertyCount;
261 : GMLPropertyDefn **m_papoProperty;
262 : std::map<CPLString, int> m_oMapPropertyNameToIndex{};
263 : std::map<CPLString, int> m_oMapPropertySrcElementToIndex{};
264 :
265 : int m_nGeometryPropertyCount;
266 : GMLGeometryPropertyDefn **m_papoGeometryProperty;
267 :
268 : bool m_bSchemaLocked;
269 :
270 : GIntBig m_nFeatureCount;
271 :
272 : char *m_pszExtraInfo;
273 :
274 : bool m_bHaveExtents;
275 : double m_dfXMin;
276 : double m_dfXMax;
277 : double m_dfYMin;
278 : double m_dfYMax;
279 :
280 : char *m_pszSRSName;
281 : bool m_bSRSNameConsistent;
282 :
283 : bool m_bIsConsistentSingleGeomElemPath = true;
284 : std::string m_osSingleGeomElemPath{};
285 :
286 : CPL_DISALLOW_COPY_ASSIGN(GMLFeatureClass)
287 :
288 : public:
289 : explicit GMLFeatureClass(const char *pszName = "");
290 : ~GMLFeatureClass();
291 :
292 : const char *GetElementName() const;
293 : size_t GetElementNameLen() const;
294 : void SetElementName(const char *pszElementName);
295 :
296 4324 : const char *GetName() const
297 : {
298 4324 : return m_pszName;
299 : }
300 :
301 : void SetName(const char *pszNewName);
302 :
303 13998 : int GetPropertyCount() const
304 : {
305 13998 : return m_nPropertyCount;
306 : }
307 :
308 : GMLPropertyDefn *GetProperty(int iIndex) const;
309 : int GetPropertyIndex(const char *pszName) const;
310 :
311 3266 : GMLPropertyDefn *GetProperty(const char *pszName) const
312 : {
313 3266 : return GetProperty(GetPropertyIndex(pszName));
314 : }
315 :
316 : int GetPropertyIndexBySrcElement(const char *pszElement, int nLen) const;
317 : void StealProperties();
318 :
319 10542 : int GetGeometryPropertyCount() const
320 : {
321 10542 : return m_nGeometryPropertyCount;
322 : }
323 :
324 : GMLGeometryPropertyDefn *GetGeometryProperty(int iIndex) const;
325 : int GetGeometryPropertyIndexBySrcElement(const char *pszElement) const;
326 : void StealGeometryProperties();
327 :
328 : bool HasFeatureProperties();
329 :
330 : int AddProperty(GMLPropertyDefn *, int iPos = -1);
331 : int AddGeometryProperty(GMLGeometryPropertyDefn *);
332 : void ClearGeometryProperties();
333 :
334 4 : void SetConsistentSingleGeomElemPath(bool b)
335 : {
336 4 : m_bIsConsistentSingleGeomElemPath = b;
337 4 : }
338 :
339 1291 : bool IsConsistentSingleGeomElemPath() const
340 : {
341 1291 : return m_bIsConsistentSingleGeomElemPath;
342 : }
343 :
344 253 : void SetSingleGeomElemPath(const std::string &s)
345 : {
346 253 : m_osSingleGeomElemPath = s;
347 253 : }
348 :
349 1350 : const std::string &GetSingleGeomElemPath() const
350 : {
351 1350 : return m_osSingleGeomElemPath;
352 : }
353 :
354 45653 : bool IsSchemaLocked() const
355 : {
356 45653 : return m_bSchemaLocked;
357 : }
358 :
359 709 : void SetSchemaLocked(bool bLock)
360 : {
361 709 : m_bSchemaLocked = bLock;
362 709 : }
363 :
364 : const char *GetExtraInfo();
365 : void SetExtraInfo(const char *);
366 :
367 : GIntBig GetFeatureCount();
368 : void SetFeatureCount(GIntBig);
369 :
370 441 : bool HasExtents() const
371 : {
372 441 : return m_bHaveExtents;
373 : }
374 :
375 : void SetExtents(double dfXMin, double dfXMax, double dFYMin, double dfYMax);
376 : bool GetExtents(double *pdfXMin, double *pdfXMax, double *pdFYMin,
377 : double *pdfYMax);
378 :
379 : void SetSRSName(const char *pszSRSName);
380 : void MergeSRSName(const char *pszSRSName);
381 :
382 643 : const char *GetSRSName()
383 : {
384 643 : return m_pszSRSName;
385 : }
386 :
387 : CPLXMLNode *SerializeToXML();
388 : bool InitializeFromXML(CPLXMLNode *);
389 : };
390 :
391 : /************************************************************************/
392 : /* GMLFeature */
393 : /************************************************************************/
394 :
395 : class CPL_DLL GMLFeature
396 : {
397 : GMLFeatureClass *m_poClass;
398 : char *m_pszFID;
399 :
400 : int m_nPropertyCount;
401 : GMLProperty *m_pasProperties;
402 :
403 : int m_nGeometryCount;
404 : CPLXMLNode **m_papsGeometry; /* NULL-terminated. Alias to m_apsGeometry if
405 : m_nGeometryCount <= 1 */
406 : CPLXMLNode *m_apsGeometry[2]; /* NULL-terminated */
407 :
408 : CPLXMLNode *m_psBoundedByGeometry = nullptr;
409 :
410 : CPL_DISALLOW_COPY_ASSIGN(GMLFeature)
411 :
412 : public:
413 : explicit GMLFeature(GMLFeatureClass *);
414 : ~GMLFeature();
415 :
416 47001 : GMLFeatureClass *GetClass() const
417 : {
418 47001 : return m_poClass;
419 : }
420 :
421 : void SetGeometryDirectly(CPLXMLNode *psGeom);
422 : void SetGeometryDirectly(int nIdx, CPLXMLNode *psGeom);
423 : void AddGeometry(CPLXMLNode *psGeom);
424 :
425 506 : int GetGeometryCount() const
426 : {
427 506 : return m_nGeometryCount;
428 : }
429 :
430 1347 : const CPLXMLNode *const *GetGeometryList() const
431 : {
432 1347 : return m_papsGeometry;
433 : }
434 :
435 : const CPLXMLNode *GetGeometryRef(int nIdx) const;
436 :
437 : void SetBoundedByGeometry(CPLXMLNode *psGeom);
438 :
439 1191 : const CPLXMLNode *GetBoundedByGeometry() const
440 : {
441 1191 : return m_psBoundedByGeometry;
442 : }
443 :
444 : void SetPropertyDirectly(int i, char *pszValue);
445 :
446 6651 : const GMLProperty *GetProperty(int i) const
447 : {
448 6651 : return (i >= 0 && i < m_nPropertyCount) ? &m_pasProperties[i] : nullptr;
449 : }
450 :
451 769 : const char *GetFID() const
452 : {
453 769 : return m_pszFID;
454 : }
455 :
456 : void SetFID(const char *pszFID);
457 :
458 : void Dump(FILE *fp);
459 : };
460 :
461 : OGRFieldType CPL_DLL GML_GetOGRFieldType(GMLPropertyType eType,
462 : OGRFieldSubType &eSubType);
463 :
464 : #endif
|