目录

上一个主题

7.6. 绘制多边形

下一个主题

7.8. 绘制点状要素

关注公众号


常见问题

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


from helper import info; info()
页面更新时间: 2020-02-21 17:53:21
操作系统/OS: Linux-4.19.0-8-amd64-x86_64-with-debian-10.3 ;Python: 3.7.3

7.7. 绘制标注

文本标注可以使用文字将地理空间数据显示在地图上, 与地图符号一样,对于任何一个地图文本标记都是很重要的部分。 在这个章节中,我们将会探究一下在Mapnik中的地图上绘制文本的TextSymbolizer。

7.7.1. 文本标记的基本用法

TextSymbolizer允许你在点、线、面要素上进行绘制标记:

img2

图 7.3 img2

TextSymbolizer的基本用法是很简单的。 例如,最后一个例子中的多边形是使用以下代码进行标记的:

symbolizers 将会显示要素的 label 字段的值, 使用给定字体、字体大小、颜色。 无论什么时候创建一个TextSymbolizer对象,都必须提供这四项参数。

仔细看一看这些参数,还有哪些能够控制的显示文本。

选择将要显示的文本通过将一个字段或者属性名称作为TextSymbolizer构造中的第一个参数。 该文本始终来源于基础数据,没有将label强行连接到规则的选项。

对于许多数据源,名称是用来区分大小写的, 所以为了确保键入的字段的名称和属性是完全正确的。 MAMEname 并不等同。

第二个参数是使用创建TextSymbolizer对象时进行定义的给定的字体和字体大小进行绘制的。 有两个选项来选择字体:可以使用Mapnik提供的内置字体中的一个,或者可以安装自己的自定义字体。

设置文字是透明或者不透明的程度,通过设置透明度属性,如下所示:

symbolizer.opacity = 0.5

透明度的范围是0.0(完全透明)到1.0(完全不透明)

注意:多边形的标记应沿着多边形的边界被绘制,并且标记与线条的方向一致。点要素没有被标记,因为在点要素中没有线条。 你通过设置symbolizer的 label_placement 属性来控制文本的位置,例如:

image0

当使用LINE_PLACEMENT放置标记时,在默认情况下,在线条的中央Mapnik 将会绘制一次标签。 在许多情况下,沿着线条的一段重复标记也是很有道理的。 要做到这一点,你就需要设置symbolizerlabel_spacing属性表,如下 所示:

symbolizer.label_spacing = 30

设置这个属性会导致线或多边形的边界被重复标记。 该值是重复标记之间的间隔量,以像元为单位。使用以上的label spacing,我们的线条和多边形要素将用以下的方式显示:

下面是几种被用来微调显示重复标记的的属性:

  • symbolizer.force_odd_labels = True:TextSymbolizer绘制奇数标记,这样可以使标记在某些情况下看起来更好。

  • symbolizer.max_char_angle_delta = 45:设置变化的最大夹角值(以度为单位)即从一个字符到下一个。使用这种方法可以防止Mapnik尖角附近被标记,例如:

  • symbolizer.min_distance = 40:重复的标记之间的最小距离,以像元为单位。

  • symbolizer.label_position_tolerance = 20:这设置的是能够沿着线条移动的最大距离来避开其他的标记和尖角的一个标记。这个值是以像元为单位的,默认为``in_distance/2``。

7.7.2. 使用文本标记的“晕”

TextSymbolizer通常会直接在地图上绘制文本。 当文本被放置在地图上的浅色区域,但是如果地图被覆盖的区域是深色或者遥感影像等背景比较乱的情况, 文本将很难读出甚至显示。

当然,可以选择一个浅色的文本的颜色,但是你需要提前了解背景可能是什么样子的, 一个比较好的解决方式就是在文本周围绘制一个“晕”,如下边的图像所示:

image1

halo_fillhalo_fill属性用来定义“晕”的颜色和大小,例如:

半径指定以像元为单位,一般情况下,值为1或2,则能够确保文本在深色的背景之下是可读的。

7.7.3. 调整文本的位置

在默认情况下,Mapnik计算需要在点上显示的文本,然后将该文本显示在点的中间。

