空间查询

空间查询是许多种 GIS 分析技巧的核心。在 QGIS 中,这个功能可以透过 Spatial Query 这个附加元件来达成。

内容说明

我们使用的 2 个资料库分别为河流的线图层以及城市的点图层,要做的事情是寻找所有与河流的距离小于 10 公里的城市。

你还会学到这些

  • 在 QGIS 中直接开启 zip 档
  • 选择适合的投影法,重投影向量资料
  • 制作「环域〈buffers〉」
  • 使用类 SQL 的表示法选择图征
  • 把 shapefile 转换为 KML 档
  • 利用 Google Earth 来验证结果

取得资料

我们要使用 Natural Earth 提供的``ne_10m_rivers_lake_centerlines`` 和 ``10m_populated_places_simple``这两个资料库。

下载`Rivers and Lake Centerlines <http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/ 10m/physical/ne_10m_rivers_lake_centerlines.zip>`_

下载`Populated Places <http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/ 10m/cultural/ne_10m_populated_places_simple.zip>`_.

资料来源 [NATURALEARTH]

操作流程

1.载好资料以后,打开 QGIS,选择:menuselection:Layer –> Add Vector Layer

../_images/1103.png
  1. 点选 Browse 然后移到你下载资料的地方。
../_images/247.png
  1. 按住:kbd:Shift 键后点选两个 zip 档,全部选起来后按下:guilabel:Open
../_images/328.png
  1. 你可能需要从 zip 档中选择图层载入,选 ne_10m_rivers_lake_centerlines.shp 然后按下:guilabel:OK
../_images/420.png
  1. 因为我们选了两个压缩档,所以相同步骤要再重复一次。选择`10m_populated_places_simple.shp` 然后按下:guilabel:OK
../_images/521.png
  1. 接着 QGIS 中就可以看到这两个图层。
../_images/620.png
  1. 我们的下一步是为点和线图层制作「环域」,它是一种地理预算函数,QGIS 会使用 layer units 的单位计算空间中的任一点到图征的距离,也就是`Buffer`目前我们的地理座标参考系统`Geographic Coordinate Reference System (CRS)` 以`degrees`作单位,如果我们要使用 metres 或`kilometres`为单位进行分析,可能就不是那么适当。因此,我们必须先使用一个投影座标系统 Projected Coordinate Reference System (CRS)`重投影图层。在``10m_populated_places_simple layer` 图层上按右键,然后选择:guilabel:Save As
../_images/719.png
  1. 在:guilabel:Save vector layer as...`的视窗中,按下在:guilabel:`Save as 旁边的:guilabel:Browse`钮,然后选择输出档的位置。把输出档命名为 ``populated_places_reprojected.shp`.然后按下在:guilabel:`CRS`旁边的 :guilabel:`Browse`钮 〈地球图示〉。
../_images/818.png
  1. 现在要选择适合我们目的的 CRS。由于我们要制作环域,方位等距投影应会是最好的投影法,因为此投影法具在投影中心附近有非常准确径向距离。本例中,我们也要选个全球投影,以符合全球性的资料集。在 Coordinate Reference System Selector 视窗中,搜寻`world az..` 后应该就会看到我们要的结果,选择`World_Azimuthal_Equidistant` 然后按下 OK

注解

World_Azimuthal_Equidistant 投影只会覆蓋到投影中心延伸出去 90 度角的地方,由于我们的投影中心会是经度 0 度,所以只有在经度正负 90 度以内的资料点会被转换。

../_images/916.png
  1. 回到:guilabel:Save vector layer as ... 的视窗,勾选 Add saved file to map 然后按下`OK`。
../_images/1017.png
  1. 对``ne_10m_rivers_lake_centerlines``重复以上操作,把输出档存为 rivers_lake_reprojected.shp
../_images/1121.png

12.现在我们在:guilabel:Layers Panel`中可以看到 4 个图层,请把原本的图层取消勾选这样就只有重投影过的图层会显示。不过,重投影的图层目前因为设定的关系,仍然以 `Geographic CRS`显示,让我们把此设定关掉吧。点选:guilabel:`Project Properties`钮,或是前往:menuselection:`Project –> Project Properties

../_images/1219.png
  1. 在:guilabel:Project Properties 视窗中:guilabel:CRS`的分页下,取消 :guilabel:`Enable on-the-fly CRS transformation`的勾选,然后按下:guilabel:`OK
../_images/1317.png

14.回到 QGIS 主视窗,右键点选任一个重投影过的图层,选择:guilabel:Zoom to Layer Extent

../_images/1416.png
  1. 现在我们就可以看到资料使用图层的 CRS 投影了。接下来就来制作两个资料集的环域,请前往:menuselection:Vector –> Geoprocessing Tools –> Buffer
../_images/1515.png
  1. Buffer 工具视窗中,选择 populated_places_reprojected``作为输入图层,环域距离输入`10000`。注意本 CRS 的单位是公尺,所以 10,000 意味着 10 公里。输出档取名为``populated_places_buffer.shp,然后按下:guilabel:OK
../_images/1614.png

17.环域处理结束后,按下:guilabel:`Yes`以加入新建的图层到 QGIS 中。(较新的 QGIS 版本则需要在上一步骤选择。)

../_images/1713.png
  1. rivers_lake_reprojected 图层重复以上步骤,输出档命名为 rivers_lake_buffer.shp
../_images/1813.png
  1. rivers_lake_buffer 图层实际上包含了河流与湖泊,我们的目标只需要用到河流图征,所以我们还要执行一次查询工作,把河流选取起来。在``rivers_lake_buffer`` 图层上按右键,选择:guilabel:Open Attribute Table
../_images/1911.png
  1. 可以看到,featurecla 属性可以利用来作为选择河流图征的工具。请按下 Select features using an expression 钮。
../_images/208.png
  1. 输入表达式 “featurecla” = “River” 然后按下:guilabel:Select`接着按下:guilabel:`Close,回到 QGIS 主视窗。
../_images/2114.png
  1. 现在我们可以进行空间查询了。首先你必须要启用`Spatial Query plugin`附加元件才能使用此功能,如需更多细节请查阅 See 使用附加元件,启用后,前往:menuselection:Vector –> Spatial Query –> Spatial Query
../_images/2213.png
  1. 我们的查询目标是选择那些自身环域有被河流的环域覆蓋到(也就是当图征「相交于」)的城市。请确认 selected geometries 旁的方框有被勾选起来,这是确保本查询只会只用到我们之前选择的河流图征。最后按下:guilabel:Apply
../_images/2310.png
  1. 查询完成后,视窗会出现一个新区域,名为:guilabel:Selected features。按下:guilabel:Create layer with selected 钮后,有个新图层就会被加到 QGIS 的 Layers Panel`中。最后按下:guilabel:`Close
../_images/248.png
  1. 现在你可以缩放到任一区域察看一下结果,可以发现新的图层只包含了与河流环域相交的图征。
../_images/256.png
  1. 最后,我们应该要随时检查我们的结果,确保分析的过程中并没有出错。有个验证的方法是把结果输出成 KML 档,然后在 Google 地球中读取,这样就可以确认你找到的城市真的距离河流不到 10 公里。请以右键点选图层,选择:guilabel:Save As...
../_images/266.png
  1. 在:guilabel:Save vector layer as...`的视窗中,需要选择`WGS84 为 CRS,这是 KML 档案格式的需求。把 KML 命名为 cities_near_river.kml
../_images/276.png
  1. 打开 Google 地球,然后验证这些城市(环域可表达其约略范围)真的非常接近河流。
../_images/284.png