MS RFC 114:更快地检索形状计数¶
- 日期
2016/02
- 作者
甚至鲁奥
- 联系方式
- 状态
采用
- 版本
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跟踪问题¶
测试:添加了4个新的测试用例(https://github.com/mapserver/msautotest/commit/05e8264ce737a795d81f1a87614fa5c87399de91),以测试resultType=hits的行为(使用过滤器),以及已经存在的WFS测试通过。
3.3文件¶
将更新WFS服务器的文档,以记录“WFS_MaxFeatures_Ignore_for_ResultType_Hits”元数据项。
第四章。投票历史¶
+1来自tomk、jeff、michaels、stephenw、thomasb、danielm、stevel、jukkar、stephenm、perryn和tamass。