映射文件操作

作者

肖恩吉利斯

作者

赛斯·吉文

联系

Sethg在gegraph ika.co.uk网站上

最后更新

2021-05-22

介绍

MapScrip HOWTO文档旨在通过特定主题的用法示例来补充API参考。本文档中的所有示例都是指与MapServer一起分发并位于以下源代码管理中的Mapfile和Testing Layers Mapserver/tests

下面的示例是用Python语言编写的。所有MapScrip语言都使用相同的API,但需要使用相关语言的语法重写。

Mapfile 概述

这里所说的“Mapfile”,我指的是在MapScrip mapObj中(几乎)以任意数字出现的所有元素:层、类和样式。

MAPOBJ类

的一个实例 mapObj 是从零到多的父级 layerObj 孩子们。

新实例

对象的映射文件路径参数 mapObj 构造函数是可选的。下面将生成不带层的默认mapObj。

empty_map = mapscript.mapObj()

A mapObj 以通常的方式从磁盘上的映射文件进行初始化:

test_map = mapscript.mapObj('tests/test.map')

备注

如果您收到以下错误 msProcessProjection(): Projection library error. proj error "No such file or directory" for "init=epsg:4326" 然后确保您已经设置了 PROJ_LIB 环境变量正确无误

克隆

的独立副本,较少的结果和标签缓存 mapObj 可以由 mapObj.clone() 方法:

clone_map = test_map.clone()

备注

JavaMaScript模块实现了一种“C克隆”方法,以避免与Java对象类的克隆方法发生冲突。

储蓄

A mapObj 可以使用保存方法保存到磁盘:

clone_map.save('clone.map')

马波吉的孩子们

MapServer中有一个用于层、类和样式的通用父/子对象API。

引用子级

对Layer、Class和Style子级的引用是通过其父级的类似“getChild”的方法获得的:

i, j, k = 1, 0, 0
layer_i = test_map.getLayer(i)
class_ij =  layer_i.getClass(j)
style_ijk = class_ij.getStyle(k)

这些参考资料只是为了方便起见。MapScript没有任何引用计数,如果您尝试在父级之后使用这些引用,肯定会遇到麻烦 mapObj 已被删除并从内存中释放。

克隆孩子

可以使用的克隆方法创建完全独立的图层、类或样式 layerObjclassObj ,以及 styleObj

clone_layer = layer_i.clone()

此实例没有父级,属于自己。

新生子女

未初始化的实例 layerObjclassObj ,以及 styleObj 可以使用新的构造函数创建:

new_layer = mapscript.layerObj()
new_class = mapscript.classObj()
new_style = mapscript.styleObj()

它们被添加到父对象中,使用父对象的类似“intertChild”的方法,该方法返回子对象插入的索引:

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*方法创建对象的全新副本,并将其存储在父对象中,所有所有权由父对象拥有。请参阅 SWIG API 有关详细信息,请参阅。

向后兼容性

将父对象作为单个参数的旧式式样的子对象构造函数保留在MapServer中:

new_layer = mapscript.layerObj(test_map)
new_class = mapscript.classObj(new_layer)
new_style = mapscript.styleObj(new_class)

删除子项

可以使用类似父对象的“emoveChild”方法删除子对象,这些方法返回已删除对象的独立副本:

# 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个内置限制)。

的元数据属性 webObjlayerObj ,以及 classObj 是以下各项的实例 hashTableObj ,这个类的功能就像一个有限的词典:

layer = test_map.getLayerByName('POLYGON')
layer.metadata.set('wms_name', 'foo')
name = layer.metadata.get('wms_name')   # returns 'foo'

您可以迭代一个类中的所有键:hashTableObj,如下所示:

key = None

while (1):
    key = layer.metadata.nextKey(key)
    if key == None:
        break
    value = layer.metadata.get(key)
    print(key, value)

请注意,在Python中, hashTableObj 可以被当做一本词典。看见 python mapscript附录