MS RFC 114:更快地检索形状计数

日期

2016/02

作者

甚至鲁奥

联系

even.rouault@spatialys.com

状态

采用

版本

MAPServer 7.2

基金

加拿大气象局

1。动机

WFS协议的resultType=hits查询仅返回指定层的功能数量,同时考虑到可选的边界框和/或过滤器。

参见“结果类型参数”一章( OGC WFS 2.0 specification 教派。7.3.3.6)

目前,mapserver通过检索所有单独的匹配特性并对它们进行计数来实现这些请求,例如在完整的getfeature响应中,对于RDBMS数据提供程序,在速度和带宽方面,这是次优的。

2。建议的增强

在mapserver层vtable中增加了一种新的虚拟方法

int (*LayerGetShapeCount)(layerObj *layer, rectObj rect, projectionObj *rectProjection);

它的语义是返回与潜在过滤器和范围匹配的形状数。矩形投影是表示矩形的投影,如果在图层投影中考虑矩形,则可以为空。这相当于调用mslayerwhichshapes()并计算mslayernextshape()返回的形状数,如果layer->maxfeatures limitation->maxfeatures>=0,则返回的形状数,如果layer->startindex>=1,则返回的形状数,并且启用分页。如果失败,它应该返回-1。

当只请求功能计数时(即map->query.only缓存结果计数=1),并且定义了一个层模板时,msquerybyrect()和msquerybyfilter()将调用此方法(如果未定义任何层模板,WFS代码将传统地设置一个假层模板“ttt.html”,以禁用任何类模板)。这种查询只由WFS服务器代码完成。

提供了使用mslayerwhichshapes()和mslayernextshape()的layerGetShapeCount()的默认实现,并在PostGIS驱动程序中完成了专门的实现。此实现包括从(正常的SQL查询)调用select count(*)。

为什么在layerGetShapeCount()中指定rectProjection,而不假定rect在层投影中?原因是完全符合msquerybyrect()的当前语义,该语义检查检索到的功能是否与映射投影中的边界框相交(对于WFS查询,映射投影是srsname指定的映射投影)。对于postgis提供程序,可以在以下查询中进行转换,以进行快速的bbox筛选,然后对候选记录进行更精确的交集:(u层投影中的_几何与_层投影中的_-bbox_)和(而不是st-disjoint(st-disjoint(the_几何,rectprojectionsrid),rectprojection))。

2.2向后兼容性

此更改没有向后兼容性效果,与当前实现保持相同的语义。

2.3性能影响

对于能够有效实现layerGetShapeCount()的驱动程序,应该会导致性能提高

当前,resultType=hits满足由wfs_MaxFeatures Web元数据项定义的服务器端限制,即在定义wfs_MaxFeatures时,返回的最大功能数限制为wfs_MaxFeatures。原因是限制了MapServer检索到的功能的数量。这种行为现在可以用一个新的Web元数据项来控制:“wfs_MaxFeatures_ignore_for_ResultType_hits”“true”(或“false”)。当设置为true时,命中操作不再受WFS_MaxFeatures的限制。该项的默认值取决于查询的层:如果它们都有一个有效的layerGetShapeCount()操作(即当前是PostGIS层),则默认值为“真”。否则就是“错误”。

注意:当然,任何客户机指定的maxfeatures/count参数都会覆盖这些服务器端设置,而客户机请求的功能数量不超过服务器端限制。

2.4个局限性

layerGetShapeCount()的专门实现只在postgis驱动程序中完成。可以类似地扩展到具有SQL语义并实现layerTranslateFilter()的提供程序:Oracle、MSSQL SPATIC

三。实施细节

3.1受影响的文件

  • mapquery.c:在msquerybyrect()和msquerybyfilter()中使用mslayerGetFeatureCount()。

  • c:定义mslayerGetFeatureCount()和layerDefaultGetFeatureCount()。

  • mapwfs.c:考虑到“wfs_maxfeatures_ignore_for_resultType_hits”

  • mappostgis.c:实现layerGetFeatureCount()。

  • 其他提供程序:添加layerGetFeatureCount使用默认实现的注释

3.2跟踪问题

3.3文件

将更新WFS服务器的文档,以记录“WFS_MaxFeatures_Ignore_for_ResultType_Hits”元数据项。

第四章。投票历史

+1来自tomk、jeff、michaels、stephenw、thomasb、danielm、stevel、jukkar、stephenm、perryn和tamass。