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<OGRFeature> 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