MS RFC 33: 从maplayer.c中删除mslayerwhichitems()。¶
- 日期
2007/07/09
- 作者
史蒂夫·莱姆
- 联系方式
明尼苏达州第纳尔的史蒂夫·莱姆
- 最后编辑
2007/07/09
- 状态
草案
- 版本
MAPServer 5
概述¶
函数mslayerwhichitems()是maplayer.c中的一个函数,它精确地确定需要从给定的数据源中检索哪些功能属性。检查所有基于项的属性(例如ClassItem、绑定属性、表达式等),并编译主列表(数组)。同时进行索引引用(如classitemindex、labelitemindex等)。在运行时,使用项索引而不是名称来访问属性值。
此方法的问题在于用于绘制或查询的第一遍的功能(shapeobj)与用于表示的功能(查询的第二遍)不同。查询的第二个过程使用mslayergetshape(),默认情况下,它请求某个功能的所有属性,因为我们不知道提前会输出哪些属性。
通过删除mslayerwhichitems()并始终检索所有属性,无论是绘制、查询还是通过模板输出,功能都是一个功能,因此缓存功能现在变得实用了。
技术解决方案¶
如前所述,mslayerwhichitems()可以做一些事情。其中一些功能需要以某种方式保留,如下所述。
层项数组:此数组通常由mslayerwhichitems()调用填充。相反,应该在MSlayerOpen中打开层时填充它。(有道理吗?)
索引引用:在呈现或查询过程中,必须将属性名链接到索引值,而不是提前。基本上,使用属性的代码必须首先检查参数是否不为空,然后如果未设置索引引用,则必须调用如下所示的函数。虽然这会影响代码库中大量的位置,但变化相对较小。属性绑定的使用隔离了大部分代码,因此对于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 */
}
逻辑表达式处理:表达式维护自己要处理的项的单独列表,因此在处理过程中,必须像上面的2一样创建此列表。要执行此操作的代码作为mslayerwhichitems()的一部分存在,并将以其他名称保留。
注解
此RFC不处理单次传递查询,而是为它们设置阶段。后续的绘图、查询和模板输出过程将保持不变。
常规C API更改¶
maplayer.c-mslayerwhichitems()消失。mslayeropen()现在设置layer->items数组。
maputil.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¶
没有预期的变化。
向后兼容性问题¶
一个也没有。这是一个新功能。
臭虫识别码¶
没有指定。
投票历史¶
没有