1 /******************************************************************************
2  * $Id: ogrsf_frmts.h decf0d0bdf8ba9b4efa471cd15c968080e656298 2021-02-27 22:56:48 +0100 Even Rouault $
3  *
4  * Project:  OpenGIS Simple Features Reference Implementation
5  * Purpose:  Classes related to format registration, and file opening.
6  * Author:   Frank Warmerdam, warmerda@home.com
7  *
8  ******************************************************************************
9  * Copyright (c) 1999,  Les Technologies SoftMap Inc.
10  * Copyright (c) 2007-2014, Even Rouault <even dot rouault at spatialys.com>
11  *
12  * Permission is hereby granted, free of charge, to any person obtaining a
13  * copy of this software and associated documentation files (the "Software"),
14  * to deal in the Software without restriction, including without limitation
15  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
16  * and/or sell copies of the Software, and to permit persons to whom the
17  * Software is furnished to do so, subject to the following conditions:
18  *
19  * The above copyright notice and this permission notice shall be included
20  * in all copies or substantial portions of the Software.
21  *
22  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
23  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
25  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
27  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
28  * DEALINGS IN THE SOFTWARE.
29  ****************************************************************************/
30 
31 #ifndef OGRSF_FRMTS_H_INCLUDED
32 #define OGRSF_FRMTS_H_INCLUDED
33 
34 #include "cpl_progress.h"
35 #include "ogr_feature.h"
36 #include "ogr_featurestyle.h"
37 #include "gdal_priv.h"
38 
39 #include <memory>
40 
41 /**
42  * \file ogrsf_frmts.h
43  *
44  * Classes related to registration of format support, and opening datasets.
45  */
46 
47 //! @cond Doxygen_Suppress
48 #if !defined(GDAL_COMPILATION) && !defined(SUPPRESS_DEPRECATION_WARNINGS)
49 #define OGR_DEPRECATED(x) CPL_WARN_DEPRECATED(x)
50 #else
51 #define OGR_DEPRECATED(x)
52 #endif
53 //! @endcond
54 
55 class OGRLayerAttrIndex;
56 class OGRSFDriver;
57 
58 /************************************************************************/
59 /*                               OGRLayer                               */
60 /************************************************************************/
61 
62 /**
63  * This class represents a layer of simple features, with access methods.
64  *
65  */
66 
67 /* Note: any virtual method added to this class must also be added in the */
68 /* OGRLayerDecorator and OGRMutexedLayer classes. */
69 
70 class CPL_DLL OGRLayer : public GDALMajorObject
71 {
72   private:
73     struct Private;
74     std::unique_ptr<Private> m_poPrivate;
75 
76     void         ConvertGeomsIfNecessary( OGRFeature *poFeature );
77 
78     class CPL_DLL FeatureIterator
79     {
80             struct Private;
81             std::unique_ptr<Private> m_poPrivate;
82         public:
83             FeatureIterator(OGRLayer* poLayer, bool bStart);
84             FeatureIterator(FeatureIterator&& oOther) noexcept; // declared but not defined. Needed for gcc 5.4 at least
85             ~FeatureIterator();
86             OGRFeatureUniquePtr& operator*();
87             FeatureIterator& operator++();
88             bool operator!=(const FeatureIterator& it) const;
89     };
90 
91     friend inline FeatureIterator begin(OGRLayer* poLayer);
92     friend inline FeatureIterator end(OGRLayer* poLayer);
93 
94     CPL_DISALLOW_COPY_ASSIGN(OGRLayer)
95 
96   protected:
97 //! @cond Doxygen_Suppress
98     int          m_bFilterIsEnvelope;
99     OGRGeometry *m_poFilterGeom;
100     OGRPreparedGeometry *m_pPreparedFilterGeom; /* m_poFilterGeom compiled as a prepared geometry */
101     OGREnvelope  m_sFilterEnvelope;
102     int          m_iGeomFieldFilter; // specify the index on which the spatial
103                                      // filter is active.
104 
105     int          FilterGeometry( OGRGeometry * );
106     //int          FilterGeometry( OGRGeometry *, OGREnvelope* psGeometryEnvelope);
107     int          InstallFilter( OGRGeometry * );
108 
109     OGRErr       GetExtentInternal(int iGeomField, OGREnvelope *psExtent, int bForce );
110 //! @endcond
111 
112     virtual OGRErr      ISetFeature( OGRFeature *poFeature ) CPL_WARN_UNUSED_RESULT;
113     virtual OGRErr      ICreateFeature( OGRFeature *poFeature )  CPL_WARN_UNUSED_RESULT;
114 
115   public:
116     OGRLayer();
117     virtual     ~OGRLayer();
118 
119     /** Return begin of feature iterator.
120      *
121      * Using this iterator for standard range-based loops is safe, but
122      * due to implementation limitations, you shouldn't try to access
123      * (dereference) more than one iterator step at a time, since the
124      * OGRFeatureUniquePtr reference is reused.
125      *
126      * Only one iterator per layer can be active at a time.
127      * @since GDAL 2.3
128      */
129     FeatureIterator begin();
130 
131     /** Return end of feature iterator. */
132     FeatureIterator end();
133 
134     virtual OGRGeometry *GetSpatialFilter();
135     virtual void        SetSpatialFilter( OGRGeometry * );
136     virtual void        SetSpatialFilterRect( double dfMinX, double dfMinY,
137                                               double dfMaxX, double dfMaxY );
138 
139     virtual void        SetSpatialFilter( int iGeomField, OGRGeometry * );
140     virtual void        SetSpatialFilterRect( int iGeomField,
141                                             double dfMinX, double dfMinY,
142                                             double dfMaxX, double dfMaxY );
143 
144     virtual OGRErr      SetAttributeFilter( const char * );
145 
146     virtual void        ResetReading() = 0;
147     virtual OGRFeature *GetNextFeature() CPL_WARN_UNUSED_RESULT = 0;
148     virtual OGRErr      SetNextByIndex( GIntBig nIndex );
149     virtual OGRFeature *GetFeature( GIntBig nFID )  CPL_WARN_UNUSED_RESULT;
150 
151     OGRErr      SetFeature( OGRFeature *poFeature )  CPL_WARN_UNUSED_RESULT;
152     OGRErr      CreateFeature( OGRFeature *poFeature ) CPL_WARN_UNUSED_RESULT;
153 
154     virtual OGRErr      DeleteFeature( GIntBig nFID )  CPL_WARN_UNUSED_RESULT;
155 
156     virtual const char *GetName();
157     virtual OGRwkbGeometryType GetGeomType();
158     virtual OGRFeatureDefn *GetLayerDefn() = 0;
159     virtual int         FindFieldIndex( const char *pszFieldName, int bExactMatch );
160 
161     virtual OGRSpatialReference *GetSpatialRef();
162 
163     virtual GIntBig     GetFeatureCount( int bForce = TRUE );
164     virtual OGRErr      GetExtent(OGREnvelope *psExtent, int bForce = TRUE)  CPL_WARN_UNUSED_RESULT;
165     virtual OGRErr      GetExtent(int iGeomField, OGREnvelope *psExtent,
166                                   int bForce = TRUE)  CPL_WARN_UNUSED_RESULT;
167 
168     virtual int         TestCapability( const char * ) = 0;
169 
170     virtual OGRErr      CreateField( OGRFieldDefn *poField,
171                                      int bApproxOK = TRUE );
172     virtual OGRErr      DeleteField( int iField );
173     virtual OGRErr      ReorderFields( int* panMap );
174     virtual OGRErr      AlterFieldDefn( int iField, OGRFieldDefn* poNewFieldDefn, int nFlagsIn );
175 
176     virtual OGRErr      CreateGeomField( OGRGeomFieldDefn *poField,
177                                      int bApproxOK = TRUE );
178 
179     virtual OGRErr      SyncToDisk();
180 
181     virtual OGRStyleTable *GetStyleTable();
182     virtual void        SetStyleTableDirectly( OGRStyleTable *poStyleTable );
183 
184     virtual void        SetStyleTable(OGRStyleTable *poStyleTable);
185 
186     virtual OGRErr      StartTransaction() CPL_WARN_UNUSED_RESULT;
187     virtual OGRErr      CommitTransaction() CPL_WARN_UNUSED_RESULT;
188     virtual OGRErr      RollbackTransaction();
189 
190     virtual const char *GetFIDColumn();
191     virtual const char *GetGeometryColumn();
192 
193     virtual OGRErr      SetIgnoredFields( const char **papszFields );
194 
195     OGRErr              Intersection( OGRLayer *pLayerMethod,
196                                       OGRLayer *pLayerResult,
197                                       char** papszOptions = nullptr,
198                                       GDALProgressFunc pfnProgress = nullptr,
199                                       void * pProgressArg = nullptr );
200     OGRErr              Union( OGRLayer *pLayerMethod,
201                                OGRLayer *pLayerResult,
202                                char** papszOptions = nullptr,
203                                GDALProgressFunc pfnProgress = nullptr,
204                                void * pProgressArg = nullptr );
205     OGRErr              SymDifference( OGRLayer *pLayerMethod,
206                                        OGRLayer *pLayerResult,
207                                        char** papszOptions,
208                                        GDALProgressFunc pfnProgress,
209                                        void * pProgressArg );
210     OGRErr              Identity( OGRLayer *pLayerMethod,
211                                   OGRLayer *pLayerResult,
212                                   char** papszOptions = nullptr,
213                                   GDALProgressFunc pfnProgress = nullptr,
214                                   void * pProgressArg = nullptr );
215     OGRErr              Update( OGRLayer *pLayerMethod,
216                                 OGRLayer *pLayerResult,
217                                 char** papszOptions = nullptr,
218                                 GDALProgressFunc pfnProgress = nullptr,
219                                 void * pProgressArg = nullptr );
220     OGRErr              Clip( OGRLayer *pLayerMethod,
221                               OGRLayer *pLayerResult,
222                               char** papszOptions = nullptr,
223                               GDALProgressFunc pfnProgress = nullptr,
224                               void * pProgressArg = nullptr );
225     OGRErr              Erase( OGRLayer *pLayerMethod,
226                                OGRLayer *pLayerResult,
227                                char** papszOptions = nullptr,
228                                GDALProgressFunc pfnProgress = nullptr,
229                                void * pProgressArg = nullptr );
230 
231     int                 Reference();
232     int                 Dereference();
233     int                 GetRefCount() const;
234 //! @cond Doxygen_Suppress
235     GIntBig             GetFeaturesRead();
236 //! @endcond
237 
238     /* non virtual : convenience wrapper for ReorderFields() */
239     OGRErr              ReorderField( int iOldFieldPos, int iNewFieldPos );
240 
241 //! @cond Doxygen_Suppress
242     int                 AttributeFilterEvaluationNeedsGeometry();
243 
244     /* consider these private */
245     OGRErr               InitializeIndexSupport( const char * );
GetIndex()246     OGRLayerAttrIndex   *GetIndex() { return m_poAttrIndex; }
GetGeomFieldFilter()247     int                 GetGeomFieldFilter() const { return m_iGeomFieldFilter; }
GetAttrQueryString()248     const char          *GetAttrQueryString() const { return m_pszAttrQueryString; }
249 //! @endcond
250 
251     /** Convert a OGRLayer* to a OGRLayerH.
252      * @since GDAL 2.3
253      */
ToHandle(OGRLayer * poLayer)254     static inline OGRLayerH ToHandle(OGRLayer* poLayer)
255         { return reinterpret_cast<OGRLayerH>(poLayer); }
256 
257     /** Convert a OGRLayerH to a OGRLayer*.
258      * @since GDAL 2.3
259      */
FromHandle(OGRLayerH hLayer)260     static inline OGRLayer* FromHandle(OGRLayerH hLayer)
261         { return reinterpret_cast<OGRLayer*>(hLayer); }
262 
263  protected:
264 //! @cond Doxygen_Suppress
265     OGRStyleTable       *m_poStyleTable;
266     OGRFeatureQuery     *m_poAttrQuery;
267     char                *m_pszAttrQueryString;
268     OGRLayerAttrIndex   *m_poAttrIndex;
269 
270     int                  m_nRefCount;
271 
272     GIntBig              m_nFeaturesRead;
273 //! @endcond
274 };
275 
276 /** Return begin of feature iterator.
277  *
278  * Using this iterator for standard range-based loops is safe, but
279  * due to implementation limitations, you shouldn't try to access
280  * (dereference) more than one iterator step at a time, since the
281  * std::unique_ptr&lt;OGRFeature&gt; reference is reused.
282  *
283  * Only one iterator per layer can be active at a time.
284  * @since GDAL 2.3
285  * @see OGRLayer::begin()
286  */
begin(OGRLayer * poLayer)287 inline OGRLayer::FeatureIterator begin(OGRLayer* poLayer) { return poLayer->begin(); }
288 
289 /** Return end of feature iterator.
290  * @see OGRLayer::end()
291  */
end(OGRLayer * poLayer)292 inline OGRLayer::FeatureIterator end(OGRLayer* poLayer) { return poLayer->end(); }
293 
294 /** Unique pointer type for OGRLayer.
295  * @since GDAL 3.2
296  */
297 using OGRLayerUniquePtr = std::unique_ptr<OGRLayer>;
298 
299 /************************************************************************/
300 /*                     OGRGetNextFeatureThroughRaw                      */
301 /************************************************************************/
302 
303 /** Template class offering a GetNextFeature() implementation relying on
304  * GetNextRawFeature()
305  *
306  * @since GDAL 3.2
307  */
308 template<class BaseLayer> class OGRGetNextFeatureThroughRaw
309 {
310 public:
311 
312     /** Implement OGRLayer::GetNextFeature(), relying on BaseLayer::GetNextRawFeature() */
GetNextFeature()313     OGRFeature* GetNextFeature()
314     {
315         const auto poThis = static_cast<BaseLayer*>(this);
316         while( true )
317         {
318             OGRFeature *poFeature = poThis->GetNextRawFeature();
319             if (poFeature == nullptr)
320                 return nullptr;
321 
322             if((poThis->m_poFilterGeom == nullptr
323                 || poThis->FilterGeometry( poFeature->GetGeometryRef() ) )
324             && (poThis->m_poAttrQuery == nullptr
325                 || poThis->m_poAttrQuery->Evaluate( poFeature )) )
326             {
327                 return poFeature;
328             }
329             else
330                 delete poFeature;
331         }
332     }
333 };
334 
335 /** Utility macro to define GetNextFeature() through GetNextRawFeature() */
336 #define DEFINE_GET_NEXT_FEATURE_THROUGH_RAW(BaseLayer) \
337     private: \
338         friend class OGRGetNextFeatureThroughRaw<BaseLayer>; \
339     public: \
340         OGRFeature* GetNextFeature() override { return OGRGetNextFeatureThroughRaw<BaseLayer>::GetNextFeature(); }
341 
342 
343 /************************************************************************/
344 /*                            OGRDataSource                             */
345 /************************************************************************/
346 
347 /**
348  * LEGACY class. Use GDALDataset in your new code ! This class may be
349  * removed in a later release.
350  *
351  * This class represents a data source.  A data source potentially
352  * consists of many layers (OGRLayer).  A data source normally consists
353  * of one, or a related set of files, though the name doesn't have to be
354  * a real item in the file system.
355  *
356  * When an OGRDataSource is destroyed, all its associated OGRLayers objects
357  * are also destroyed.
358  *
359  * NOTE: Starting with GDAL 2.0, it is *NOT* safe to cast the handle of
360  * a C function that returns a OGRDataSourceH to a OGRDataSource*. If a C++ object
361  * is needed, the handle should be cast to GDALDataset*.
362  *
363  * @deprecated
364  */
365 
366 class CPL_DLL OGRDataSource : public GDALDataset
367 {
368 public:
369                         OGRDataSource();
370 //! @cond Doxygen_Suppress
371     virtual const char  *GetName() OGR_DEPRECATED("Use GDALDataset class instead") = 0;
372 
373     static void         DestroyDataSource( OGRDataSource * ) OGR_DEPRECATED("Use GDALDataset class instead");
374 //! @endcond
375 };
376 
377 /************************************************************************/
378 /*                             OGRSFDriver                              */
379 /************************************************************************/
380 
381 /**
382  * LEGACY class. Use GDALDriver in your new code ! This class may be
383  * removed in a later release.
384  *
385  * Represents an operational format driver.
386  *
387  * One OGRSFDriver derived class will normally exist for each file format
388  * registered for use, regardless of whether a file has or will be opened.
389  * The list of available drivers is normally managed by the
390  * OGRSFDriverRegistrar.
391  *
392  * NOTE: Starting with GDAL 2.0, it is *NOT* safe to cast the handle of
393  * a C function that returns a OGRSFDriverH to a OGRSFDriver*. If a C++ object
394  * is needed, the handle should be cast to GDALDriver*.
395  *
396  * @deprecated
397  */
398 
399 class CPL_DLL OGRSFDriver : public GDALDriver
400 {
401   public:
402 //! @cond Doxygen_Suppress
403     virtual     ~OGRSFDriver();
404 
405     virtual const char  *GetName() OGR_DEPRECATED("Use GDALDriver class instead") = 0;
406 
407     virtual OGRDataSource *Open( const char *pszName, int bUpdate=FALSE ) OGR_DEPRECATED("Use GDALDriver class instead") = 0;
408 
409     virtual int            TestCapability( const char *pszCap ) OGR_DEPRECATED("Use GDALDriver class instead") = 0;
410 
411     virtual OGRDataSource *CreateDataSource( const char *pszName,
412                                              char ** = nullptr ) OGR_DEPRECATED("Use GDALDriver class instead");
413     virtual OGRErr      DeleteDataSource( const char *pszName ) OGR_DEPRECATED("Use GDALDriver class instead");
414 //! @endcond
415 };
416 
417 /************************************************************************/
418 /*                         OGRSFDriverRegistrar                         */
419 /************************************************************************/
420 
421 /**
422  * LEGACY class. Use GDALDriverManager in your new code ! This class may be
423  * removed in a later release.
424  *
425  * Singleton manager for OGRSFDriver instances that will be used to try
426  * and open datasources.  Normally the registrar is populated with
427  * standard drivers using the OGRRegisterAll() function and does not need
428  * to be directly accessed.  The driver registrar and all registered drivers
429  * may be cleaned up on shutdown using OGRCleanupAll().
430  *
431  * @deprecated
432  */
433 
434 class CPL_DLL OGRSFDriverRegistrar
435 {
436 
437                 OGRSFDriverRegistrar();
438                 ~OGRSFDriverRegistrar();
439 
440     static GDALDataset* OpenWithDriverArg(GDALDriver* poDriver,
441                                                  GDALOpenInfo* poOpenInfo);
442     static GDALDataset* CreateVectorOnly( GDALDriver* poDriver,
443                                           const char * pszName,
444                                           char ** papszOptions );
445     static CPLErr       DeleteDataSource( GDALDriver* poDriver,
446                                           const char * pszName );
447 
448   public:
449 //! @cond Doxygen_Suppress
450     static OGRSFDriverRegistrar *GetRegistrar() OGR_DEPRECATED("Use GDALDriverManager class instead");
451 
452     // cppcheck-suppress functionStatic
453     void        RegisterDriver( OGRSFDriver * poDriver ) OGR_DEPRECATED("Use GDALDriverManager class instead");
454 
455     // cppcheck-suppress functionStatic
456     int         GetDriverCount( void ) OGR_DEPRECATED("Use GDALDriverManager class instead");
457     // cppcheck-suppress functionStatic
458     GDALDriver *GetDriver( int iDriver ) OGR_DEPRECATED("Use GDALDriverManager class instead");
459     // cppcheck-suppress functionStatic
460     GDALDriver *GetDriverByName( const char * ) OGR_DEPRECATED("Use GDALDriverManager class instead");
461 
462     // cppcheck-suppress functionStatic
463     int         GetOpenDSCount() OGR_DEPRECATED("Use GDALDriverManager class instead");
464     // cppcheck-suppress functionStatic
465     OGRDataSource *GetOpenDS( int ) OGR_DEPRECATED("Use GDALDriverManager class instead");
466 //! @endcond
467 };
468 
469 /* -------------------------------------------------------------------- */
470 /*      Various available registration methods.                         */
471 /* -------------------------------------------------------------------- */
472 CPL_C_START
473 
474 //! @cond Doxygen_Suppress
475 void OGRRegisterAllInternal();
476 
477 void CPL_DLL RegisterOGRFileGDB();
478 void CPL_DLL RegisterOGRShape();
479 void CPL_DLL RegisterOGRDB2();
480 void CPL_DLL RegisterOGRNTF();
481 void CPL_DLL RegisterOGRFME();
482 void CPL_DLL RegisterOGRSDTS();
483 void CPL_DLL RegisterOGRTiger();
484 void CPL_DLL RegisterOGRS57();
485 void CPL_DLL RegisterOGRTAB();
486 void CPL_DLL RegisterOGRMIF();
487 void CPL_DLL RegisterOGROGDI();
488 void CPL_DLL RegisterOGRODBC();
489 void CPL_DLL RegisterOGRWAsP();
490 void CPL_DLL RegisterOGRPG();
491 void CPL_DLL RegisterOGRMSSQLSpatial();
492 void CPL_DLL RegisterOGRMySQL();
493 void CPL_DLL RegisterOGROCI();
494 void CPL_DLL RegisterOGRDGN();
495 void CPL_DLL RegisterOGRGML();
496 void CPL_DLL RegisterOGRLIBKML();
497 void CPL_DLL RegisterOGRKML();
498 void CPL_DLL RegisterOGRFlatGeobuf();
499 void CPL_DLL RegisterOGRGeoJSON();
500 void CPL_DLL RegisterOGRGeoJSONSeq();
501 void CPL_DLL RegisterOGRESRIJSON();
502 void CPL_DLL RegisterOGRTopoJSON();
503 void CPL_DLL RegisterOGRAVCBin();
504 void CPL_DLL RegisterOGRAVCE00();
505 void CPL_DLL RegisterOGRREC();
506 void CPL_DLL RegisterOGRMEM();
507 void CPL_DLL RegisterOGRVRT();
508 void CPL_DLL RegisterOGRDODS();
509 void CPL_DLL RegisterOGRSQLite();
510 void CPL_DLL RegisterOGRCSV();
511 void CPL_DLL RegisterOGRILI1();
512 void CPL_DLL RegisterOGRILI2();
513 void CPL_DLL RegisterOGRGRASS();
514 void CPL_DLL RegisterOGRPGeo();
515 void CPL_DLL RegisterOGRDXF();
516 void CPL_DLL RegisterOGRCAD();
517 void CPL_DLL RegisterOGRDWG();
518 void CPL_DLL RegisterOGRDGNV8();
519 void CPL_DLL RegisterOGRIDB();
520 void CPL_DLL RegisterOGRGMT();
521 void CPL_DLL RegisterOGRGPX();
522 void CPL_DLL RegisterOGRGeoconcept();
523 void CPL_DLL RegisterOGRIngres();
524 void CPL_DLL RegisterOGRNAS();
525 void CPL_DLL RegisterOGRGeoRSS();
526 void CPL_DLL RegisterOGRGTM();
527 void CPL_DLL RegisterOGRVFK();
528 void CPL_DLL RegisterOGRPGDump();
529 void CPL_DLL RegisterOGROSM();
530 void CPL_DLL RegisterOGRGPSBabel();
531 void CPL_DLL RegisterOGRPDS();
532 void CPL_DLL RegisterOGRWFS();
533 void CPL_DLL RegisterOGROAPIF();
534 void CPL_DLL RegisterOGRSOSI();
535 void CPL_DLL RegisterOGRGeomedia();
536 void CPL_DLL RegisterOGRMDB();
537 void CPL_DLL RegisterOGREDIGEO();
538 void CPL_DLL RegisterOGRSVG();
539 void CPL_DLL RegisterOGRCouchDB();
540 void CPL_DLL RegisterOGRCloudant();
541 void CPL_DLL RegisterOGRIdrisi();
542 void CPL_DLL RegisterOGRARCGEN();
543 void CPL_DLL RegisterOGRXLS();
544 void CPL_DLL RegisterOGRODS();
545 void CPL_DLL RegisterOGRXLSX();
546 void CPL_DLL RegisterOGRElastic();
547 void CPL_DLL RegisterOGRGeoPackage();
548 void CPL_DLL RegisterOGRWalk();
549 void CPL_DLL RegisterOGRCarto();
550 void CPL_DLL RegisterOGRAmigoCloud();
551 void CPL_DLL RegisterOGRSXF();
552 void CPL_DLL RegisterOGROpenFileGDB();
553 void CPL_DLL RegisterOGRSelafin();
554 void CPL_DLL RegisterOGRJML();
555 void CPL_DLL RegisterOGRPLSCENES();
556 void CPL_DLL RegisterOGRCSW();
557 void CPL_DLL RegisterOGRMongoDBv3();
558 void CPL_DLL RegisterOGRMongoDB();
559 void CPL_DLL RegisterOGRVDV();
560 void CPL_DLL RegisterOGRGMLAS();
561 void CPL_DLL RegisterOGRMVT();
562 void CPL_DLL RegisterOGRNGW();
563 void CPL_DLL RegisterOGRMapML();
564 void CPL_DLL RegisterOGRLVBAG();
565 // @endcond
566 
567 CPL_C_END
568 
569 #endif /* ndef OGRSF_FRMTS_H_INCLUDED */
570