2. 转化

请注意,本页目前为草稿,有待进一步更新。

mappyfile解析映射文件并将其转换为抽象语法树(ast)。然后,映射文件转化器类将此树转换为python字典。这为Python开发人员提供了一个熟悉的数据结构,可以用来进一步编辑映射文件。

例如,使用下面的映射文件:

MAP
    EXTENT -180 -90 180 90
    NAME 'MyMap'
    WEB
        METADATA
            'wms_enable_request' '*'
            'wms_feature_info_mime_type' 'text/html'
        END
    END
    PROJECTION
        "init=epsg:4326"
    END
    LAYER
        PROCESSING 'BANDS=1'
        PROCESSING 'CONTOUR_ITEM=elevation'
        PROCESSING 'CONTOUR_INTERVAL=20'
        EXTENT -180 -90 180 90
        NAME 'rgb'
        TYPE RASTER
        DATA '../data/raster/bluemarble.tif'
        TEMPLATE 'raster.template.html'
    END
END

以下代码可用于查看字典结构(此处表示为JSON对象):

import mappyfile
import json
mf = mappyfile.open("./docs/examples/after.map")

with open("./docs/examples/sample.json", "w") as f:
    json.dump(mf, f, indent=4)

输出:

{
    "__type__": "map", 
    "extent": [
        -180, 
        -90, 
        180, 
        90
    ], 
    "name": "MyMap", 
    "web": {
        "__type__": "web", 
        "metadata": {
            "wms_enable_request": "*", 
            "wms_feature_info_mime_type": "text/html", 
            "__type__": "metadata"
        }
    }, 
    "projection": [
        "init=epsg:4326"
    ], 
    "layers": [
        {
            "__type__": "layer", 
            "processing": [
                "BANDS=1", 
                "CONTOUR_ITEM=elevation", 
                "CONTOUR_INTERVAL=20"
            ], 
            "extent": [
                -180, 
                -90, 
                180, 
                90
            ], 
            "name": "rgb", 
            "type": "RASTER", 
            "data": "../data/raster/bluemarble.tif", 
            "template": "raster.template.html"
        }
    ]
}

以上注意事项:

  • 在映射文件中可以有多个实例的对象将存储在列表中(顺序很重要)。

  • 大多数对象都有一组键/值对。但是, PROJECTION 它被视为一个列表(请参见http://www.mapserver.org/mapfile/projection.html)。

  • 一些键已被引用,例如 在 METADATA 对象中,例如 “wms_enable_request”是字符串而不是关键字。

  • 某些键在对象中重复。例如。

    PROCESSING "BANDS=1"
    PROCESSING "CONTOUR_ITEM=elevation"
    PROCESSING "CONTOUR_INTERVAL=20"
    

    这些被转化为列表:

    "processing": [
        "'BANDS=1'",
        "'CONTOUR_ITEM=elevation'",
        "'CONTOUR_INTERVAL=20'"
    ],
    

Python字典与json数据结构紧密相关,这意味着mapfile字典结构可以形式化为jsonschema。

2.1. 映射文件添加

为了确保在输入和输出映射文件时不会丢失任何信息,mappyfile使用隐藏属性来存储其他的数据。此数据不作为pprint的一部分输出。例如,隐藏属性用于存储同一类型的对象,例如图层、类、样式