MS RFC 19:样式和标签属性绑定

日期

2006年6月7日

作者

史蒂夫·莱姆

联系

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

状态

通过(进行中)

版本

MAPServer 5

说明:目前,MapServer支持对一些选定属性(如角度)绑定标签和样式属性。但是,添加新的绑定会导致不必要的复杂结构和难以维护的代码,这很麻烦。这个RFC提出了一些想法,为混乱带来一些秩序,并使这种能力的扩展更容易实现。

C结构变化

将添加名为attributeBindingObj的新结构:

typedef struct {
  char *item;
  char index;
} attributeBindingObj;

然后,几个新的枚举将定义可以绑定的属性:

#define MS_STYLE_BINDING_LENGTH ...
#define MS_STYLE_BINDING_ENUM { MS_STYLE_BINDING_SIZE, MS_STYLE_BINDING_ANGLE, ... };

#define MS_LABEL_BINDING_LENGTH ...
#define MS_LABEL_BINDING_ENUM { MS_LABEL_BINDING_SIZE, MS_LABEL_BINDING_ANGLE, ... };

将从layerobj和styleobj中删除几个元素。例如,将删除angleitem、angleitemindex和类似成员。StyleObj和Labelobj各有2名新成员:

char hasBindings;
attributeBindingObj bindings[MS_STYLE_BINDING_LENGTH];

mapfile/mapscript更改

像sizetem和angleitem这样的选项会消失。而是一种更符合逻辑的语法,例如:

STYLE
  SIZE [mySizeItem]
  ANGLE [myAngleItem]
  COLOR 255 0 0
  SYMBOL 'square'
END

在MapServer模板和表达式中,方括号用于绑定到属性,因此在这种情况下,方括号是表示属性绑定的自然选择。

同样,mapscript也会失去设置/获取xxxitem属性的能力。相反,样式和标签对象将获得setbinding和deletebinding方法:

(in Perl)
$style->setBinding($mapscript::MS_STYLE_BINDING_SIZE, 'mySizeItem');
$style->deleteBinding($mapscript::MS_STYLE_BINDING_COLOR);

受影响的文件

  • map.h=>结构更改、枚举和定义添加

  • maputil.c=>添加msStyleBindAttributes();

void msStyleBindAttributes(shapeObj *shape, styleObj *style)
{
  if(style->bindings[MS_STYLE_BINDING_SIZE].item)
    style->size = atoi(shape->values[style->bindings[MS_STYLE_BINDING_SIZE].index]);
  if(style->bindings[MS_STYLE_BINDING_ANGLE].item)
    style->angle = atoi(shape->values[style->bindings[MS_STYLE_BINDING_ANGLE].index]);
  ...
}
  • maplabel.c=>添加mslabelbindattributes();

  • maplayer.c=>修复mswhichitems()以填充绑定索引

  • mapdraw.c=>删除对xxxitem属性的引用,如果样式或标签具有绑定,则调用msStyleBindAttributes或msLabelBindAttributes

  • mapfile.c=>修复对hangle字符串的解析,除了所有支持的绑定的数字(符号已经允许这样做),如果定义了绑定,请翻转hasbindings标志,删除对xxxitem属性的所有引用,更改样式和标签写入代码,以将绑定作为输出的一部分。

  • mapcopy.c=>修复样式和标记复制

  • maplexer.l/mapfile.h=>删除XXXitem定义和lexer引用,并定义一个新的原始类型(类似于ms_字符串),称为ms_绑定

  • mapscript/swiginc/style.i=>添加setbinding和deletebinding方法(类似于php/mapscript)

测试

  • python套件:需要测试来设置和删除绑定

  • MSAutoTest套件:将开发测试各种绑定的映射文件(DNR测试有一个标签示例)

向后兼容性问题

这确实会影响许多参数,但是它们使用得很轻,因此这可能是值得冒险的。主要风险是破坏映射文件而不是脚本。考虑到这肯定会打破一些东西,我认为这是最合适的5.0变化。

臭虫识别码

2100

投票历史

+1莱姆、莫里塞特、伍德布里奇