LCOV - code coverage report
Current view: top level - ogr/ogrsf_frmts/gmlutils - gmlfeature.h (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 108 108 100.0 %
Date: 2025-01-18 12:42:00 Functions: 46 46 100.0 %

          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

Generated by: LCOV version 1.14