I have identified two principal aims :
- adding support for metadata to OGR driver, datasource and layers (validation of creation options, etc...). That one is easy : make derive the 3 base classes from the GDALMajorObject class
- more difficult and ambitious: making it possible to have a Dataset that contains both raster and vector data. You just open the data container once and can get both raster and vector data. Possible use cases: GeoPackage, PCIDSK, Spatialite/Rasterlite, Postgis/Postgis raster, ...
The class hierarchy of GDAL/OGR 1.X versions is quite simple :
So definitely 2 seperate worlds.
To achieve the first aim of getting metadata into OGR, you just have to do :
And now let's consider where the second aim could lead us :
Another way of presenting it with more details is the following pseudo-code :
/* Interface for major object */
class GDALIMajorObject
{
public:
virtual char **GetMetadataDomainList() = 0;
virtual char **GetMetadata( const char * pszDomain = "" );
[other methods go here]
};
/* Implementation of major object, and base class for dataset, bands, layers, etc.. */
class GDALMajorObject: public GDALIMajorObject
{
/* existing code of GDALMajorObject */
};
/* Interface for raster functions */
class GDALIRasterDataset: public GDALIMajorObject
{
public:
virtual int HandleRasterData() = 0;
virtual int GetRasterXSize( void ) = 0;
virtual int GetRasterYSize( void ) = 0;
virtual int GetRasterCount( void ) = 0;
virtual GDALRasterBand *GetRasterBand( int ) = 0;
[other methods go here]
};
/* Interface vor vector functions*/
class GDALIVectorDataset: public GDALIMajorObject
{
public:
virtual int HandleVectorData() = 0;
virtual int GetLayerCount() = 0;
virtual OGRLayer *GetLayer(int) = 0;
[other methods go here]
};
/* Convenience interface for both raster and vector functions */
class GDALIDataset: public GDALIRasterDataset, public GDALIVectorDataset
{
public:
/* That's all ! */
};
/* Partial implementation of GDALIRasterDataset */
class GDALAbstractRasterDataset : public GDALIRasterDataset, public GDALMajorObject
{
/* Current code of GDALDataset GDAL v1 goes here */
public:
virtual int HandleRasterData() { return TRUE; }
};
/* Convenience class used by vector only drivers */
class GDALEmptyRasterDataset : GDALAbstractRasterDataset
{
public:
virtual int HandleRasterData() { return FALSE; }
};
/* Partial implementation of GDALIVectorDataset */
class GDALAbstractVectorDataset : public GDALIVectorDataset, public GDALMajorObject
{
/* Current code of OGRDatasource GDAL v1 goes here*/
public:
virtual int HandleVectorData() { return TRUE; }
};
/* Convenience class used by raster only drivers */
class GDALEmptyVectorDataset : public GDALIVectorDataset
{
public:
virtual int HandleVectorData() { return FALSE; }
virtual int GetLayerCount() { return 0; }
virtual OGRLayer *GetLayer(int) { return NULL; }
[other methods go here]
};
/* Equivalent of GDALDataset GDAL v1 (plus dummy vector interface). Existing GDAL drivers would derive from it. */
class GDALRasterDataset : public GDALAbstractRasterDataset, public virtual GDALEmptyVectorDataset, public virtual GDALIDataset
{
};
/* Equivalent of OGRDatasource GDAL v1 (plus dummy raster interface). Existing OGR drivers would derive from it. */
class GDALVectorDataset : public GDALAbstractVectorDataset, public virtual GDALEmptyRasterDataset, public virtual GDALIDataset
{
};
/* GDAL v2 base class for new drivers that need both raster and vector data */
class GDALDataset : public GDALAbstractRasterDataset, public virtual GDALAbstractVectorDataset, public virtual GDALIDataset
{
};
The impact on the existing code base is :
- Current GDAL drivers must replace mentions of GDALDataset by GDALRasterDataset (automatic conversion)
- Current OGR drivers must replace mentions of OGRDatasource by GDALVectorDataset (automatic conversion)
- OGRDatasourceH becomes an alias of GDALDatasetH
- C methods cast the opaque dataset pointer GDALDatasetH to GDALIDataset before invoking the C++ methods.
A few questions:
RépondreSupprimer1) Why the need GDALAbstractXXXDataset and GDALEmptyXXXDataset? May be Abstract will be enouth?
2) There is some therminology problem GDALIMajorObject and GDALMajorObject.
3) The metadata may be on dataset level and band/layer level. So it maybe to do GDALMajorDataset for datasets and GDALMajorLayer for band/layer?