把地图数位化

数位化操作是 GIS 专家最常进行的工作之一。把影像资料数位化、转成向量图层常常会花费许多的 GIS 操作时间。不过在 QGIS 中,有着强大的数位化萤幕编修功能,我们将会本教学中做个简介。

内容说明

我们要把一张地形图的图档转化成数个向量图层,内容包括地图中一个公园附近的一些地理标记。

你还会学到这些

  • 为大尺寸影像建立快取金字塔,增快浏览地图的速度
  • Spatialite 资料库的操作

取得资料

我们要使用 Land Information New Zealand (LINZ) 提供的 1:50,000 地形图, 包括纽西兰本土与查塔姆群岛(Chatham Islands)。

Christchurch Topo50 map download page 下载 GeoTIFF Image file

为了方便起见,你也可以直接用下面的连结下载(裁切过的版本):

BX24_GeoTifv1-02-clip.tif

资料来源 [LINZ]

操作流程

  1. 选择:menuselection:Layer –> Add Raster Layer。 选择刚才下载的 BX24_GeoTifv1-02.tif ,然后按 Open
../_images/130.png

2. 这是张相当大的影像,当我们要拖曳或是缩放地图时,都要花上一点时间让程序调整影像的解析尺寸。 QGIS 提供了简单的解决方法来增进这些动作的速度,称之为 Image Pyramids . 这种方法其实就是预先产生不同解析度的相同影像,在地图操作时,可以直接使用而不用再从全尺寸的影像做处理,加快浏览速度 。请在 BX24_GeoTifv1-02 图层上按右键选择 Properties

../_images/220.png

3. 切换到 Pyramids 分页,在 Resolutions 中按住 Ctrl 钮,把所有解析度都选取 其他选项使用预设值, 然后按 Build pyramids . 程序执行完毕后,按下 OK

../_images/313.png
  1. 回到 QGIS 主视窗, 使用 Zoom 钮搜寻基督城的 Hagley Park 这就是等一下要数位化的区域。
../_images/49.png

5. B在开始之前,先来调整预设的 Digitizing Options. 选择 Settings ‣ Options...

../_images/59.png

6. 在 Options`页面中切换到 :guilabel:`Digitizing 分页, 预设接合模式 选择:guilabel:Default snap mode 转折 To vertex and segment。 这个选项可以使相近的转折点与线段黏在一起。 笔者个人也偏好把 Default snapping toleranceSearch radius for vertex edits 设成以像素为单位, 而非以地图单位为单位,这样在不同的缩放尺度下,自动接合的距离会保持一样。 接着你可以依照你萤幕的解析度选择适合的值,最后按下 OK

../_images/68.png

7. 现在可以开始数位化了! 我们先来做个道路的图层,然后把公园附近的道路数位化到此图层上。 选择 Layer ‣ New ‣ New Spatialite Layer...New Shapefile Layer... 看你喜欢哪个都可以。 Spatialite 是和 ESRI 的地理资料库(包含 Shapefile)格式相似的开放资料库, Spatialite 资料库 特点是可以在一个档案内塞进不同种类的空间资料 (点、线、多边形) 与其他种类的图层,所以在复制或移动档案时, 不用像 shapefiles 那样每次都得移动一堆档案。本教学中,我们会建立数个多边形和一个线图层, 所以 Spatialite 会比较适合我们。你当然也可以在读取 Spatialite 档案后,另存成 shapefile 或其他类型的档案格式。

../_images/78.png

8. 在 New Spatialite Layer 视窗中, 按下 ... 钮,把图层存成新的名为 nztopo.sqlite 的资料库。 在 Layer name 中输入 Roads``选择 ``Line 在:guilabel:Type 中. 我们的地形底图使用的 CRS 是 EPSG:2193 - NZGD 2000 , 所以这边就选个跟底图一样的 CRS 即可。 请勾选 Create an autoincrementing primary key 。 这个功能会在属性表格中新增一个叫做 pkuid 的栏位,程序会自动为每个图征指定独特的数值到此栏位中。 因为这是个道路图层,我们应还需要 2 个基本属性:道路名和道路种类。 所以请在 New attribute`栏位中加入``Name` Name 然后按下 加入:guilabel:Add to attribute list.

../_images/88.png
  1. 以同样的方法建立新属性 Class 类别选 Text data。建立好后按下 OK
../_images/98.png
  1. 图层载入后,按一下 Toggle Editing 状态 以进入图层编辑模式。
../_images/108.png
  1. 按下 Add feature 按钮,然后在地图上按滑鼠,就可以加入线段端点。沿着道路加入新的端点,直到全部的路都绕过后,按下右键结束图征的编辑。

注解

滑动滑鼠的滚轮键可以用来放大或缩小地图,按住滚轮键则可以拖曳地图。

../_images/1112.png

12. 按下右键之后,会有一个视窗跳出,叫 Attributes. 你可以在其中为刚刚创造的图征输入属性。 因为 pkuid 已经被自动指定了,所以只有它是不能手动设定的。输入在地图中的道路名字,以及道路的种类,当然你也可以都不输入就是了。完成后,按下:guilabel:OK

../_images/1210.png
  1. 线图层的预设样式是非常细的线,我们要把它改粗一点,以方便在地图上浏览。在``Roads`` 图层上按右键选择:guilabel:Properties
../_images/138.png
  1. Layer Properties`视窗中切换到 :guilabel:`Style`分页,再从样式库中选择一个较粗的样式,像是 :guilabel:`Primary`最后按下:guilabel:`OK
