利用地图出版设计的图辑工具自动创造地图

如果你的所属单位有出版纸本或线上地图的话,你或许会常常需要使用同一个范本制作许多地图,这些地图通常个别代表不同的行政区或是不同的特定区域。 如果你需要时常更新这些地图的话,手动弄起来会花费许多时间,甚至可能会成为超级麻烦事。 不过,QGIS 有个称为``Atlas``的工具,可以让你设计地图范本并且使用它来制作出版许多不同地区的地图。 如果你对「地图出版设计(Print Composer)」不熟悉,请先阅读 制作地图 中的教学。

内容说明

本教学将示范如何为夏威夷州的每个县制作湿地地图。

你还会学到这些

  • 使用``Inverted Polygons`` 样式设定多边形外侧的区域样式
  • 在``Rule Based`` 样式设定中使用表达式,让舆图工具只显示现在选择的图征
  • 在地图出版设计中使用表达式建立动态标记

取得资料

本章中我们使用的是 State of Hawaii - Office of Planning 提供的 GIS Data Layers

下载隶属于生物与生态类别的 Wetlands 图层。

下载隶属于文化与人口统计类别的 Census County Boundaries 2010 图层。

为了方便起见,你也可以直接用下面的连结下载这两份资料集:

HI_Wetlands.shp.zip

county10.shp.zip

资料来源 [HAWAII]

操作流程

  1. 打开 QGIS,选择 Layer ‣ Add Layer ‣ Add Vector Layer
../_images/110.png
  1. 选择 HI_Wetlands.shp.zip 并按下 Open
../_images/21.png
  1. 选择 HI_Wetlands_Poly 图层并点选 OK
../_images/31.png

4. 你会看到很多多边形出现,代表夏威夷州全部的溼地范围。由于我们要分别制作夏威夷每个县的溼地地图,因此还需要一个郡县边界的图层才行。 选择 Layer ‣ Add Layer ‣ Add Vector Layer 然后点选 county10.shp.zip 按下 Open

../_images/41.png
  1. 选择 Project ‣ New Print Composer
../_images/51.png
  1. 设计标题保持空白,按下 OK
../_images/61.png
  1. 选择 Layout ‣ Add Map
../_images/71.png
  1. 在地图版面上拖曳一块你想插入地图的区域。
../_images/81.png

9. 切换到 Item Properties 分页然后向下卷动,勾选 Controlled by atlas 的方框,此选项用来告诉电脑本地图的范围是由 Atlas 具所控制。 (译按:如果这时方框是无法选取的状态,请先完成后续几个步骤,再回来勾选。)

../_images/91.png

10. 切换到 Atlas generation 分页,勾选 Generate an atlas 方框, Coverage layer 选择``county10`` 如此一来电脑就会为每个在``county10`` 如此一来电脑就会为每个在 Hidden coverage layer, 这样一来「覆蓋图层」内的图征就不会显示在地图上。

../_images/101.png
  1. 虽然已经完成了舆图设定,但这时地图影像还不会有任何改变。选择 Atlas ‣ Preview Atlas
../_images/111.png
  1. 按下去之后地图会刷新成为其中一张地图看起来的样子,注意在右侧最底部有个讯息,告诉你现在所使用的多边形图征编号。
../_images/121.png
  1. 你也可以预览由其他多边形建立的地图,请选择:menuselection:Atlas –> Next Feature
../_images/131.png
  1. 如此一来地图就会刷新为下一个图征覆蓋的范围。
../_images/141.png
  1. 来加点标记吧!选择:menuselection:Layout –> Add Label
../_images/151.png
  1. 在标记的:guilabel:Item properties 分页中,选择:guilabel:Insert an expression... 钮。
../_images/161.png
  1. 在此功能中,标记文字可以使用覆蓋图层的属性。我们要使用``concat`` 函数来把两段字串合并,而要合并的字串分别为``County of``和``county10``图层中的``NAME10``属性值。加入以下的表达式后,按下:guilabel:OK
