目录

上一个主题

8.5. 绘制线

下一个主题

8.7. 绘制标注

>>> from env_helper import info; info()
页面更新时间: 2022-12-28 08:26:20
运行环境:
    Linux发行版本: Debian GNU/Linux 11 (bullseye)
    操作系统内核: Linux-5.10.0-20-amd64-x86_64-with-glibc2.31
    Python版本: 3.9.2

8.6. 绘制多边形

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

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

8.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,则意味着将不适用于任何的伽玛校正。

8.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')
---------------------------------------------------------------------------

RuntimeError                              Traceback (most recent call last)

<ipython-input-6-06630233498a> in <module>
      5 image = 'xx_world_style_from_xml.png'
      6 m = mapnik.Map(600, 300)
----> 7 mapnik.load_map(m, stylesheet)
      8 m.zoom_all()
      9 m.background = mapnik.Color('steelblue')


RuntimeError: file could not be found: '/gdata/sy1.png' in style 'My Style' in PolygonPatternSymbolizer at line 6 of '/gdata/world_map_poly.xml'

image0