Line data Source code
1 : /****************************************************************************** 2 : * $Id$ 3 : * 4 : * Project: OpenGIS Simple Features Reference Implementation 5 : * Purpose: Private definitions for OGR/VRT driver. 6 : * Author: Frank Warmerdam, warmerdam@pobox.com 7 : * 8 : ****************************************************************************** 9 : * Copyright (c) 2003, Frank Warmerdam <warmerdam@pobox.com> 10 : * Copyright (c) 2009-2014, Even Rouault <even dot rouault at spatialys.com> 11 : * 12 : * SPDX-License-Identifier: MIT 13 : ****************************************************************************/ 14 : 15 : #ifndef OGR_VRT_H_INCLUDED 16 : #define OGR_VRT_H_INCLUDED 17 : 18 : #include "cpl_error.h" 19 : #include "cpl_minixml.h" 20 : #include "cpl_string.h" 21 : #include "ogrlayerpool.h" 22 : #include "ogrsf_frmts.h" 23 : 24 : #include <set> 25 : #include <string> 26 : #include <vector> 27 : 28 : typedef enum 29 : { 30 : VGS_None, 31 : VGS_Direct, 32 : VGS_PointFromColumns, 33 : VGS_WKT, 34 : VGS_WKB, 35 : VGS_Shape 36 : } OGRVRTGeometryStyle; 37 : 38 : /************************************************************************/ 39 : /* OGRVRTGeomFieldProps */ 40 : /************************************************************************/ 41 : 42 : class OGRVRTGeomFieldProps 43 : { 44 : public: 45 : CPLString osName; // Name of the VRT geometry field */ 46 : OGRwkbGeometryType eGeomType; 47 : const OGRSpatialReference *poSRS; 48 : 49 : bool bSrcClip; 50 : OGRGeometry *poSrcRegion; 51 : 52 : // Geometry interpretation related. 53 : OGRVRTGeometryStyle eGeometryStyle; 54 : 55 : // Points to a OGRField for VGS_WKT, VGS_WKB, VGS_Shape and OGRGeomField 56 : // for VGS_Direct. 57 : int iGeomField; 58 : 59 : // VGS_PointFromColumn 60 : int iGeomXField; 61 : int iGeomYField; 62 : int iGeomZField; 63 : int iGeomMField; 64 : bool bReportSrcColumn; 65 : bool bUseSpatialSubquery; 66 : bool bNullable; 67 : 68 : OGREnvelope sStaticEnvelope; 69 : 70 : OGRGeomCoordinatePrecision sCoordinatePrecision{}; 71 : 72 : OGRVRTGeomFieldProps(); 73 : ~OGRVRTGeomFieldProps(); 74 : }; 75 : 76 : /************************************************************************/ 77 : /* OGRVRTLayer */ 78 : /************************************************************************/ 79 : 80 : class OGRVRTDataSource; 81 : 82 : class OGRVRTLayer final : public OGRLayer 83 : { 84 : protected: 85 : OGRVRTDataSource *poDS; 86 : std::vector<OGRVRTGeomFieldProps *> apoGeomFieldProps; 87 : 88 : bool bHasFullInitialized; 89 : CPLString osName; 90 : CPLXMLNode *psLTree; 91 : CPLString osVRTDirectory; 92 : 93 : OGRFeatureDefn *poFeatureDefn; 94 : 95 : GDALDataset *poSrcDS; 96 : OGRLayer *poSrcLayer; 97 : OGRFeatureDefn *poSrcFeatureDefn; 98 : bool bNeedReset; 99 : bool bSrcLayerFromSQL; 100 : bool bSrcDSShared; 101 : bool bAttrFilterPassThrough; 102 : 103 : char *pszAttrFilter; 104 : 105 : int iFIDField; // -1 means pass through. 106 : CPLString osFIDFieldName; 107 : int iStyleField; // -1 means pass through. 108 : 109 : // Attribute mapping. 110 : std::vector<int> anSrcField; 111 : std::vector<int> abDirectCopy; 112 : 113 : bool bUpdate; 114 : 115 : OGRFeature *TranslateFeature(OGRFeature *&, int bUseSrcRegion); 116 : OGRFeature *TranslateVRTFeatureToSrcFeature(OGRFeature *poVRTFeature); 117 : 118 : bool ResetSourceReading(); 119 : 120 : bool FullInitialize(); 121 : 122 : OGRFeatureDefn *GetSrcLayerDefn(); 123 : void ClipAndAssignSRS(OGRFeature *poFeature); 124 : 125 : GIntBig nFeatureCount; 126 : 127 : bool bError; 128 : 129 : bool ParseGeometryField(CPLXMLNode *psNode, CPLXMLNode *psNodeParent, 130 : OGRVRTGeomFieldProps *poProps); 131 : 132 : public: 133 : explicit OGRVRTLayer(OGRVRTDataSource *poDSIn); 134 : virtual ~OGRVRTLayer(); 135 : 136 : bool FastInitialize(CPLXMLNode *psLTree, const char *pszVRTDirectory, 137 : int bUpdate); 138 : 139 648 : virtual const char *GetName() override 140 : { 141 648 : return osName.c_str(); 142 : } 143 : 144 : virtual OGRwkbGeometryType GetGeomType() override; 145 : 146 : /* -------------------------------------------------------------------- */ 147 : /* Caution : all the below methods should care of calling */ 148 : /* FullInitialize() if not already done */ 149 : /* -------------------------------------------------------------------- */ 150 : 151 : virtual void ResetReading() override; 152 : virtual OGRFeature *GetNextFeature() override; 153 : 154 : virtual OGRFeature *GetFeature(GIntBig nFeatureId) override; 155 : 156 : virtual OGRErr SetNextByIndex(GIntBig nIndex) override; 157 : 158 : virtual OGRFeatureDefn *GetLayerDefn() override; 159 : 160 : virtual GIntBig GetFeatureCount(int) override; 161 : 162 : virtual OGRErr SetAttributeFilter(const char *) override; 163 : 164 : virtual int TestCapability(const char *) override; 165 : 166 : virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override; 167 : virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, 168 : int bForce = TRUE) override; 169 : 170 : virtual void SetSpatialFilter(OGRGeometry *poGeomIn) override; 171 : virtual void SetSpatialFilter(int iGeomField, 172 : OGRGeometry *poGeomIn) override; 173 : 174 : virtual OGRErr ICreateFeature(OGRFeature *poFeature) override; 175 : 176 : virtual OGRErr ISetFeature(OGRFeature *poFeature) override; 177 : 178 : virtual OGRErr DeleteFeature(GIntBig nFID) override; 179 : 180 : virtual OGRErr SyncToDisk() override; 181 : 182 : virtual const char *GetFIDColumn() override; 183 : 184 : virtual OGRErr StartTransaction() override; 185 : virtual OGRErr CommitTransaction() override; 186 : virtual OGRErr RollbackTransaction() override; 187 : 188 : virtual OGRErr SetIgnoredFields(CSLConstList papszFields) override; 189 : 190 : GDALDataset *GetSrcDataset(); 191 : }; 192 : 193 : /************************************************************************/ 194 : /* OGRVRTDataSource */ 195 : /************************************************************************/ 196 : 197 : typedef enum 198 : { 199 : OGR_VRT_PROXIED_LAYER, 200 : OGR_VRT_LAYER, 201 : OGR_VRT_OTHER_LAYER, 202 : } OGRLayerType; 203 : 204 : class OGRVRTDataSource final : public GDALDataset 205 : { 206 : OGRLayer **papoLayers; 207 : OGRLayerType *paeLayerType; 208 : int nLayers; 209 : 210 : CPLXMLNode *psTree; 211 : 212 : int nCallLevel; 213 : 214 : std::set<std::string> aosOtherDSNameSet; 215 : 216 : OGRLayer *InstantiateWarpedLayer(CPLXMLNode *psLTree, 217 : const char *pszVRTDirectory, int bUpdate, 218 : int nRecLevel); 219 : OGRLayer *InstantiateUnionLayer(CPLXMLNode *psLTree, 220 : const char *pszVRTDirectory, int bUpdate, 221 : int nRecLevel); 222 : 223 : OGRLayerPool *poLayerPool; 224 : 225 : OGRVRTDataSource *poParentDS; 226 : bool bRecursionDetected; 227 : 228 : public: 229 : explicit OGRVRTDataSource(GDALDriver *poDriver); 230 : virtual ~OGRVRTDataSource(); 231 : 232 : virtual int CloseDependentDatasets() override; 233 : 234 : OGRLayer *InstantiateLayer(CPLXMLNode *psLTree, const char *pszVRTDirectory, 235 : int bUpdate, int nRecLevel = 0); 236 : 237 : OGRLayer *InstantiateLayerInternal(CPLXMLNode *psLTree, 238 : const char *pszVRTDirectory, int bUpdate, 239 : int nRecLevel); 240 : 241 : bool Initialize(CPLXMLNode *psXML, const char *pszName, int bUpdate); 242 : 243 834 : int GetLayerCount() override 244 : { 245 834 : return nLayers; 246 : } 247 : 248 : OGRLayer *GetLayer(int) override; 249 : 250 : int TestCapability(const char *) override; 251 : 252 : virtual char **GetFileList() override; 253 : 254 : // Anti-recursion mechanism for standard Open. 255 66 : void SetCallLevel(int nCallLevelIn) 256 : { 257 66 : nCallLevel = nCallLevelIn; 258 66 : } 259 : 260 431 : int GetCallLevel() 261 : { 262 431 : return nCallLevel; 263 : } 264 : 265 66 : void SetParentDS(OGRVRTDataSource *poParentDSIn) 266 : { 267 66 : poParentDS = poParentDSIn; 268 66 : } 269 : 270 66 : OGRVRTDataSource *GetParentDS() 271 : { 272 66 : return poParentDS; 273 : } 274 : 275 70 : void SetRecursionDetected() 276 : { 277 70 : bRecursionDetected = true; 278 70 : } 279 : 280 34007 : bool GetRecursionDetected() const 281 : { 282 34007 : return bRecursionDetected; 283 : } 284 : 285 : // Anti-recursion mechanism for shared Open. 286 : void AddForbiddenNames(const char *pszOtherDSName); 287 : bool IsInForbiddenNames(const char *pszOtherDSName) const; 288 : }; 289 : 290 : #endif // ndef OGR_VRT_H_INCLUDED