近邻分析

GIS 非常适合用于分析图征的空间关系。这些分析的其中之一是为特定的图征寻找最接近的另一个图征, 这时 QGIS 的距离矩阵 Distance Matrix 工具就可以派上用场。 在本教学中,我们会使用 2 个资料集,并且寻找这两个图层中,哪些点彼此最为靠近。

内容说明

我们已有许多重要地震的位置,现在要找出这些离地震最近的人口聚居地。

你还会学到这些

  • 如何在 QGIS 中操作资料表连结 (如需更多介绍请看 资料表连接 )
  • 使用 Query Builder 来显示图层中的次群组
  • 使用 MMQGIS 附加元件画出枢纽线以呈现近邻分析的结果

取得资料

这里我们要使用 NOAA 的美国国立地球物理资料中心(NGDC)的 Significant Earthquake Database , 内含所有的全球重大地震。 下载 tab-delimited earthquake data

Natural Earth 有不错的 Populated Places 资料库, 下载 simple (less columns) dataset

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

signif.txt

ne_10m_populated_places_simple.zip

资料来源 [NGDC] [NATURALEARTH]

操作流程

  1. 打开 QGIS,选择:menuselection:Layer –> Add Layer –> Add Delimited Text Layer 然后选择刚下载的 signif.txt
../_images/1100.png

2. 这个档案是 tab-delimited file, 所以我们可以在:guilabel:File format`栏位选择:guilabel:`Tab , 程序会自动选择:guilabel:`X field`和 :guilabel:`Y field`栏位,所以按下 :guilabel:`OK`即可。

注解

可能你会看到 QGIS 显示读取档案的时候出现了一些错误,这是由于档案中的某些值异常所引起的,这些异常的资料不会被读取。在本教学中,我们就先忽略这些错误没关系。

../_images/237.png

3. 由于地震资料采用经纬度座标,输入的 CRS 应该会采用 EPSG: 4326,可在视窗右下角检查是否正确。 接下来来开启人口聚居地图层,选择:menuselection:Layer –> Add Layer –> Add Vector Layer

../_images/325.png
  1. 选择刚下载的``ne_10m_populated_places_simple.zip`` 并按下 Open
../_images/418.png

5. 稍微缩放一下浏览这两个资料库。每个紫色的点都是一个重要地震,而每个蓝色的点都是一个人口聚居地 (译按:你的点颜色可能会不同,请对照图层各自的名字)。我们要做的是为每个地震点找出最接近的人口聚居地。

../_images/518.png
  1. 选择 Vector ‣ Analysis Tools ‣ Distance Matrix
../_images/617.png

7. 在开启的视窗中,「输入点图层」选择 signif 「目标点图层」选择 ne_10m_populated_places_simple 此外, 我们还要为这两个图层选择一个「唯一ID栏位」(每个点的此栏位值都不相同),输出档将会依照此栏位显示。 在此例中,我们只要寻找最接近的 1 个点,所以要勾选 仅使用最邻近(k)目标点,然后输入 1,。 把输出档命名为 matrix.csv, 然后按下确定。程序执行完毕后,点选 Close

注解

有件事值得一提:你可以只针对单一图层执行近邻分析,只需要把输入点图层和目标点图层都设为相同图层即可。输入就会是在 1 个图层中的点的近邻结果。

../_images/716.png

8. 程序执行完毕后,在 Distance Matrix 视窗点选 Close。现在你可以使用 Notepad 或任何的文字编辑器浏览 matrix.csv 。 GIS 也可以把此档案汇入,这样就可以把结果加到 QGIS 中浏览了。选择 Layer ‣ Add Layer ‣ Add Delimited Text Layer....

../_images/816.png

9. 选择刚刚产生的新档案 matrix.csv ,因为它只包含了文字的栏位,所以要在 Geometry definition`选项中勾选 :guilabel:`No geometry (attribute only table) , 按下 OK

../_images/914.png
  1. 现在此 CSV 档案已以表格的形式汇入 QGIS 中。在这个表格上按右键,选择:guilabel:Open Attribute Table
../_images/1015.png

