Line data Source code
1 : /****************************************************************************** 2 : * $Id$ 3 : * 4 : * Project: GML Reader 5 : * Purpose: Declarations for OGR wrapper classes for GML, and GML<->OGR 6 : * translation of geometry. 7 : * Author: Frank Warmerdam, warmerdam@pobox.com 8 : * 9 : ****************************************************************************** 10 : * Copyright (c) 2002, Frank Warmerdam 11 : * Copyright (c) 2010-2013, Even Rouault <even dot rouault at spatialys.com> 12 : * 13 : * SPDX-License-Identifier: MIT 14 : ****************************************************************************/ 15 : 16 : #ifndef OGR_GML_H_INCLUDED 17 : #define OGR_GML_H_INCLUDED 18 : 19 : #include "ogrsf_frmts.h" 20 : #include "gmlreader.h" 21 : #include "gmlutils.h" 22 : 23 : #include <memory> 24 : #include <vector> 25 : 26 : class OGRGMLDataSource; 27 : 28 : typedef enum 29 : { 30 : STANDARD, 31 : SEQUENTIAL_LAYERS, 32 : INTERLEAVED_LAYERS 33 : } ReadMode; 34 : 35 : /************************************************************************/ 36 : /* OGRGMLLayer */ 37 : /************************************************************************/ 38 : 39 : class OGRGMLLayer final : public OGRLayer 40 : { 41 : OGRFeatureDefn *poFeatureDefn; 42 : 43 : GIntBig iNextGMLId; 44 : bool bInvalidFIDFound; 45 : char *pszFIDPrefix; 46 : 47 : bool bWriter; 48 : 49 : OGRGMLDataSource *poDS; 50 : 51 : GMLFeatureClass *poFClass; 52 : 53 : void *hCacheSRS; 54 : 55 : bool bUseOldFIDFormat; 56 : 57 : bool bFaceHoleNegative; 58 : 59 : CPL_DISALLOW_COPY_ASSIGN(OGRGMLLayer) 60 : 61 : public: 62 : OGRGMLLayer(const char *pszName, bool bWriter, OGRGMLDataSource *poDS); 63 : 64 : virtual ~OGRGMLLayer(); 65 : 66 : GDALDataset *GetDataset() override; 67 : 68 : void ResetReading() override; 69 : OGRFeature *GetNextFeature() override; 70 : 71 : GIntBig GetFeatureCount(int bForce = TRUE) override; 72 : OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override; 73 : 74 11 : virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, 75 : int bForce) override 76 : { 77 11 : return OGRLayer::GetExtent(iGeomField, psExtent, bForce); 78 : } 79 : 80 : OGRErr ICreateFeature(OGRFeature *poFeature) override; 81 : 82 6985 : OGRFeatureDefn *GetLayerDefn() override 83 : { 84 6985 : return poFeatureDefn; 85 : } 86 : 87 : virtual OGRErr CreateField(const OGRFieldDefn *poField, 88 : int bApproxOK = TRUE) override; 89 : virtual OGRErr CreateGeomField(const OGRGeomFieldDefn *poField, 90 : int bApproxOK = TRUE) override; 91 : 92 : int TestCapability(const char *) override; 93 : }; 94 : 95 : /************************************************************************/ 96 : /* OGRGMLDataSource */ 97 : /************************************************************************/ 98 : 99 : class OGRGMLDataSource final : public GDALDataset 100 : { 101 : OGRLayer **papoLayers; 102 : int nLayers; 103 : 104 : OGRGMLLayer *TranslateGMLSchema(GMLFeatureClass *); 105 : 106 : char **papszCreateOptions; 107 : 108 : // output related parameters 109 : VSILFILE *fpOutput; 110 : bool bFpOutputIsNonSeekable; 111 : bool bFpOutputSingleFile; 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 : CPL_DISALLOW_COPY_ASSIGN(OGRGMLDataSource) 173 : 174 : public: 175 : OGRGMLDataSource(); 176 : virtual ~OGRGMLDataSource(); 177 : 178 : bool Open(GDALOpenInfo *poOpenInfo); 179 : bool Create(const char *pszFile, char **papszOptions); 180 : 181 1370 : int GetLayerCount() override 182 : { 183 1370 : return nLayers; 184 : } 185 : 186 : OGRLayer *GetLayer(int) override; 187 : OGRLayer *ICreateLayer(const char *pszName, 188 : const OGRGeomFieldDefn *poGeomFieldDefn, 189 : CSLConstList papszOptions) override; 190 : int TestCapability(const char *) override; 191 : 192 265 : VSILFILE *GetOutputFP() const 193 : { 194 265 : return fpOutput; 195 : } 196 : 197 2751 : IGMLReader *GetReader() const 198 : { 199 2751 : return poReader; 200 : } 201 : 202 : void GrowExtents(OGREnvelope3D *psGeomBounds, int nCoordDimension); 203 : 204 676 : int ExposeId() const 205 : { 206 676 : return bExposeGMLId || bExposeFid; 207 : } 208 : 209 : static void PrintLine(VSILFILE *fp, const char *fmt, ...) 210 : CPL_PRINT_FUNC_FORMAT(2, 3); 211 : 212 1770 : bool IsGML3Output() const 213 : { 214 1770 : return bIsOutputGML3; 215 : } 216 : 217 138 : bool IsGML3DeegreeOutput() const 218 : { 219 138 : return bIsOutputGML3Deegree; 220 : } 221 : 222 886 : bool IsGML32Output() const 223 : { 224 886 : return bIsOutputGML32; 225 : } 226 : 227 575 : OGRGMLSRSNameFormat GetSRSNameFormat() const 228 : { 229 575 : return eSRSNameFormat; 230 : } 231 : 232 265 : bool WriteSpaceIndentation() const 233 : { 234 265 : return bWriteSpaceIndentation; 235 : } 236 : 237 : const char *GetGlobalSRSName(); 238 : 239 663 : bool GetInvertAxisOrderIfLatLong() const 240 : { 241 663 : return m_bInvertAxisOrderIfLatLong; 242 : } 243 : 244 663 : bool GetConsiderEPSGAsURN() const 245 : { 246 663 : return m_bConsiderEPSGAsURN; 247 : } 248 : 249 663 : GMLSwapCoordinatesEnum GetSwapCoordinates() const 250 : { 251 663 : return m_eSwapCoordinates; 252 : } 253 : 254 663 : bool GetSecondaryGeometryOption() const 255 : { 256 663 : return m_bGetSecondaryGeometryOption; 257 : } 258 : 259 3163 : ReadMode GetReadMode() const 260 : { 261 3163 : return eReadMode; 262 : } 263 : 264 99 : void SetStoredGMLFeature(GMLFeature *poStoredGMLFeatureIn) 265 : { 266 99 : poStoredGMLFeature = poStoredGMLFeatureIn; 267 99 : } 268 : 269 1626 : GMLFeature *PeekStoredGMLFeature() const 270 : { 271 1626 : return poStoredGMLFeature; 272 : } 273 : 274 781 : OGRGMLLayer *GetLastReadLayer() const 275 : { 276 781 : return poLastReadLayer; 277 : } 278 : 279 354 : void SetLastReadLayer(OGRGMLLayer *poLayer) 280 : { 281 354 : poLastReadLayer = poLayer; 282 354 : } 283 : 284 : const char *GetAppPrefix() const; 285 : bool RemoveAppPrefix() const; 286 : bool WriteFeatureBoundedBy() const; 287 : const char *GetSRSDimensionLoc() const; 288 : bool GMLFeatureCollection() const; 289 : 290 : void DeclareNewWriteSRS(const OGRSpatialReference *poSRS); 291 : 292 215 : bool HasWriteGlobalSRS() const 293 : { 294 215 : return m_bWriteGlobalSRS; 295 : } 296 : 297 : virtual OGRLayer *ExecuteSQL(const char *pszSQLCommand, 298 : OGRGeometry *poSpatialFilter, 299 : const char *pszDialect) override; 300 : virtual void ReleaseResultSet(OGRLayer *poResultsSet) override; 301 : 302 : static bool CheckHeader(const char *pszStr); 303 : }; 304 : 305 : #endif /* OGR_GML_H_INCLUDED */