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方法仍供旧程序使用。