RFC 10:OGR开放参数(未实现)

作者:安德烈·基塞列夫

联系方式:dron@ak4719.spb.edu

现状:发展, not 实施

总结

建议将OGRSFDriver::Open()和ogrsfdriverregistrator::Open()调用更改为接受包含调用方提供的任意附加参数的附加参数。将引入OGROpenEx()函数以将此新功能映射到C接口。此外,建议在ogrsfdriverregistrator::Open()调用中添加“update”标志,以避免使用ogrsfdriverregistrator::OpenShared()方法。

开放参数

有时需要向OGR驱动程序传递附加信息以及要打开的数据集的名称。例如,它可以是样式表名称(某些驱动程序允许从各种样式表中选择)或任何其他附加数据。以前的方法是在数据集名称字符串中编码额外的信息。这种方法很不方便,因此它建议在表示打开选项的OGRSFDriver::Open()和ogrsfdriverregistrator::Open()调用中使用单独的参数,就像在OGRDataSource::CreateLayer()调用中实现的那样。

假定open选项将以形成字符串列表的NAME=VALUE对的形式提供。

除了options参数,特殊的“shared”标志将添加到ogrsfdriverregistrator::Open()调用中,因此不需要单独的ogrsfdriverregistrator::OpenShared()方法。

实施

所有Open()函数将按以下方式更改:

static OGRDataSource *
OGRSFDriverRegistrar::Open( const char * pszName, int bUpdate,
                            OGRSFDriver ** ppoDriver,
                int bShared = FALSE,
                char **papszOptions = NULL );
OGRDataSource *
OGRSFDriverRegistrar::OpenShared( const char * pszName, int bUpdate,
                                  OGRSFDriver ** ppoDriver )
    { return Open( pszName, bUpdate, ppoDriver, TRUE, NULL ); }
virtual OGRDataSource
OGRSFDriver::*Open( const char *pszName, int bUpdate=FALSE,
                    char **papszOptions = NULL ) = 0;

最后一个更改需要在所有OGR驱动程序中传播。更改本身非常简单:应该在函数定义中添加一个附加参数。但它对第三方OGR驱动程序有影响:它们不再与源代码兼容,也应该更改。

还将添加适当的C函数:

OGRDataSourceH OGROpenEx( const char *pszName, int bUpdate,
                          OGRSFDriverH *pahDriverList,
              int bShared, char **papszOptions );
OGRDataSourceH OGR_Dr_OpenEx( OGRSFDriverH hDriver, const char *pszName,
                              int bUpdate, char **papszOptions );

OGR实用程序的新选项

建议的功能将通过'-doo NAME=VALUE'(“Datasource Open Option”)格式特定参数在OGR实用程序ogr2ogr和ogrinfo中提供。

向后兼容性

建议的添加不会对C二进制兼容性产生任何影响。C++二进制接口将被打破,源级兼容性将被打破,只为第三方OGR驱动程序。对源代码级的高级应用程序没有影响。

责任和时间表

安德烈·基塞列夫负责执行这项提议。新的API将在GDAL 1.5.0中提供。