目录

上一个主题

7.5. 绘制线

下一个主题

7.7. 绘制标注

关注公众号


常见问题

  1. Windows下的安装说明
  2. Jupyter免费在线实验环境
  3. 勘误与补充


from helper import info; info()
待更新

7.6. 绘制多边形

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

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

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

7.6.2. PolygonPatternSymbolizer的用法

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

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

image2

图 7.2 image2

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

# symbolizer = mapnik.PolygonPatternSymbolizer("image.png","png", 102, 80)
# import os

# import mapnik
# from helper import get_tmp_file


# def renderit(poly_sym=None, fig_index=0):
#     # mapnik.Color('y')
#     m = mapnik.Map(600, 300, "+proj=latlong +datum=WGS84")
#     # m.background = mapnik.Color('steelblue')
#     s = mapnik.Style()
#     r = mapnik.Rule()
#     # polygon_symbolizer = mapnik.PolygonSymbolizer(mapnik.Color('#f2eff9'))


#     # polygon_symbolizer = mapnik.PolygonSymbolizer(mapnik.Color('blue'))
#     r.symbols.append(poly_sym)
#     # line_symbolizer = mapnik.LineSymbolizer(mapnik.Color('rgb(50%,50%,50%)'),0.1)


#     line_symbolizer = mapnik.LineSymbolizer()
#     line_symbolizer.stroke = mapnik.Color('rgb(50%,50%,50%)')
#     line_symbolizer.stroke_linecap = mapnik.stroke_linecap.ROUND_CAP
#     line_symbolizer.stroke_width = 5.0

#     # line_symbolizer.stroke_width = 0.1
#     # line_symbolizer.stroke_dasharray( [5,10])

#     r.symbols.append(line_symbolizer)
#     s.rules.append(r)
#     m.append_style('My Style', s)
#     lyr = mapnik.Layer('world', "+proj=latlong +datum=WGS84")
#     lyr.datasource = mapnik.Shapefile(file='/gdata/world_borders.shp')
#     lyr.styles.append('My Style')
#     m.layers.append(lyr)

#     bbox = mapnik.Box2d(70, 20, 135, 57)

#     m.zoom_to_box(bbox)
#     # mapnik.render_to_file(m, 'xx_world_fk.png', 'png')
#     mapnik.render_to_file(m, 'xx_poly_{idx}.png'.format(idx = fig_index), 'png')


# polygon_symbolizer = mapnik.PolygonSymbolizer()
# polygon_symbolizer.fill = mapnik.Color('#f2eff9')

# fig_index = 0
# fig_index += 1
# renderit(polygon_symbolizer, fig_index)

# polygon_symbolizer.fill = mapnik.Color('#ff0000')
# fig_index += 1
# renderit(polygon_symbolizer, fig_index)


# # polygon2_symbolizer.fill = mapnik.PolygonPatternSymbolizer
# #      .symbol(os.path.join(os.path.split(os.path.abspath(__file__))[0], "image.png"), "png", 102, 80)
# sym_img = os.path.join(os.getcwd(), "weizhi3.png")


# polygon2_symbolizer = mapnik.PolygonPatternSymbolizer()
# polygon2_symbolizer.file = sym_img
# polygon2_symbolizer.fill = True
# polygon2_symbolizer.stroke_file = sym_img
# polygon2_symbolizer.stroke_fill = sym_img
# polygon2_symbolizer.fill = sym_img
# polygon2_symbolizer.file = sym_img
# print('='* 40)
# print(sym_img)
# print(dir(polygon2_symbolizer))
# print(dir(polygon2_symbolizer.symbol()))

# print('='* 40)
# fig_index += 1
# renderit(polygon2_symbolizer, fig_index)
import os
import mapnik
# from helper import get_tmp_file

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_poly.png', 'png')
---------------------------------------------------------------------------

RuntimeError                              Traceback (most recent call last)

<ipython-input-31-4b7c8c157eeb> in <module>()
      6 image = 'xx_world_style_from_xml.png'
      7 m = mapnik.Map(600, 300)
----> 8 mapnik.load_map(m, stylesheet)
      9 m.zoom_all()
     10 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