映射文件操作¶
- 作者
肖恩吉利斯
- 作者
赛斯·吉文
- 联系
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
已被删除并从内存中释放。
克隆孩子¶
可以使用的克隆方法创建完全独立的图层、类或样式 layerObj
, classObj
,以及 styleObj
:
clone_layer = layer_i.clone()
此实例没有父级,属于自己。
新生子女¶
未初始化的实例 layerObj
, classObj
,以及 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个内置限制)。
的元数据属性 webObj
, layerObj
,以及 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附录 。