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