LCOV - code coverage report
Current view: top level - ogr/ogrsf_frmts/gmlutils - gmlfeature.h (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 99 99 100.0 %
Date: 2024-11-21 22:18:42 Functions: 43 43 100.0 %

          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

Generated by: LCOV version 1.14