11. 现在就可以看到近邻分析的结果了。 InputID 栏位是从地震的图层过来的, TargetID 则是从人口聚居地的图层过来的, 代表距离地震最近的人口聚居点。Distance 则是 2 个点的距离。

注解

这里距离的计算是使用图层的 CRS,也就是说因为我们的来源图层是经纬度座标,输入距离的单位也会是角度。如果你想要把距离用公尺呈现,在执行近邻分析之前,要先重投影输入的图层。

../_images/1119.png

12. 本结果已相当接近我们想要的样子。对某些使用者来说,得到一张表格已显足够;然而,我们可以把结果进一步 Table Join 到原本的地震图层属性表格上。 以右键点选地震图层,选择 Properties

../_images/1217.png

13.前往 Joins 的分页,按下 + 按钮。

../_images/1414.png

14. 我们要作的是连接我们的分析结果到此图层上,所以必须要为两个表格各选择一个能够连接起来(具有相同数值)的栏位。 为 连结 Join layer` 图层 选择``matrix`` 再为 连结:guilabel:Join field 选择 InputIDTarget field 就选择 I_D。其他选项使用预设值,最后按下:guilabel:OK

../_images/1414.png
  1. 在:guilabel:Joins 的分页中, 就出现了一笔连接资讯。按下:guilabel:OK
../_images/1514.png
  1. 现在在 signif 图层上按右键选:guilabel:Open Attribute Table
../_images/1613.png
  1. 现在每个地震的图征,都多了新属性显示最近的 (人口聚居地) 点图征,以及其距离。
../_images/1712.png

18. 接下来我们要来看看怎么视觉画这些结果。首先,我们要另存新图层,把资料表连接的结果永久保存下来。 以右键点选 signif 然后选择:guilabel:Save As...

../_images/1812.png

19. Click the button next to 点选在:guilabel:Save as 栏位侧边的:guilabel:Browse 钮,把新档案命名为 earthquake_with_places.shp. 确认一下 Add saved file to map 中 有开启,最后按下:guilabel:OK

../_images/1910.png

20. 新图层载入后,就可以把``signif`` 图层取消勾选以隐藏起来。由于本资料集相当大,所以我们可以先对资料集的一部分进行视觉化试试看。 QGIS 可以让你不用另存新档或汇入新图层,就载入某个图层的子集。在 earthquake_with_places 上以右键点选进入 Properties

../_images/207.png
  1. 在:guilabel:General 中, 找到 Feature subset 的栏位,选择 Query Builder
../_images/2113.png
  1. 本教学中,我们要把焦点放在墨西哥附近的地震和人口聚居地。因此,请在:guilabel:Query Builder 中输入以下的表达式。
"COUNTRY" = 'MEXICO'
../_images/2212.png

23. 可以看到在 QGIS 视窗中,只剩下落在墨西哥境内的地震会显示。 接下来对人口聚居地的层进行相同操作,在 ne_10m_populated_places_simple 上以右键点选进入 Properties

../_images/238.png
  1. 在:guilabel:General 中,开启:guilabel:Query Builder,输入以下的表达式。
"adm0name" = 'Mexico'
../_images/246.png

25. 资料呈现的准备已经完成。我们接下来要使用一个称为``MMQGIS``的核心附加元件, 可参考:doc:using_plugins`进行搜寻及安装等相关操作。安装后,选择:menuselection:`MMQGIS –> Create –> Hub Lines

../_images/255.png

26. 在:guilabel:Hub Point Layer`选``ne_10m_populated_places_simple`, 在 Hub ID Attribute`选择 ``name` Spoke Point Layer`选择 ``earthquake_with_places`Spoke Hub ID Attribute`选择``matrix_Tar`。 此程序会借由比对属性栏位值,把每个地震点和最邻近的人口点用线连接起来。 点选 Browse 然后把 Output Shapefile`命名为``earthquake_hub_lines.shp`. 最后按下 OK 开始执行。

../_images/265.png
  1. 程序可能会花几分钟的时间。你可以在 QGIS 萤幕左下角看到目前进度。
../_images/275.png
  1. 处理结束后,``earthquake_hub_lines``图层会载到 QGIS 中,可以看到现在每个地震都附带一条线,连接到最接近的人口聚居地。
../_images/283.png