1 : /******************************************************************************
2 : * $Id: ogrsf_frmts.h 25268 2012-11-29 20:21:41Z 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 : *
11 : * Permission is hereby granted, free of charge, to any person obtaining a
12 : * copy of this software and associated documentation files (the "Software"),
13 : * to deal in the Software without restriction, including without limitation
14 : * the rights to use, copy, modify, merge, publish, distribute, sublicense,
15 : * and/or sell copies of the Software, and to permit persons to whom the
16 : * Software is furnished to do so, subject to the following conditions:
17 : *
18 : * The above copyright notice and this permission notice shall be included
19 : * in all copies or substantial portions of the Software.
20 : *
21 : * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
22 : * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23 : * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
24 : * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25 : * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
26 : * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
27 : * DEALINGS IN THE SOFTWARE.
28 : ****************************************************************************/
29 :
30 : #ifndef _OGRSF_FRMTS_H_INCLUDED
31 : #define _OGRSF_FRMTS_H_INCLUDED
32 :
33 : #include "gdal.h"
34 : #include "ogr_feature.h"
35 : #include "ogr_featurestyle.h"
36 :
37 : /**
38 : * \file ogrsf_frmts.h
39 : *
40 : * Classes related to registration of format support, and opening datasets.
41 : */
42 :
43 : class OGRLayerAttrIndex;
44 : class OGRSFDriver;
45 :
46 : /************************************************************************/
47 : /* OGRLayer */
48 : /************************************************************************/
49 :
50 : /**
51 : * This class represents a layer of simple features, with access methods.
52 : *
53 : */
54 :
55 : /* Note: any virtual method added to this class must also be added in the */
56 : /* OGRLayerDecorator class. */
57 :
58 : class CPL_DLL OGRLayer
59 : {
60 : protected:
61 : int m_bFilterIsEnvelope;
62 : OGRGeometry *m_poFilterGeom;
63 : OGRPreparedGeometry *m_pPreparedFilterGeom; /* m_poFilterGeom compiled as a prepared geometry */
64 : OGREnvelope m_sFilterEnvelope;
65 :
66 : int FilterGeometry( OGRGeometry * );
67 : //int FilterGeometry( OGRGeometry *, OGREnvelope* psGeometryEnvelope);
68 : int InstallFilter( OGRGeometry * );
69 :
70 : public:
71 : OGRLayer();
72 : virtual ~OGRLayer();
73 :
74 : virtual OGRGeometry *GetSpatialFilter();
75 : virtual void SetSpatialFilter( OGRGeometry * );
76 : virtual void SetSpatialFilterRect( double dfMinX, double dfMinY,
77 : double dfMaxX, double dfMaxY );
78 :
79 : virtual OGRErr SetAttributeFilter( const char * );
80 :
81 : virtual void ResetReading() = 0;
82 : virtual OGRFeature *GetNextFeature() = 0;
83 : virtual OGRErr SetNextByIndex( long nIndex );
84 : virtual OGRFeature *GetFeature( long nFID );
85 : virtual OGRErr SetFeature( OGRFeature *poFeature );
86 : virtual OGRErr CreateFeature( OGRFeature *poFeature );
87 : virtual OGRErr DeleteFeature( long nFID );
88 :
89 : virtual const char *GetName();
90 : virtual OGRwkbGeometryType GetGeomType();
91 : virtual OGRFeatureDefn *GetLayerDefn() = 0;
92 :
93 0 : virtual OGRSpatialReference *GetSpatialRef() { return NULL; }
94 :
95 : virtual int GetFeatureCount( int bForce = TRUE );
96 : virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE);
97 :
98 : virtual int TestCapability( const char * ) = 0;
99 :
100 : virtual const char *GetInfo( const char * );
101 :
102 : virtual OGRErr CreateField( OGRFieldDefn *poField,
103 : int bApproxOK = TRUE );
104 : virtual OGRErr DeleteField( int iField );
105 : virtual OGRErr ReorderFields( int* panMap );
106 : virtual OGRErr AlterFieldDefn( int iField, OGRFieldDefn* poNewFieldDefn, int nFlags );
107 :
108 : virtual OGRErr SyncToDisk();
109 :
110 : virtual OGRStyleTable *GetStyleTable();
111 : virtual void SetStyleTableDirectly( OGRStyleTable *poStyleTable );
112 :
113 : virtual void SetStyleTable(OGRStyleTable *poStyleTable);
114 :
115 : virtual OGRErr StartTransaction();
116 : virtual OGRErr CommitTransaction();
117 : virtual OGRErr RollbackTransaction();
118 :
119 : virtual const char *GetFIDColumn();
120 : virtual const char *GetGeometryColumn();
121 :
122 : virtual OGRErr SetIgnoredFields( const char **papszFields );
123 :
124 : OGRErr Intersection( OGRLayer *pLayerMethod,
125 : OGRLayer *pLayerResult,
126 : char** papszOptions = NULL,
127 : GDALProgressFunc pfnProgress = NULL,
128 : void * pProgressArg = NULL );
129 : OGRErr Union( OGRLayer *pLayerMethod,
130 : OGRLayer *pLayerResult,
131 : char** papszOptions = NULL,
132 : GDALProgressFunc pfnProgress = NULL,
133 : void * pProgressArg = NULL );
134 : OGRErr SymDifference( OGRLayer *pLayerMethod,
135 : OGRLayer *pLayerResult,
136 : char** papszOptions,
137 : GDALProgressFunc pfnProgress,
138 : void * pProgressArg );
139 : OGRErr Identity( OGRLayer *pLayerMethod,
140 : OGRLayer *pLayerResult,
141 : char** papszOptions = NULL,
142 : GDALProgressFunc pfnProgress = NULL,
143 : void * pProgressArg = NULL );
144 : OGRErr Update( OGRLayer *pLayerMethod,
145 : OGRLayer *pLayerResult,
146 : char** papszOptions = NULL,
147 : GDALProgressFunc pfnProgress = NULL,
148 : void * pProgressArg = NULL );
149 : OGRErr Clip( OGRLayer *pLayerMethod,
150 : OGRLayer *pLayerResult,
151 : char** papszOptions = NULL,
152 : GDALProgressFunc pfnProgress = NULL,
153 : void * pProgressArg = NULL );
154 : OGRErr Erase( OGRLayer *pLayerMethod,
155 : OGRLayer *pLayerResult,
156 : char** papszOptions = NULL,
157 : GDALProgressFunc pfnProgress = NULL,
158 : void * pProgressArg = NULL );
159 :
160 : int Reference();
161 : int Dereference();
162 : int GetRefCount() const;
163 :
164 : GIntBig GetFeaturesRead();
165 :
166 : /* non virtual : conveniency wrapper for ReorderFields() */
167 : OGRErr ReorderField( int iOldFieldPos, int iNewFieldPos );
168 :
169 : int AttributeFilterEvaluationNeedsGeometry();
170 :
171 : /* consider these private */
172 : OGRErr InitializeIndexSupport( const char * );
173 924 : OGRLayerAttrIndex *GetIndex() { return m_poAttrIndex; }
174 :
175 : protected:
176 : OGRStyleTable *m_poStyleTable;
177 : OGRFeatureQuery *m_poAttrQuery;
178 : OGRLayerAttrIndex *m_poAttrIndex;
179 :
180 : int m_nRefCount;
181 :
182 : GIntBig m_nFeaturesRead;
183 : };
184 :
185 :
186 : /************************************************************************/
187 : /* OGRDataSource */
188 : /************************************************************************/
189 :
190 : /**
191 : * This class represents a data source. A data source potentially
192 : * consists of many layers (OGRLayer). A data source normally consists
193 : * of one, or a related set of files, though the name doesn't have to be
194 : * a real item in the file system.
195 : *
196 : * When an OGRDataSource is destroyed, all it's associated OGRLayers objects
197 : * are also destroyed.
198 : */
199 :
200 : class CPL_DLL OGRDataSource
201 : {
202 : friend class OGRSFDriverRegistrar;
203 :
204 : void *m_hMutex;
205 :
206 : OGRLayer* BuildLayerFromSelectInfo(void* psSelectInfo,
207 : OGRGeometry *poSpatialFilter,
208 : const char *pszDialect);
209 :
210 : public:
211 :
212 : OGRDataSource();
213 : virtual ~OGRDataSource();
214 : static void DestroyDataSource( OGRDataSource * );
215 :
216 : virtual const char *GetName() = 0;
217 :
218 : virtual int GetLayerCount() = 0;
219 : virtual OGRLayer *GetLayer(int) = 0;
220 : virtual OGRLayer *GetLayerByName(const char *);
221 : virtual OGRErr DeleteLayer(int);
222 :
223 : virtual int TestCapability( const char * ) = 0;
224 :
225 : virtual OGRLayer *CreateLayer( const char *pszName,
226 : OGRSpatialReference *poSpatialRef = NULL,
227 : OGRwkbGeometryType eGType = wkbUnknown,
228 : char ** papszOptions = NULL );
229 : virtual OGRLayer *CopyLayer( OGRLayer *poSrcLayer,
230 : const char *pszNewName,
231 : char **papszOptions = NULL );
232 :
233 : virtual OGRStyleTable *GetStyleTable();
234 : virtual void SetStyleTableDirectly( OGRStyleTable *poStyleTable );
235 :
236 : virtual void SetStyleTable(OGRStyleTable *poStyleTable);
237 :
238 : virtual OGRLayer * ExecuteSQL( const char *pszStatement,
239 : OGRGeometry *poSpatialFilter,
240 : const char *pszDialect );
241 : virtual void ReleaseResultSet( OGRLayer * poResultsSet );
242 :
243 : virtual OGRErr SyncToDisk();
244 :
245 : int Reference();
246 : int Dereference();
247 : int GetRefCount() const;
248 : int GetSummaryRefCount() const;
249 : OGRErr Release();
250 :
251 : OGRSFDriver *GetDriver() const;
252 : void SetDriver( OGRSFDriver *poDriver );
253 :
254 : protected:
255 :
256 : OGRErr ProcessSQLCreateIndex( const char * );
257 : OGRErr ProcessSQLDropIndex( const char * );
258 : OGRErr ProcessSQLDropTable( const char * );
259 : OGRErr ProcessSQLAlterTableAddColumn( const char * );
260 : OGRErr ProcessSQLAlterTableDropColumn( const char * );
261 : OGRErr ProcessSQLAlterTableAlterColumn( const char * );
262 : OGRErr ProcessSQLAlterTableRenameColumn( const char * );
263 :
264 : OGRStyleTable *m_poStyleTable;
265 : int m_nRefCount;
266 : OGRSFDriver *m_poDriver;
267 : };
268 :
269 : /************************************************************************/
270 : /* OGRSFDriver */
271 : /************************************************************************/
272 :
273 : /**
274 : * Represents an operational format driver.
275 : *
276 : * One OGRSFDriver derived class will normally exist for each file format
277 : * registered for use, regardless of whether a file has or will be opened.
278 : * The list of available drivers is normally managed by the
279 : * OGRSFDriverRegistrar.
280 : */
281 :
282 : class CPL_DLL OGRSFDriver
283 0 : {
284 : public:
285 : virtual ~OGRSFDriver();
286 :
287 : virtual const char *GetName() = 0;
288 :
289 : virtual OGRDataSource *Open( const char *pszName, int bUpdate=FALSE ) = 0;
290 :
291 : virtual int TestCapability( const char * ) = 0;
292 :
293 : virtual OGRDataSource *CreateDataSource( const char *pszName,
294 : char ** = NULL );
295 : virtual OGRErr DeleteDataSource( const char *pszName );
296 :
297 : virtual OGRDataSource *CopyDataSource( OGRDataSource *poSrcDS,
298 : const char *pszNewName,
299 : char **papszOptions = NULL );
300 : };
301 :
302 :
303 : /************************************************************************/
304 : /* OGRSFDriverRegistrar */
305 : /************************************************************************/
306 :
307 : /**
308 : * Singleton manager for OGRSFDriver instances that will be used to try
309 : * and open datasources. Normally the registrar is populated with
310 : * standard drivers using the OGRRegisterAll() function and does not need
311 : * to be directly accessed. The driver registrar and all registered drivers
312 : * may be cleaned up on shutdown using OGRCleanupAll().
313 : */
314 :
315 : class CPL_DLL OGRSFDriverRegistrar
316 : {
317 : int nDrivers;
318 : OGRSFDriver **papoDrivers;
319 :
320 : OGRSFDriverRegistrar();
321 :
322 : int nOpenDSCount;
323 : char **papszOpenDSRawName;
324 : OGRDataSource **papoOpenDS;
325 : OGRSFDriver **papoOpenDSDriver;
326 : GIntBig *panOpenDSPID;
327 :
328 : public:
329 :
330 : ~OGRSFDriverRegistrar();
331 :
332 : static OGRSFDriverRegistrar *GetRegistrar();
333 : static OGRDataSource *Open( const char *pszName, int bUpdate=FALSE,
334 : OGRSFDriver ** ppoDriver = NULL );
335 :
336 : OGRDataSource *OpenShared( const char *pszName, int bUpdate=FALSE,
337 : OGRSFDriver ** ppoDriver = NULL );
338 : OGRErr ReleaseDataSource( OGRDataSource * );
339 :
340 : void RegisterDriver( OGRSFDriver * poDriver );
341 : void DeregisterDriver( OGRSFDriver * poDriver );
342 :
343 : int GetDriverCount( void );
344 : OGRSFDriver *GetDriver( int iDriver );
345 : OGRSFDriver *GetDriverByName( const char * );
346 :
347 : int GetOpenDSCount() { return nOpenDSCount; }
348 : OGRDataSource *GetOpenDS( int );
349 :
350 : void AutoLoadDrivers();
351 : };
352 :
353 : /* -------------------------------------------------------------------- */
354 : /* Various available registration methods. */
355 : /* -------------------------------------------------------------------- */
356 : CPL_C_START
357 : void CPL_DLL OGRRegisterAll();
358 :
359 : void CPL_DLL RegisterOGRFileGDB();
360 : void CPL_DLL RegisterOGRShape();
361 : void CPL_DLL RegisterOGRNTF();
362 : void CPL_DLL RegisterOGRFME();
363 : void CPL_DLL RegisterOGRSDTS();
364 : void CPL_DLL RegisterOGRTiger();
365 : void CPL_DLL RegisterOGRS57();
366 : void CPL_DLL RegisterOGRTAB();
367 : void CPL_DLL RegisterOGRMIF();
368 : void CPL_DLL RegisterOGROGDI();
369 : void CPL_DLL RegisterOGRODBC();
370 : void CPL_DLL RegisterOGRPG();
371 : void CPL_DLL RegisterOGRMSSQLSpatial();
372 : void CPL_DLL RegisterOGRMySQL();
373 : void CPL_DLL RegisterOGROCI();
374 : void CPL_DLL RegisterOGRDGN();
375 : void CPL_DLL RegisterOGRGML();
376 : void CPL_DLL RegisterOGRLIBKML();
377 : void CPL_DLL RegisterOGRKML();
378 : void CPL_DLL RegisterOGRGeoJSON();
379 : void CPL_DLL RegisterOGRAVCBin();
380 : void CPL_DLL RegisterOGRAVCE00();
381 : void CPL_DLL RegisterOGRREC();
382 : void CPL_DLL RegisterOGRMEM();
383 : void CPL_DLL RegisterOGRVRT();
384 : void CPL_DLL RegisterOGRDODS();
385 : void CPL_DLL RegisterOGRSQLite();
386 : void CPL_DLL RegisterOGRCSV();
387 : void CPL_DLL RegisterOGRILI1();
388 : void CPL_DLL RegisterOGRILI2();
389 : void CPL_DLL RegisterOGRGRASS();
390 : void CPL_DLL RegisterOGRPGeo();
391 : void CPL_DLL RegisterOGRDXFDWG();
392 : void CPL_DLL RegisterOGRDXF();
393 : void CPL_DLL RegisterOGRDWG();
394 : void CPL_DLL RegisterOGRSDE();
395 : void CPL_DLL RegisterOGRIDB();
396 : void CPL_DLL RegisterOGRGMT();
397 : void CPL_DLL RegisterOGRBNA();
398 : void CPL_DLL RegisterOGRGPX();
399 : void CPL_DLL RegisterOGRGeoconcept();
400 : void CPL_DLL RegisterOGRIngres();
401 : void CPL_DLL RegisterOGRPCIDSK();
402 : void CPL_DLL RegisterOGRXPlane();
403 : void CPL_DLL RegisterOGRNAS();
404 : void CPL_DLL RegisterOGRGeoRSS();
405 : void CPL_DLL RegisterOGRGTM();
406 : void CPL_DLL RegisterOGRVFK();
407 : void CPL_DLL RegisterOGRPGDump();
408 : void CPL_DLL RegisterOGROSM();
409 : void CPL_DLL RegisterOGRGPSBabel();
410 : void CPL_DLL RegisterOGRSUA();
411 : void CPL_DLL RegisterOGROpenAir();
412 : void CPL_DLL RegisterOGRPDS();
413 : void CPL_DLL RegisterOGRWFS();
414 : void CPL_DLL RegisterOGRSOSI();
415 : void CPL_DLL RegisterOGRHTF();
416 : void CPL_DLL RegisterOGRAeronavFAA();
417 : void CPL_DLL RegisterOGRGeomedia();
418 : void CPL_DLL RegisterOGRMDB();
419 : void CPL_DLL RegisterOGREDIGEO();
420 : void CPL_DLL RegisterOGRGFT();
421 : void CPL_DLL RegisterOGRSVG();
422 : void CPL_DLL RegisterOGRCouchDB();
423 : void CPL_DLL RegisterOGRIdrisi();
424 : void CPL_DLL RegisterOGRARCGEN();
425 : void CPL_DLL RegisterOGRSEGUKOOA();
426 : void CPL_DLL RegisterOGRSEGY();
427 : void CPL_DLL RegisterOGRXLS();
428 : void CPL_DLL RegisterOGRODS();
429 : void CPL_DLL RegisterOGRXLSX();
430 : void CPL_DLL RegisterOGRElastic();
431 : void CPL_DLL RegisterOGRPDF();
432 : CPL_C_END
433 :
434 :
435 : #endif /* ndef _OGRSF_FRMTS_H_INCLUDED */
|