Mapfile 操作¶
- 作者
肖恩吉利斯
介绍¶
mapscript howto文档旨在用特定主题的用法示例来补充API引用。本文档中的所有示例都是指与MapServer 4.2+一起分发并在MapServer/Tests下找到的 Mapfile 和测试层。
伪码¶
所有示例都将使用与语言无关的API引用一致的伪代码。每行都是一个语句。对于对象属性和方法,我们使用点,'.'运算符。对象的创建和删除将用“new”和“del”关键字表示。除此之外,伪代码看起来很像Python。
Mapfile 概述¶
这里的“mapfile”是指在mapscript mapobj中以(几乎)任意数字出现的所有元素:层、类和样式。MapServer4.4大大提高了操作这些对象的能力。
MAPOBJ类¶
mapobj的一个实例是零到多个layerobj子级的父级。
新实例¶
mapscript.mapobj构造函数的mapfile path参数现在是可选的::
empty_map = new mapscript.mapObj
生成没有图层的默认mapobj。mapobj是从磁盘上的mapfile以通常的方式初始化的:
test_map = new mapscript.mapObj('tests/test.map')
克隆¶
新的mapobj.clone()方法可以生成mapobj的独立副本(更少的结果和标签缓存)::
clone_map = test_map.clone()
注解
JavaMaScript模块实现了一种“C克隆”方法,以避免与Java对象类的克隆方法发生冲突。
储蓄¶
可以使用save方法将mapobj保存到磁盘:
clone_map.save('clone.map')
坦率地说,MsaveMeApp()函数是MaPbOb::Faund的基础。您的里程可能会有所不同。
马波吉的孩子们¶
在MapServer 4.4中有一个用于层、类和样式的通用父/子对象API。
引用子级¶
对层、类和样式子级的引用是通过其父级的类似getchild的方法获得的:
layer_i = test_map.getLayer(i)
class_ij = layer_i.getClass(j)
style_ijk = class_ij.getStyle(k)
这些参考资料仅供参考。mapscript没有任何引用计数,如果在父mapobj被删除并从内存中释放后尝试使用这些引用,则肯定会遇到问题。
克隆孩子¶
可以使用layerobj、classobj和styleobj:的克隆方法创建完全独立的层、类或样式:
clone_layer = layer_i.clone()
此实例没有父级,属于自己。
新生子女¶
可以使用新的构造函数创建未初始化的layerobj、classobj或styleobj实例::
new_layer = new mapscript.layerObj
new_class = new mapscript.classObj
new_style = new mapscript.styleObj
并使用父对象的“insertchild”类方法添加到父对象中,该方法返回插入子对象的索引:
li = test_map.insertLayer(new_layer)
ci = test_map.getLayer(li).insertClass(new_class)
si = test_map.getLayer(li).getClass(ci).insertStyle(new_style)
insert*方法创建一个对象的全新副本,并将其存储在父对象中,所有所有权由父对象接管。
有关详细信息,请参阅API参考。
向后兼容性¶
将父对象作为单个参数的旧样式子对象构造函数::
new_layer = new mapscript.layerObj(test_map)
new_class = new mapscript.classObj(new_layer)
new_style = new mapscript.styleObj(new_class)
保留在MapServer 4.4中。
删除子项¶
子对象可以使用类似于父对象的“removechild”方法删除,该方法返回被删除对象的独立副本:
# following from the insertion example ...
# remove the inserted style, returns a copy of the original new_style
removed_style = test_map.getLayer(li).getClass(ci).removeStyle(si)
removed_class = test_map.getLayer(li).removeClass(ci)
removed_layer = test_map.removeLayer(li)
元数据¶
map、layer和class元数据是mapfile的其他任意编号的元素(最多41个内置限制)。
新API¶
在MapServer 4.4中,mapobj.web、layerobj和classobj的元数据属性是hashTableobj的实例,hashTableobj是一个类似于有限字典的类:
layer.metadata.set('wms_name', 'foo')
name = layer.metadata.get('wms_name') # returns 'foo'
您可以迭代hashTableObj中的所有键,例如:
key = NULL
while (1):
key = layer.metadata.nextKey(key)
if key == NULL:
break
value = layer.metadata.get(key)
...
有关详细信息,请参阅API参考(mapscript.txt)。
元数据的向后兼容性¶
mapobj、layerobj和classobj的旧getmetadata和setmetadata方法仍供旧程序使用。