RFC 29:OGR集合忽略字段

作者:Martin Dobias

联系方式:wonder.sk@gmail.com

状态:通过

总结

为了提高获取功能时的性能,此RFC提出了一种方法,用于告诉OGR在后续的GetFeature()/GetNextFeature()调用中不需要哪些字段。这些字段将被驱动程序忽略,其值将保持为空。RFC还可以忽略特征几何图形和样式。

常见用例:

  1. 客户端渲染层:可以忽略所有(或大多数)字段,只需要几何图形

  2. 客户端显示属性表:所有字段都是必需的,可以忽略几何图形

细节

将向OGRLayer类添加一个新函数,以允许客户端设置哪些字段将 not 获取:

virtual OGRErr OGRLayer::SetIgnoredFields( const char **papszFields );

以及对C API的等效调用:

OGRErr CPL_DLL OGR_L_SetIgnoredFields( OGRLayerH, const char **papszFields );

参数是按名称列出的要忽略的字段列表,特殊字段名称“OGR_GEOMETRY”和“OGR_STYLE”将被解释为引用要素的几何图形和样式值。

已选择“按字段名传递”,以便我们可以处理OGR_几何体、OGR_样式以及将来可能的一些其他特殊字段。与其指定“所需”字段,不如指定“忽略”字段,这样我们就不会因为未在所需列表中显式列出几何图形和样式之类的内容而意外删除它们。

为papszFields传递NULL将清除忽略的列表。

只要能够解析所有字段名,即使方法不支持字段选择,该方法也将返回OGRERR_NONE。

支持此方法的驱动程序将返回到OLCIgnoreFields(“IgnoreFields”)功能。

该方法将在OGRLayer类的级别上实现:它将解析字段的索引并设置以下新的成员变量,这些变量指示应忽略的内容。这些标志将存储在OGRFeatureDefn和OGRFieldDefn类中,并与这些getter函数一起使用:

bool OGRFieldDefn::IsIgnored();
bool OGRFeatureDefn::IsGeometryIgnored();
bool OGRFeatureDefn::IsStyleIgnored();

getter成员函数将由setter函数补充,供OGRLayer使用。将禁止客户端直接设置“忽略”标志。

可选方法 SetIgnoredFields() 如果驱动程序有特殊需要,可以在驱动程序实现中重写。

驱动程序中的实现

驱动程序的实现将需要小的调整,以支持这个RFC。不使用此添加的驱动程序只会继续获取调用者未请求的字段/几何体/样式。

驱动程序实现的调整如下:

if (!poDefn->IsGeometryIgnored())
{
  // fetch geometry
}
if (!poDefn->IsStyleIgnored())
{
  // fetch style
}

for( int iField = 0; iField < poDefn->GetFieldCount(); iField++ )
{
  if (poDefn->GetFieldDefn(iField)->IsIgnored())
    continue;

  // fetch field
}

兼容性

此更改完全向后兼容:默认情况下,OGR将继续获取几何体、样式和所有字段。只有使用提议的API的应用程序才会体验到新的行为。

最初,只有一些驱动程序(Shapefile和少数其他驱动程序)将实现这个RFC。当采用RFC时,不需要修改所有现有的驱动程序-不考虑忽略字段的驱动程序将像以前一样简单地获取所有属性。要检查驱动程序是否支持此RFC,可以检查OLCIgnoreFields功能。

ogr2ogr命令行工具将使用这个RFC,以防它收到带有所需字段列表的-select参数。将忽略指定字段以外的其他字段。

投票历史

  • 弗兰克·温特丹+1

  • 塔马斯泽凯雷斯+1

  • 丹尼尔·莫里塞特+0

  • 霍华德·巴特勒+0

  • 偶数鲁奥+0