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

          Line data    Source code
       1             : /******************************************************************************
       2             :  *
       3             :  * Project:  GML Reader
       4             :  * Purpose:  Declarations for OGR wrapper classes for GML, and GML<->OGR
       5             :  *           translation of geometry.
       6             :  * Author:   Frank Warmerdam, warmerdam@pobox.com
       7             :  *
       8             :  ******************************************************************************
       9             :  * Copyright (c) 2002, Frank Warmerdam
      10             :  * Copyright (c) 2010-2013, Even Rouault <even dot rouault at spatialys.com>
      11             :  *
      12             :  * SPDX-License-Identifier: MIT
      13             :  ****************************************************************************/
      14             : 
      15             : #ifndef OGR_GML_H_INCLUDED
      16             : #define OGR_GML_H_INCLUDED
      17             : 
      18             : #include "ogrsf_frmts.h"
      19             : #include "gmlreader.h"
      20             : #include "gmlutils.h"
      21             : 
      22             : #include <memory>
      23             : #include <vector>
      24             : 
      25             : class OGRGMLDataSource;
      26             : 
      27             : typedef enum
      28             : {
      29             :     STANDARD,
      30             :     SEQUENTIAL_LAYERS,
      31             :     INTERLEAVED_LAYERS
      32             : } ReadMode;
      33             : 
      34             : /************************************************************************/
      35             : /*                            OGRGMLLayer                               */
      36             : /************************************************************************/
      37             : 
      38             : class OGRGMLLayer final : public OGRLayer
      39             : {
      40             :     OGRFeatureDefn *poFeatureDefn;
      41             : 
      42             :     GIntBig iNextGMLId;
      43             :     bool bInvalidFIDFound;
      44             :     char *pszFIDPrefix;
      45             : 
      46             :     bool bWriter;
      47             : 
      48             :     OGRGMLDataSource *poDS;
      49             : 
      50             :     GMLFeatureClass *poFClass;
      51             : 
      52             :     void *hCacheSRS;
      53             : 
      54             :     bool bUseOldFIDFormat;
      55             : 
      56             :     bool bFaceHoleNegative;
      57             : 
      58             :     CPL_DISALLOW_COPY_ASSIGN(OGRGMLLayer)
      59             : 
      60             :   public:
      61             :     OGRGMLLayer(const char *pszName, bool bWriter, OGRGMLDataSource *poDS);
      62             : 
      63             :     virtual ~OGRGMLLayer();
      64             : 
      65             :     GDALDataset *GetDataset() override;
      66             : 
      67             :     void ResetReading() override;
      68             :     OGRFeature *GetNextFeature() override;
      69             : 
      70             :     GIntBig GetFeatureCount(int bForce = TRUE) override;
      71             :     OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override;
      72             : 
      73          11 :     virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent,
      74             :                              int bForce) override
      75             :     {
      76          11 :         return OGRLayer::GetExtent(iGeomField, psExtent, bForce);
      77             :     }
      78             : 
      79             :     OGRErr ICreateFeature(OGRFeature *poFeature) override;
      80             : 
      81        7219 :     OGRFeatureDefn *GetLayerDefn() override
      82             :     {
      83        7219 :         return poFeatureDefn;
      84             :     }
      85             : 
      86             :     virtual OGRErr CreateField(const OGRFieldDefn *poField,
      87             :                                int bApproxOK = TRUE) override;
      88             :     virtual OGRErr CreateGeomField(const OGRGeomFieldDefn *poField,
      89             :                                    int bApproxOK = TRUE) override;
      90             : 
      91             :     int TestCapability(const char *) override;
      92             : };
      93             : 
      94             : /************************************************************************/
      95             : /*                           OGRGMLDataSource                           */
      96             : /************************************************************************/
      97             : 
      98             : class OGRGMLDataSource final : public GDALDataset
      99             : {
     100             :     OGRLayer **papoLayers;
     101             :     int nLayers;
     102             : 
     103             :     OGRGMLLayer *TranslateGMLSchema(GMLFeatureClass *);
     104             : 
     105             :     char **papszCreateOptions;
     106             : 
     107             :     // output related parameters
     108             :     VSILFILE *fpOutput;
     109             :     bool bFpOutputIsNonSeekable;
     110             :     bool bFpOutputSingleFile;
     111             :     bool m_bWriteError = false;
     112             :     OGREnvelope3D sBoundingRect{};
     113             :     bool bBBOX3D;
     114             :     int nBoundedByLocation;
     115             : 
     116             :     int nSchemaInsertLocation;
     117             :     bool bIsOutputGML3;
     118             :     bool bIsOutputGML3Deegree; /* if TRUE, then bIsOutputGML3 is also TRUE */
     119             :     bool bIsOutputGML32;       /* if TRUE, then bIsOutputGML3 is also TRUE */
     120             :     OGRGMLSRSNameFormat eSRSNameFormat;
     121             :     bool bWriteSpaceIndentation;
     122             : 
     123             :     //! Whether all geometry fields of all layers have the same SRS (or no SRS at all)
     124             :     bool m_bWriteGlobalSRS = true;
     125             : 
     126             :     //! The global SRS (may be null), that is valid only if m_bWriteGlobalSRS == true
     127             :     std::unique_ptr<OGRSpatialReference> m_poWriteGlobalSRS{};
     128             : 
     129             :     //! Whether at least one geometry field has been created
     130             :     bool m_bWriteGlobalSRSInit = false;
     131             : 
     132             :     // input related parameters.
     133             :     CPLString osFilename{};
     134             :     CPLString osXSDFilename{};
     135             :     bool m_bUnlinkXSDFilename = false;
     136             : 
     137             :     IGMLReader *poReader;
     138             :     bool bOutIsTempFile;
     139             : 
     140             :     void InsertHeader();
     141             : 
     142             :     bool bExposeGMLId;
     143             :     bool bExposeFid;
     144             :     bool bIsWFS;
     145             : 
     146             :     bool bUseGlobalSRSName;
     147             : 
     148             :     bool m_bInvertAxisOrderIfLatLong;
     149             :     bool m_bConsiderEPSGAsURN;
     150             :     GMLSwapCoordinatesEnum m_eSwapCoordinates;
     151             :     bool m_bGetSecondaryGeometryOption;
     152             : 
     153             :     ReadMode eReadMode;
     154             :     GMLFeature *poStoredGMLFeature;
     155             :     OGRGMLLayer *poLastReadLayer;
     156             : 
     157             :     bool bEmptyAsNull;
     158             : 
     159             :     OGRSpatialReference m_oStandaloneGeomSRS{};
     160             :     std::unique_ptr<OGRGeometry> m_poStandaloneGeom{};
     161             : 
     162             :     std::vector<std::string> m_aosGMLExtraElements{};
     163             : 
     164             :     void FindAndParseTopElements(VSILFILE *fp);
     165             :     void SetExtents(double dfMinX, double dfMinY, double dfMaxX, double dfMaxY);
     166             : 
     167             :     void BuildJointClassFromXSD();
     168             :     void BuildJointClassFromScannedSchema();
     169             : 
     170             :     void WriteTopElements();
     171             : 
     172             :     // Analyze the OGR_SCHEMA open options and apply changes to the GML reader, return false in case of a critical error
     173             :     bool DealWithOgrSchemaOpenOption(const GDALOpenInfo *poOpenInfo);
     174             : 
     175             :     CPL_DISALLOW_COPY_ASSIGN(OGRGMLDataSource)
     176             : 
     177             :   public:
     178             :     OGRGMLDataSource();
     179             :     virtual ~OGRGMLDataSource();
     180             : 
     181             :     bool Open(GDALOpenInfo *poOpenInfo);
     182             :     CPLErr Close() override;
     183             :     bool Create(const char *pszFile, char **papszOptions);
     184             : 
     185        1440 :     int GetLayerCount() override
     186             :     {
     187        1440 :         return nLayers;
     188             :     }
     189             : 
     190             :     OGRLayer *GetLayer(int) override;
     191             :     OGRLayer *ICreateLayer(const char *pszName,
     192             :                            const OGRGeomFieldDefn *poGeomFieldDefn,
     193             :                            CSLConstList papszOptions) override;
     194             :     int TestCapability(const char *) override;
     195             : 
     196         266 :     VSILFILE *GetOutputFP() const
     197             :     {
     198         266 :         return fpOutput;
     199             :     }
     200             : 
     201        2831 :     IGMLReader *GetReader() const
     202             :     {
     203        2831 :         return poReader;
     204             :     }
     205             : 
     206             :     void GrowExtents(OGREnvelope3D *psGeomBounds, int nCoordDimension);
     207             : 
     208         703 :     int ExposeId() const
     209             :     {
     210         703 :         return bExposeGMLId || bExposeFid;
     211             :     }
     212             : 
     213             :     void PrintLine(VSILFILE *fp, const char *fmt, ...)
     214             :         CPL_PRINT_FUNC_FORMAT(3, 4);
     215             : 
     216        1778 :     bool IsGML3Output() const
     217             :     {
     218        1778 :         return bIsOutputGML3;
     219             :     }
     220             : 
     221         138 :     bool IsGML3DeegreeOutput() const
     222             :     {
     223         138 :         return bIsOutputGML3Deegree;
     224             :     }
     225             : 
     226         890 :     bool IsGML32Output() const
     227             :     {
     228         890 :         return bIsOutputGML32;
     229             :     }
     230             : 
     231             :     /** Returns whether a writing error has occurred */
     232         530 :     inline bool HasWriteError() const
     233             :     {
     234         530 :         return m_bWriteError;
     235             :     }
     236             : 
     237         575 :     OGRGMLSRSNameFormat GetSRSNameFormat() const
     238             :     {
     239         575 :         return eSRSNameFormat;
     240             :     }
     241             : 
     242         266 :     bool WriteSpaceIndentation() const
     243             :     {
     244         266 :         return bWriteSpaceIndentation;
     245             :     }
     246             : 
     247             :     const char *GetGlobalSRSName();
     248             : 
     249         690 :     bool GetInvertAxisOrderIfLatLong() const
     250             :     {
     251         690 :         return m_bInvertAxisOrderIfLatLong;
     252             :     }
     253             : 
     254         690 :     bool GetConsiderEPSGAsURN() const
     255             :     {
     256         690 :         return m_bConsiderEPSGAsURN;
     257             :     }
     258             : 
     259         690 :     GMLSwapCoordinatesEnum GetSwapCoordinates() const
     260             :     {
     261         690 :         return m_eSwapCoordinates;
     262             :     }
     263             : 
     264         690 :     bool GetSecondaryGeometryOption() const
     265             :     {
     266         690 :         return m_bGetSecondaryGeometryOption;
     267             :     }
     268             : 
     269        3245 :     ReadMode GetReadMode() const
     270             :     {
     271        3245 :         return eReadMode;
     272             :     }
     273             : 
     274         101 :     void SetStoredGMLFeature(GMLFeature *poStoredGMLFeatureIn)
     275             :     {
     276         101 :         poStoredGMLFeature = poStoredGMLFeatureIn;
     277         101 :     }
     278             : 
     279        1658 :     GMLFeature *PeekStoredGMLFeature() const
     280             :     {
     281        1658 :         return poStoredGMLFeature;
     282             :     }
     283             : 
     284         808 :     OGRGMLLayer *GetLastReadLayer() const
     285             :     {
     286         808 :         return poLastReadLayer;
     287             :     }
     288             : 
     289         380 :     void SetLastReadLayer(OGRGMLLayer *poLayer)
     290             :     {
     291         380 :         poLastReadLayer = poLayer;
     292         380 :     }
     293             : 
     294             :     const char *GetAppPrefix() const;
     295             :     bool RemoveAppPrefix() const;
     296             :     bool WriteFeatureBoundedBy() const;
     297             :     const char *GetSRSDimensionLoc() const;
     298             :     bool GMLFeatureCollection() const;
     299             : 
     300             :     void DeclareNewWriteSRS(const OGRSpatialReference *poSRS);
     301             : 
     302         215 :     bool HasWriteGlobalSRS() const
     303             :     {
     304         215 :         return m_bWriteGlobalSRS;
     305             :     }
     306             : 
     307             :     virtual OGRLayer *ExecuteSQL(const char *pszSQLCommand,
     308             :                                  OGRGeometry *poSpatialFilter,
     309             :                                  const char *pszDialect) override;
     310             :     virtual void ReleaseResultSet(OGRLayer *poResultsSet) override;
     311             : 
     312             :     static bool CheckHeader(const char *pszStr);
     313             : };
     314             : 
     315             : #endif /* OGR_GML_H_INCLUDED */

Generated by: LCOV version 1.14