Mapnik提供了两种调整的方式:通过改变vertical alignment(垂直位移),通过指定一个text displacement(文本位移)。 通过改变TextSymbolizer的vertical_alignment属性可以控制垂直位移。有三种你可以使用的垂直位移值:

mapnik.vertical_alignment.MIDDLE是默认的,将标记垂直的放在点的中心。 如果你将垂直位移改变成mapnik.vertical_alignment.TOP,标记将会被绘制到点的上部。反过来,如果你将垂直改变成mapnik.vertical_alignment.BOTTOM,标记将被绘制到点的下部。

更细致的调整文本位置的其他选项就是使用displacement()方法, 来用给定的像元数目显示文本。例如:

偏移的量从左上角算起。这会导致标记向右边偏向5个单位,从他的正常位置下移10个单位。

注意, 改变标注的垂直位移同样也会改变标记的默认的vertical_alignment值。 这会导致标记用你不想要的方式移动,因为标记的垂直走向被改变了 作为一个设置垂直位移的单方面影响因素。 为了避免这种情况的发生,你同时也应该明确的设置一下vertical_alignment属性, 无论你什么时候改变垂直位移。

还有一些属性可以控制文本显示的细节,如文本的宽度(自动换行)、 字符间距等。

使用wrap_width属性来强制标记在跨越多列时换行,指定的值就是文本每个行的最大值,以像元为单位。 symbolizer.character_spacing = 3,在文本中你可以在字符之间添加额外的空隙。 你同样可以改变不同行之间的距离通过使用line_spacing属性。 字符间距和行间距的值都是以像元为单位的。 有些时候你想改变文本显示的状况。你可以做这件事情通过设置text_convert属性。

7.7.4. 文本的高级设置

将文本放置在道路上时,Mapnik 有很多专门的操作。 你会发现,在急转的角落里,文字会弯曲,这样会导致街名难看的扭结。 幸好,有一个max_char_angle_delta属性,可以添加TextSymbolizer, 以使得标签远离急转弯,20度看起来很不错。 虽然仍然可以得到弯曲的道路标识,但是没有不和谐的角落。

如果发现数据集将较长的路段切割成较短的几部分, 会发现Mapnik不能使标签与之适应, 即使适应也会产生每个路段的不必要的重复。 我们的道路数据来源于商业, 这些道路数据已经被优化以便于灵活地制图, 许多较长的道路分支依据车道数量极其其他特征被分成许多小段。 我们对展现如此高层次的细节没有兴趣, 所以他们更愿意提供这样一个版本的数据, 同名且连接在一起道路融合成更长的线路。

路线和高速公路标签的常见的形式是“盾牌”, 由Mapnik作为ShieldSymbolizer应用。 盾牌是文字和图形的组合,意在表明短的道路号码, 与名称不同(如“加州13”与“沃伦高速公路”)。 像上面的顺序技巧,盾牌需要一些策略来得到正确的位置。 你可以使用常规的SQL LENGTH(名称)功能结合Mapnik样式的过滤器,来创建简单的条件: 例如,使用宽宽的盾牌图形标注长长的路线编号, 一个窄窄的盾牌图形标注较短的路线编号。

7.7.5. 字体

Mapnik使用自己的字体配置方式。 在Debian中,这个路径是/usr/share/fonts/truetype/ttf-dejavu/, 可以把要用到字体放到这个文件夹下面,同时还需要注意字体文件的权限。

为了寻找出哪个字体是可用的,运行下面的程序:

import mapnik
for font in mapnik.FontEngine.face_names():
    print (font)