../_images/148.png
  1. 现在就很容易在地图上找到此图征了。按下:guilabel:Save Layer Edits ,就可以把刚才的更动写到档案内。
../_images/158.png
  1. 在把其他道路数位化之前,有些设定还需要更新,才能保证接下来创造图层时不会发生错误。选择:menuselection:Settings –> Snapping Options...
../_images/167.png

17. 在 Snapping Options 视窗中, 勾选:guilabel:Enable topological editing. 这个选项可以确保图征共同的边界可以在多边形图层中正确的调整。 再来,勾选:guilabel:`Enable snapping on intersection`此选项可以自动连接图征的截切点,例如底图的道路转角。

../_images/176.png

18. 接下来就继续使用:guilabel:Add feature 钮,加入其他环绕公园的道路吧。 记得每一次加入新图征后,都要按下 Save Edits`才会储存起来。 有一个称为 **Node Tool** 的功能也非常的方便,我们就来试试看。请按下 :guilabel:`Node Tool 钮。

../_images/187.png

19. 节点工具启用后,点选任一个图征,节点就会显现出来。点选任一节点后,它的颜色会改变,以表示这个节点已经被选取了, 这时就可以使用滑鼠拖曳此节点。此操作对修改已有的图层非常的方便,如果我们要删掉选取的节点,只要按下:kbd:Delete 键即可。 (Mac 上是:kbd:Option+Delete 键)

../_images/195.png
  1. 所有的道路都数位化了之后,按一下 Toggle Editing 关闭图层编辑模式。
../_images/203.png

21.接下来我们要制作的是公园边界的多边形图层。选择 Layer ‣ New ‣ New Spatialite Layer.... 资料库要从下拉选单中选择刚才的``nztopo.sqlite`` , 新的图层命名为``Parks``. 选择 ``Polygon``的 Type. 另外,新增一个称为``Name``的属性,最后按下:guilabel:OK

../_images/2110.png

22. 按下 Add feature 钮,然后在地图上点出多边形的顶点。这些顶点圈住的多边形,就是以数位化方式呈现的公园边界。 在用右键完成多边形之前,请再次确认你有开启自动接合选项,这样公园多边形和道路的线条中间就不会有任何空隙。

../_images/223.png
  1. 在跳出的 :guilabel:`Attributes`视窗中,输入公园名字。
../_images/233.png

24. 我们还可以为多边形图层选择一个很有用的设定,称为 Avoid intersections of new polygons. 再次进入 Settings ‣ Snapping Options.... 然后把 Parks 图层后方的 Avoid Int 栏勾选起来,最后按下 OK

../_images/243.png

25.接着使用 加入 Add feature 再加入另一个多边形。 当 Avoid intersections of new polygons , 功能启用时,我们就可以快速地创造另一个图征,不用担心它跟先前的图征的接合点是否在正确的位置上。

../_images/252.png

26. 按下右键完成此多边形,然后输入属性的内容。新的多边形会与邻接的多边形完美的接在一起! 这功能对比较复杂的边界非常有用,我们在设定边界时可以不需要非常的精确,就可以制作已校正的多边形。 最后,再次按下 Toggle Editing ,结束``Parks`` 图层的编辑。

../_images/262.png

27. 是时候来数位化地图上的建筑了。这次我们选择 Layer ‣ New ‣ New Spatialite Layer, 建立一个新的多边形图层,称为 Buildings

../_images/272.png

28. Once the Buildings 图层加入后,关掉 ParksRoads``图层, 让底下的地图显现出来,然后选择``Buildings 图层,再按下 Toggle Editing

../_images/262.png

29. 建筑的数位化通常是件繁琐的任务,而且有个困难点是要手动设定垂直的节点以形成长方形的多边形。 这里我们要使用一个称为 Rectangles Ovals Digitizing 的附加元件来帮助我们数位化。 关于如何搜寻和安装附加元件,请参考:doc:using_plugins。 当**Rectangles Ovals Digitizing** 安装完成后,会看到一个新的工具列出现在画布上方区块。

../_images/291.png
  1. 放大到有建筑的地方,然后按下:guilabel:Rectangle by Extent 钮,然后用滑鼠按下并拖曳出长方形。用类似的方法完成其余的建筑多边形。
../_images/301.png

31. 你会看到有些建筑不是垂直的,这些形状大概是倾斜成某种角度的多边形。按下 Rectangle from center

../_images/314.png
  1. 在建筑物的中心按一下,用滑鼠拖曳出一个垂直的长方形。
../_images/321.png

33.接下来我们要旋转此长方形,让它符合地图上的形状。旋转工具是放在 Advanced Digitizing 工具列中,在工具列上空白的地方按下右键,然后勾选 Advanced Digitizing ,就可以让它呈现在工具列上。

../_images/331.png
  1. 按下 Rotate Feature(s) 钮。
../_images/341.png

35. 使用 Select Single feature 工具选择你要旋转的图征。 在 Rotate Feature(s) 工具启用的状况下,被选取的图征中心会出现一个准心,点选此准心然后移动滑鼠,就会看到旋转图征的预览结果。 在适当的角度按下滑鼠按钮,让多边形对齐房屋的底座边界。

../_images/351.png
  1. 储存编辑的结果,全部完成后再次按下 Toggle Editing 现在你可以拖曳调整图层的显示顺序。
../_images/361.png
  1. 数位化的工作到此告一段落,接下来你可以在图层属性中调整标签与样式,利用你刚刚创造的资料制作一幅好看的地图。
../_images/371.png