MS RFC 33:从maplayer.c中删除mslayerwhichitems()。

日期

2007/07/09

作者

史蒂夫·莱姆

联系

明尼苏达州第纳尔的史蒂夫·莱姆

最后编辑

2007/07/09

状态

草案

版本

MAPServer 5

概述

函数msLayerWhichItems()是maplayer.c中的一个函数,它准确地确定需要从给定数据源检索哪些要素属性。所有基于项的属性(例如CLASSITEM、绑定属性、表达式等)被选中,并编译一个列表(数组)。同时进行索引引用(例如,Classitemindex、Labelitemindex等)。在运行时使用项索引而不是名称来访问属性值。

此方法的问题在于用于绘制或查询的第一遍的功能(shapeobj)与用于表示的功能(查询的第二遍)不同。查询的第二个过程使用mslayergetshape(),默认情况下,它请求某个功能的所有属性,因为我们不知道提前会输出哪些属性。

通过删除mslayerwhichitems()并始终检索所有属性,无论是绘制、查询还是通过模板输出,功能都是一个功能,因此缓存功能现在变得实用了。

技术解决方案

如前所述,mslayerwhichitems()可以做一些事情。其中一些功能需要以某种方式保留,如下所述。

  1. 层项数组:此数组通常由mslayerwhichitems()调用填充。相反,应该在MSlayerOpen中打开层时填充它。(有道理吗?)

  2. 索引引用:在呈现或查询过程中,必须将属性名链接到索引值,而不是提前。基本上,使用属性的代码必须首先检查参数是否不为空,然后如果未设置索引引用,则必须调用如下所示的函数。虽然这会影响代码库中大量的位置,但变化相对较小。属性绑定的使用隔离了大部分代码,因此对于5.0版来说,这一更改比以前要小。

int msGetItemIndex(char **itemlist, int numitems, char *item) {
  int i;

  if (!itemlist || numitems <= 0 || !item) return -1;

  for (i=0; i<numitems; i++)
    if(strcasecmp(itemlist[i], item) return i;

  return -1; /* failure */
}
  1. 逻辑表达式处理:表达式维护自己要处理的项的单独列表,因此在处理过程中,必须像上面的2一样创建此列表。要执行此操作的代码作为mslayerwhichitems()的一部分存在,并将以其他名称保留。

备注

此RFC不处理单次传递查询,而是为它们设置阶段。后续的绘图、查询和模板输出过程将保持不变。

常规C API更改

maplayer.c-mslayerwhichitems()消失。mslayeropen()现在设置layer->items数组。

C绑定函数现在必须在执行时分配索引引用。将ClassObj分配给特性的函数也是如此。

mapdraw.c-layerItemIndex和ClassItemIndex现在必须动态赋值。

输入驱动程序更改

不清楚每个驱动程序如何使用mslayerWhichitems()的输出。它可能与调用mslayerGetitems()一样简单,而不是在mslayerOpen()中使用mslayerGetiteminfo(),在这种情况下,我们也会为每个驱动程序释放mslayerGetiteminfo()函数(以及主包装函数)。待办事项…

mapshape.c-mapsde.c-mapogr.cpp-mappostgis.c-maporaclespatial.c-mapmygis.c-

MapScript

没有变化。

Mapfile

没有预期的变化。

向后兼容性问题

一个也没有。这是一个新功能。

臭虫识别码

没有指定。

投票历史

没有