?????? Regular
Adobe Heiti Std R
Adobe Song Std L
Arial Bold
Arial Bold Italic
Arial Italic
Arial Narrow
Arial Narrow Bold
Arial Narrow Bold Italic
Arial Narrow Italic
Arial Regular
Arial Unicode MS Regular
Arial monospaced for SAP Regular
Bitstream Charter Bold
Bitstream Charter Bold Italic
Bitstream Charter Italic
Bitstream Charter Regular
Bitstream Vera Sans Bold
Bitstream Vera Sans Bold Oblique
Bitstream Vera Sans Mono Bold
Bitstream Vera Sans Mono Bold Oblique
Bitstream Vera Sans Mono Oblique
Bitstream Vera Sans Mono Roman
Bitstream Vera Sans Oblique
Bitstream Vera Sans Roman
Bitstream Vera Serif Bold
Bitstream Vera Serif Roman
Century Schoolbook L Bold
Century Schoolbook L Bold Italic
Century Schoolbook L Italic
Century Schoolbook L Roman
Courier Bold
Courier Bold Italic
Courier Italic
Courier New Bold
Courier New Bold Italic
Courier New Italic
Courier New Regular
Courier Regular
DFPhonetic Plain
DejaVu Math TeX Gyre Regular
DejaVu Sans Bold
DejaVu Sans Bold Oblique
DejaVu Sans Book
DejaVu Sans Condensed
DejaVu Sans Condensed Bold
DejaVu Sans Condensed Bold Oblique
DejaVu Sans Condensed Oblique
DejaVu Sans ExtraLight
DejaVu Sans Mono Bold
DejaVu Sans Mono Bold Oblique
DejaVu Sans Mono Book
DejaVu Sans Mono Oblique
DejaVu Sans Oblique
DejaVu Serif Bold
DejaVu Serif Bold Italic
DejaVu Serif Book
DejaVu Serif Condensed
DejaVu Serif Condensed Bold
DejaVu Serif Condensed Bold Italic
DejaVu Serif Condensed Italic
DejaVu Serif Italic
Dingbats Regular
Droid Sans Fallback Regular
ESRI Default Marker Regular
FZLanTingHei-DB-GBK Regular
FZLanTingHei-EL-GBK Regular
FZLanTingHei-M-GBK Regular
FZLanTingHeiS-DB1-GB Regular
FZLanTingHeiS-DB1-GBK Regular
FZLanTingHeiS-UL-GB Regular
FangSong_GB2312 Regular
FontAwesome Regular
GLYPHICONS Halflings Regular
HMPhone BDC Plain
HMPhonetic Plain
KaiTi Regular
Kingsoft Phonetic Plain Plain
LMMono10 Italic
LMMono10 Regular
LMMonoCaps10 Oblique
LMMonoCaps10 Regular
LMMonoLt10 Bold
LMMonoLt10 BoldOblique
LMMonoLt10 Oblique
LMMonoLt10 Regular
LMMonoLtCond10 Oblique
LMMonoLtCond10 Regular
LMMonoProp10 Oblique
LMMonoProp10 Regular
LMMonoPropLt10 Bold
LMMonoPropLt10 BoldOblique
LMMonoPropLt10 Oblique
LMMonoPropLt10 Regular
LMMonoSlant10 Regular
LMRoman10 Bold
LMRoman10 BoldItalic
LMRoman10 Italic
LMRoman10 Regular
LMRomanCaps10 Oblique
LMRomanCaps10 Regular
LMRomanDemi10 Oblique
LMRomanDemi10 Regular
LMRomanDunh10 Oblique
LMRomanDunh10 Regular
LMRomanSlant10 Bold
LMRomanSlant10 Regular
LMRomanUnsl10 Regular
LMSans10 Bold
LMSans10 BoldOblique
LMSans10 Oblique
LMSans10 Regular
LMSansDemiCond10 Oblique
LMSansDemiCond10 Regular
LMSansQuot8 Bold
LMSansQuot8 BoldOblique
LMSansQuot8 Oblique
LMSansQuot8 Regular
Lato Black
Lato Black Italic
Lato Bold
Lato Bold Italic
Lato Hairline
Lato Hairline Italic
Lato Heavy
Lato Heavy Italic
Lato Italic
Lato Light
Lato Light Italic
Lato Medium
Lato Medium Italic
Lato Regular
Lato Semibold
Lato Semibold Italic
Lato Thin
Lato Thin Italic
LiSu Regular
Liberation Mono Bold
Liberation Mono Bold Italic
Liberation Mono Italic
Liberation Mono Regular
Liberation Sans Bold
Liberation Sans Bold Italic
Liberation Sans Italic
Liberation Sans Narrow Bold
Liberation Sans Narrow Bold Italic
Liberation Sans Narrow Italic
Liberation Sans Narrow Regular
Liberation Sans Regular
Liberation Serif Bold
Liberation Serif Bold Italic
Liberation Serif Italic
Liberation Serif Regular
Lingoes Unicode Regular
Lucida Sans Typewriter Bold
Lucida Sans Typewriter Bold Oblique
Lucida Sans Typewriter Oblique
Lucida Sans Typewriter Regular
Lucida Sans Unicode Regular
Microsoft YaHei Bold
Microsoft YaHei Mono Regular
Microsoft YaHei Regular
Milsoft Phonetic not included.
Monaco Regular
NSimSun Regular
Nimbus Mono L Bold
Nimbus Mono L Bold Oblique
Nimbus Mono L Regular
Nimbus Mono L Regular Oblique
Nimbus Roman No9 L Medium
Nimbus Roman No9 L Medium Italic
Nimbus Roman No9 L Regular
Nimbus Roman No9 L Regular Italic
Nimbus Sans L Bold
Nimbus Sans L Bold Condensed
Nimbus Sans L Bold Condensed Italic
Nimbus Sans L Bold Italic
Nimbus Sans L Regular
Nimbus Sans L Regular Condensed
Nimbus Sans L Regular Condensed Italic
Nimbus Sans L Regular Italic
Noto Mono Regular
Pragmata Medium
STCaiyun Regular
STFangsong Regular
STHupo Regular
STKaiti Regular
STLiti Regular
STSong Regular
STXihei Regular
STXingkai Regular
STXinwei Regular
STZhongsong Regular
SimHei Regular
SimSun Regular
SimSun-18030 regular
Standard Symbols L Regular
Tahoma Bold
Tahoma Regular
TeXGyreAdventor Bold
TeXGyreAdventor BoldItalic
TeXGyreAdventor Italic
TeXGyreAdventor Regular
TeXGyreBonum Bold
TeXGyreBonum BoldItalic
TeXGyreBonum Italic
TeXGyreBonum Regular
TeXGyreChorus MediumItalic
TeXGyreCursor Bold
TeXGyreCursor BoldItalic
TeXGyreCursor Italic
TeXGyreCursor Regular
TeXGyreHeros Bold
TeXGyreHeros BoldItalic
TeXGyreHeros Italic
TeXGyreHeros Regular
TeXGyreHerosCondensed Bold
TeXGyreHerosCondensed BoldItalic
TeXGyreHerosCondensed Italic
TeXGyreHerosCondensed Regular
TeXGyrePagella Bold
TeXGyrePagella BoldItalic
TeXGyrePagella Italic
TeXGyrePagella Regular
TeXGyreSchola Bold
TeXGyreSchola BoldItalic
TeXGyreSchola Italic
TeXGyreSchola Regular
TeXGyreTermes Bold
TeXGyreTermes BoldItalic
TeXGyreTermes Italic
TeXGyreTermes Regular
Times New Roman Bold
Times New Roman Bold Italic
Times New Roman Italic
Times New Roman Regular
URW Bookman L Demi Bold
URW Bookman L Demi Bold Italic
URW Bookman L Light
URW Bookman L Light Italic
URW Chancery L Medium Italic
URW Gothic L Book
URW Gothic L Book Oblique
URW Gothic L Demi
URW Gothic L Demi Oblique
URW Palladio L Bold
URW Palladio L Bold Italic
URW Palladio L Italic
URW Palladio L Roman
Utopia Bold
Utopia Bold Italic
Utopia Italic
Utopia Regular
Verdana Bold Italic
Verdana Italic
Verdana Regular
YaHei Consolas Hybrid YaHei Consolas Hybrid Regular
YaHei_Monaco Regular
YouYuan Regular
cmex10 LyX
cmmi10 LyX
cmr10 LyX
cmsy10 LyX
esint10 LyX
eufm10 LyX
iYaHei KR
msam10 LyX
msbm10 LyX
rsfs10 LyX
stmary10 LyX
wasy10 LyX

7.7.6. 中文标注的问题

Mapnik支持中文标注,但是在使用的时候要注意字符编码。 但是要注意的是,Shape文件默认不使用UTF-8编码,可以使用ogr2ogr命令来转换成SQLite格式。

还需要要注意,在点状文件中,已经设置了标注,不要再设置符号, 因为可能会被挡住。