concat('County of ', "NAME10")
  1. 调整成你喜欢的字体大小。
../_images/181.png
  1. 加入另一个标记,然后在:guilabel:Main properties 下输入``Wetlands Map`` 由于没有使用表达式,此文字在所有的地图中都会相同。
../_images/191.png

20. 选择:menuselection:Atlas –> Last Feature 然后确认地图标记有照我们所想的运作。 目前湿地地图上的多边形也延伸到了海中,看起来不怎么美观,所以接着我们就要来改变样式,隐藏郡县边界外侧的多边形图征。

../_images/20.png
  1. 切换到 QGIS 主视窗,在``county10`` 图层上按右键选择:guilabel:Properties
../_images/211.png

22. 在:guilabel:Style 分页中,选择 Inverted polygons`的呈现方法, 这个特殊的样式设定的是多边形的`outside`区域。选择白色做为填充色彩,然后按下:guilabel:`OK

../_images/22.png

23. 回到地图设计的视窗,如果我们要让反转多边形的设定出现的话, 就得先取消勾选在 :guilabel:`Atlas generation`分页下的 :guilabel:`Hidden coverage layer`才行。 套用新样式后的地图由于多边形外围区域已经隐藏起来,看起来干净许多。

../_images/23.png

24. 不过目前还有一个问题,你可以看到在位在覆蓋图层内部,但是属于其他图征的区域仍然可以看见, 这是因为舆图工具并不会自动把其他图征也隐藏起来。 此设计在某些状况下很有用,但却不是我们想要的、每个地图只呈现单一个多边形图征内的资讯。 为了修正此问题,我们要回到 QGIS 主视窗,然后在``county10`` 图层上按右键,选择 Properties

../_images/24.png

25. 在 Style 分页中,有个 Sub renderer`下拉选单, 选择 :guilabel:`Rule-based 在下方 Rule 的栏位上点两下。

../_images/25.png
  1. 点选:guilabel:Filter`右侧的:guilabel:...` 钮。
../_images/26.png

27. I在 Expression string builder , 中,展开 Atlas`的群组(译按:或是 Variables 的群组), 然后找到 ``$atlasfeatureid`atlas_featureid ,此函数会传回目前舆图工具选择的图征。 我们要做的是建立一个表达式,让它只选择舆图工具选择的图征,因此请输入以下表达式:

$id = $atlasfeatureid
../_images/27.png
  1. 回到地图设计的视窗,在地图项目的 Item properties 分页中点选 Update preview 后,就可以看到改变,现在每张地图都只会显示位于本郡县边界内的资料了。
../_images/28.png

29. 我们再来加入另一个新的标记,用来标示现在的日期。选择 Layout ‣ Add Label 然后选择地图上的任一区域,完成后按下 Insert an expression 钮。

../_images/29.png

30. 展开 Date and Time 的群组,找到``$now``这个函数,它用来表示现在的系统时间。 另外我们要使用 todate() 这个函数,用来把 now 的函数值转换成日期字串。请输入以下表示式:

concat('Created on: ', todate($now))
../_images/30.png

31. 再加入另外一个标记,引用资料来源。你也可以顺道加入其他的地图元素, 例如指北针等等,请参考:doc:making_a_map 一章的说明。

../_images/311.png
  1. 当你完成地图版面后,选择:menuselection:Atlas –> Export Atlas as Images
../_images/32.png
  1. 选择电脑中的某资料夹,然后按下:guilabel:`Choose`钮。
../_images/33.png
  1. 舆图工具会自动地使用我们刚刚建立的范本,为覆蓋图层中的每个图征创造各自的地图。处理完成后,在资料夹中就能找到这些地图。
../_images/34.png
  1. 这里放上完成版地图以供参考。
../_images/35_1.jpg ../_images/35_2.jpg ../_images/35_3.jpg ../_images/35_4.jpg ../_images/35_5.jpg