空間查詢

警告

This tutorial is now obsolete. A new and updated version is available at Performing Spatial Queries (QGIS3)

空間查詢是許多種 GIS 分析技巧的核心。在 QGIS 中,這個功能可以透過 Spatial Query 這個附加元件來達成。

內容說明

我們使用的 2 個資料庫分別為河流的線圖層以及城市的點圖層,要做的事情是尋找所有與河流的距離小於 10 公里的城市。

你還會學到這些

  • 在 QGIS 中直接開啟 zip 檔

  • 選擇適合的投影法,重投影向量資料

  • 製作「環域〈buffers〉」

  • 使用類 SQL 的表示法選擇圖徵

  • 把 shapefile 轉換為 KML 檔

  • 利用 Google Earth 來驗證結果

取得資料

我們要使用 Natural Earth 提供的 ne_10m_rivers_lake_centerlines10m_populated_places_simple 這兩個資料庫。

下載 河流與湖泊中心線

下載 人口居住地

資料來源 [NATURALEARTH]

操作流程

  1. 載好資料以後,打開 QGIS,選擇 圖層 ‣ 加入圖層 ‣ 加入向量圖層

../_images/1199.png
  1. 點選 瀏覽 然後移到你下載資料的地方。

../_images/2162.png
  1. 按住 Shift 鍵後點選兩個 zip 檔,全部選起來後按下 開啟

../_images/3102.png
  1. 你可能需要從 zip 檔中選擇圖層載入,選 ne_10m_rivers_lake_centerlines.shp 然後按下確定

../_images/465.png
  1. 因為我們選了兩個壓縮檔,所以相同步驟要再重複一次。選擇 10m_populated_places_simple.shp 然後按下確定

../_images/559.png
  1. 接著 QGIS 中就可以看到這兩個圖層。

../_images/657.png
  1. 我們的下一步是為點和線圖層製作「環域」,它是一種地理預算函數,QGIS 會使用圖層的單位計算空間中的任一點到圖徵的距離,也就是「環域距離」。目前我們的地理座標參考系統 (Geographic CRS)角度作單位,如果我們要使用公尺公里為單位進行分析,可能就不是那麼適當。因此,我們必須先使用一個投影座標系統 (Projected CRS)重投影圖層。在 10m_populated_places_simple layer 圖層上按右鍵,然後選擇 存檔為…

../_images/756.png
  1. 儲存向量圖層為… 的視窗中,按下在 另存為 旁邊的 瀏覽 鈕,然後選擇輸出檔的位置。把輸出檔命名為 populated_places_reprojected.shp,然後按下在 CRS 旁邊的 瀏覽 鈕 〈地球圖示〉。

../_images/854.png
  1. Now we must choose an appropriate CRS for our purpose. For creating buffers, a Azimuthal Equidistant projection would be best suited as radial distances around the center of the projection are accurate. In our case, since the dataset is global, we will choose a World projection. In the Coordinate Reference System Selector dialog, start searching for world az.. and you will see the results show up. Select the World_Azimuthal_Equidistant and click OK.

備註

World_Azimuthal_Equidistant 投影只會覆蓋到投影中心延伸出去 90 度角的地方,由於我們的投影中心會是經度 0 度,所以只有在經度正負 90 度以內的資料點會被轉換。

../_images/953.png
  1. 回到 儲存向量圖層為… 的視窗,勾選 加入儲存檔案至地圖中,然後按下 確定

../_images/1061.png
  1. ne_10m_rivers_lake_centerlines 重複以上操作,把輸出檔存為 rivers_lake_reprojected.shp

../_images/11100.png
  1. 現在我們在 圖層面板 中可以看到 4 個圖層,請把原本的圖層取消勾選,這樣就只有重投影過的圖層會顯示。不過,重投影的圖層目前因為設定的關係,仍然以 Geographic CRS 顯示,讓我們把此設定關掉吧。點選 專案屬性 鈕,或是前往 專案 ‣ 專案屬性

../_images/1263.png
  1. 專案屬性 視窗中 CRS 的分頁下,取消 開啟即時 CRS 轉換 的勾選,然後按下 確定

../_images/1360.png
  1. 回到 QGIS 主視窗,右鍵點選任一個重投影過的圖層,選擇 縮放到圖層範圍

../_images/1457.png
  1. 現在我們就可以看到資料使用圖層的 CRS 投影了。接下來就來製作兩個資料集的環域,請前往 向量 ‣ 地理運算工具 ‣ 環域(Buffer)

../_images/1552.png
  1. 環域 工具視窗中,選擇 populated_places_reprojected 作為輸入圖層,環域距離輸入 10000。注意本 CRS 的單位是公尺,所以 10,000 意味著 10 公里。輸出檔取名為 populated_places_buffer.shp,然後按下 確定

../_images/1649.png
  1. 環域處理結束後,按下 以加入新建的圖層到 QGIS 中。(較新的 QGIS 版本則需要在上一步驟選擇。)

../_images/1746.png
  1. rivers_lake_reprojected 圖層重複以上步驟,輸出檔命名為 rivers_lake_buffer.shp

../_images/1843.png
  1. rivers_lake_buffer 圖層實際上包含了河流與湖泊,我們的目標只需要用到河流圖徵,所以我們還要執行一次查詢工作,把河流選取起來。在 rivers_lake_buffer 圖層上按右鍵,選擇 開啟屬性表格

../_images/1934.png
  1. 可以看到,featurecla 屬性可以利用來作為選擇河流圖徵的工具。請按下 使用表示式選取圖徵 鈕。

../_images/2029.png
  1. 輸入表達式 「featurecla」 = 『River』 然後按下 選取,接著按下 關閉,回到 QGIS 主視窗。

../_images/2163.png
  1. 現在我們可以進行空間查詢了。首先你必須要啟用 Spatial Query 附加元件才能使用此功能,如需更多細節請查閱 使用附加元件。啟用後,前往 向量 ‣ 空間查詢 ‣ 空間查詢

../_images/2230.png
  1. 我們的查詢目標是選擇那些自身環域有被河流的環域覆蓋到(也就是當圖徵「相交於」)的城市。請確認 選中的圖徵 旁的方框有被勾選起來,這是確保本查詢只會只用到我們之前選擇的河流圖徵。最後按下 套用

../_images/2327.png
  1. 查詢完成後,視窗會出現一個新區域,名為 選中的圖徵。按下 由所選建立圖層 鈕後,有個新圖層就會被加到 QGIS 的圖層列表中。最後按下 關閉

../_images/2427.png
  1. 現在你可以縮放到任一區域察看一下結果,可以發現新的圖層只包含了與河流環域相交的圖徵。

../_images/2525.png
  1. 最後,我們應該要隨時檢查我們的結果,確保分析的過程中並沒有出錯。有個驗證的方法是把結果輸出成 KML 檔,然後在 Google 地球中讀取,這樣就可以確認你找到的城市真的距離河流不到 10 公里。請以右鍵點選圖層,選擇 存檔為…

../_images/2623.png
  1. 儲存向量圖層為… 的視窗中,需要選擇 WGS84 為 CRS,這是 KML 檔案格式的需求。把 KML 命名為 cities_near_river.kml

../_images/2722.png
  1. 打開 Google 地球,然後驗證這些城市(環域可表達其約略範圍)真的非常接近河流。

../_images/2821.png

If you want to give feedback or share your experience with this tutorial, please comment below. (requires GitHub account)