>>> from env_helper import info; info()
页面更新时间: 2023-07-08 22:51:53
运行环境:
    Linux发行版本: Debian GNU/Linux 12 (bookworm)
    操作系统内核: Linux-6.1.0-10-amd64-x86_64-with-glibc2.36
    Python版本: 3.11.2

9.6. 绘制多边形

绘制多边形有两个symbolizer绘制线条,也有两个symbolizers绘制多边形的内部:PolygonSymbolizerPolygonPatternSymbolizer

现在让我们来了解一下这两个symbolizers:

9.6.1. PolygonSymbolizer的基本属性设置

用一种单一的颜色填充一个 PolygonSymbolizer 多边形的内部。

常用属性

你可以用下面的方式创建一个 PolygonSymbolizer :

>>> import mapnik
>>> symbolizer = mapnik.PolygonSymbolizer()

让我们来看一下如何控制绘制多边形的各种选项。

在默认情况下,一个 PolygonSymbolizer 可以把多边形的内部绘制为灰色。 要想改变填充多边形的内部颜色,需要将 PolygonSymbolizer’s fill属性设置为想要的 Mapnik 颜色对象:

>>> symbolizer.fill = mapnik.Color("red")

在默认情况下,多边形将是完全不透明的。 你可以通过设置PolygonSymbolizer的 opacity 属性表来改变这种状况: 透明度的范围是 0.0 (完全透明)到 1.0 (完全透明)。 在前面的图中,左边图形的透明度为0.5。

>>> symbolizer.fill_opacity = 0.5

伽玛校正是一个不隐晦的概念,而且有时也是非常有用的。 如果你绘制两个恰好是以相同的颜色相交的多边形,你能在两个多边形之间看到一条线,正如下图所示: 这是因为Mapnik的多边形边缘抗重叠的方式。 如果你想要这些在相邻多边形之间的线消失,你可以添加一个伽玛校正系数:

>>> symbolizer.gamma = 0.63

这样会导致两个多边形以同一个方式出现。

使用0.5到0.7的伽玛值大致会移除两个相邻多边形的重叠线。 默认的值为1.0,则意味着将不适用于任何的伽玛校正。

9.6.2. PolygonPatternSymbolizer的用法

使用 PolygonPatternSymbolizer 提供的图像文件填充多边形的内部:

图像将被平铺,也就是说反复绘制以填补整个多边形的内部。

因为图块的右侧将会出现与相邻的图块左侧相接,图块的底部将会直接出现在下面的图块上面(反之亦然), 当以这种方式绘制时,你需要选择一个看起来比较合适的图像。 使用 PolygonPatternSymbolizer 是比较简单的,就如同 LinePatternSymbolizer 一样。 你创建一个新的实例,然后给他一个图像文件的名称,文件的格式(PNG 或者 TIFF)和图像的宽度和高度:

>>> import os
>>> import mapnik
>>>
>>> stylesheet = '/gdata/world_map_poly.xml'
>>> # image = 'xx_world_style_from_xml.png'
>>> m = mapnik.Map(600, 300)
>>> mapnik.load_map(m, stylesheet)
>>> m.zoom_all()
>>> m.background = mapnik.Color('steelblue')
>>>
>>> # bbox = mapnik.Box2d( 118, 36.6, 124.6, 40.7)
>>> bbox = mapnik.Box2d(70, 20, 135, 57)
>>> m.zoom_to_box(bbox)
>>>
>>> mapnik.render_to_file(m,'xx_map_poly2.png', 'png')
Mapnik LOG> 2024-01-19 22:51:20: Unable to process some data while parsing '/gdata/world_map_poly.xml':
* attribute 'height' with value '6' at line 6
* attribute 'type' with value 'png' at line 6
* attribute 'width' with value '6' at line 6
_images/xx_map_poly2.png
>>> !cat /gdata/world_map_poly.xml
<Map background-color="#efefef" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
    <Style name="My Style">
        <Rule>
            <PolygonSymbolizer fill="#ffffff"/>
            <LineSymbolizer stroke="rgb(50%,50%,50%)" stroke-width="1" stroke-dasharray="8,20"/>
            <PolygonPatternSymbolizer width="6" height="6" type="png" file="tri.png" />
        </Rule>
    </Style>
    <Layer name="world" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
        <StyleName>My Style</StyleName>
        <Datasource>
            <Parameter name="type">shape</Parameter>
        <Parameter name="file">/gdata/GSHHS_c.shp</Parameter>
        </Datasource>
    </Layer>
</Map>