近鄰分析

警告

This tutorial is now obsolete. A new and updated version is available at Nearest Neighbor Analysis (QGIS3)

GIS 非常適合用於分析圖徵的空間關係。這些分析的其中之一是為特定的圖徵尋找最接近的另一個圖徵,這時 QGIS 的距離矩陣(Distance Matrix)工具就可以派上用場。在本教學中,我們會使用 2 個資料集,並且尋找這兩個圖層中,哪些點彼此最為靠近。

內容說明

我們已有許多重要地震的位置,現在要找出這些離地震最近的人口聚居地。

你還會學到這些

  • 如何在 QGIS 中操作資料表連結 (如需更多介紹請看 資料表連接)

  • 使用 查詢建構器 來顯示圖層中的次群組

  • 使用 MMQGIS 附加元件畫出樞紐線以呈現近鄰分析的結果

取得資料

這裡我們要使用 NOAA 的美國國立地球物理資料中心(NGDC)的 Significant Earthquake Database,內含所有的全球重大地震。下載 地震資料的 tab 分隔檔

Natural Earth 上有不錯的 `人口居住地 資料庫,`其中也有 `簡化版 (欄位較少) 的資料庫<http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_populated_places_simple.zip>`_

為了方便起見,你也可以直接用下面的連結下載這兩份資料集:

`signif.txt <http://www.qgistutorials.com/downloads/signif.txt>

ne_10m_populated_places_simple.zip

Data Sources: [NCEI] [NATURALEARTH]

操作流程

  1. 打開 QGIS,選擇 圖層 ‣ 加入分隔文字圖層,然後選擇剛下載的 signif.txt

../_images/1203.png
  1. 這個檔案是 Tab 分隔檔,所以我們可以在 檔案格式 欄位選擇 定位鍵。程式會自動選擇 XY 欄位,所以按下 確定 即可。

備註

可能你會看到 QGIS 顯示讀取檔案的時候出現了一些錯誤,這是由於檔案中的某些值異常所引起的,這些異常的資料不會被讀取。在本教學中,我們就先忽略這些錯誤沒關係。

../_images/2166.png
  1. 由於地震資料採用經緯度座標,輸入的 CRS 應該會採用 EPSG: 4326,可在視窗右下角檢查是否正確。接下來來開啟人口聚居地圖層,選擇 圖層 ‣ 加入向量圖層

../_images/3103.png
  1. 選擇剛下載的 ne_10m_populated_places_simple.zip 並按下 確定

../_images/469.png
  1. 稍微縮放一下瀏覽這兩個資料庫。每個紫色的點都是一個重要地震,而每個藍色的點都是一個人口聚居地(譯按:你的點顏色可能會不同,請對照圖層各自的名字)。我們要做的是為每個地震點找出最接近的人口聚居地。

../_images/562.png
  1. 選擇 向量 ‣ 分析工具 ‣ 距離矩陣

../_images/660.png
  1. 在開啟的視窗中,「輸入點圖層」選擇 signif,「目標點圖層」選擇 ne_10m_populated_places_simple。此外,我們還要為這兩個圖層選擇一個「唯一ID欄位」(每個點的此欄位值都不相同),輸出檔將會依照此欄位顯示。在此例中,我們只要尋找最接近的 1 個點,所以要勾選 僅使用最鄰近(k)目標點,然後輸入 1。把輸出檔命名為 matrix.csv,然後按下確定。程式執行完畢後,點選 關閉

備註

有件事值得一提:你可以只針對單一圖層執行近鄰分析,只需要把輸入點圖層和目標點圖層都設為相同圖層即可。輸入就會是在 1 個圖層中的點的近鄰結果。

../_images/759.png
  1. 程式執行完畢後,在 距離矩陣 視窗點選 關閉。現在你可以使用 Notepad 或任何的文字編輯器瀏覽 matrix.csv。QGIS 也可以把此檔案匯入,這樣就可以把結果加到 QGIS 中瀏覽了。選擇 圖層 ‣ 加入分隔文字圖層

../_images/858.png
  1. 選擇剛剛產生的新檔案 matrix.csv,因為它只包含了文字的欄位,所以要在 幾何欄位定義 選項中勾選 無幾何欄位 (僅產生屬性表格)。按下 確定

../_images/957.png
  1. 現在此 CSV 檔案已以表格的形式匯入 QGIS 中。在這個表格上按右鍵,選擇 開啟屬性表格

../_images/1065.png
  1. 現在就可以看到近鄰分析的結果了。InputID 欄位是從地震的圖層過來的,TargetID 則是從人口聚居地的圖層過來的,代表距離地震最近的人口聚居點。Distance 則是 2 個點的距離。

備註

這裡距離的計算是使用圖層的 CRS,也就是說因為我們的來源圖層是經緯度座標,輸入距離的單位也會是角度。如果你想要把距離用公尺呈現,在執行近鄰分析之前,要先重投影輸入的圖層。

../_images/11103.png
  1. 本結果已相當接近我們想要的樣子。對某些使用者來說,得到一張表格已顯足夠;然而,我們可以把結果進一步連接到原本的地震圖層屬性表格上。以右鍵點選地震圖層,選擇 屬性

../_images/1267.png
  1. 前往 連結(Joins)的分頁,按下 + 按鈕。

../_images/1460.png
  1. 我們要作的是連接我們的分析結果到此圖層上,所以必須要為兩個表格各選擇一個能夠連接起來(具有相同數值)的欄位。為 連結(Join)圖層 選擇 matrix,再為 連結欄位 選擇 InputID,而 目標欄位 就選擇 I_D。其他選項使用預設值,最後按下 確定

../_images/1460.png
  1. 連結(Joins)的分頁中,就出現了一筆連接資訊。按下 確定

../_images/1554.png
  1. 現在在 signif 圖層上按右鍵選 開啟屬性表格

../_images/1651.png
  1. 現在每個地震的圖徵,都多了新屬性顯示最近的 (人口聚居地) 點圖徵,以及其距離。

../_images/1748.png
  1. 接下來我們要來看看怎麼視覺畫這些結果。首先,我們要另存新圖層,把資料表連接的結果永久保存下來。以右鍵點選 signif 然後選擇 存檔為…

../_images/1844.png
  1. 點選在 另存為 欄位側邊的 瀏覽 鈕,把新檔案命名為 earthquake_with_places.shp,確認一下 加入儲存檔案至地圖中 有開啟,最後按下 確定

../_images/1935.png
  1. 新圖層載入後,就可以把 signif 圖層取消勾選以隱藏起來。由於本資料集相當大,所以我們可以先對資料集的一部分進行視覺化試試看。QGIS 可以讓你不用另存新檔或匯入新圖層,就載入某個圖層的子集。在 earthquake_with_places 上以右鍵點選進入 屬性

../_images/2030.png
  1. 在「一般」分頁中,找到 Feature subset (或 Provider feature filter)的欄位,選擇 查詢建構器

../_images/2167.png
  1. 本教學中,我們要把焦點放在墨西哥附近的地震和人口聚居地。因此,請在 查詢建構器 中輸入以下的表達式。

"COUNTRY" = 'MEXICO'
../_images/2230.png
  1. 可以看到在 QGIS 視窗中,只剩下落在墨西哥境內的地震會顯示。接下來對人口聚居地的層進行相同操作,在 ne_10m_populated_places_simple 上以右鍵點選進入 屬性

../_images/2327.png
  1. 在「一般」分頁中,開啟 查詢建構器,輸入以下的表達式。

"adm0name" = 'Mexico'
../_images/2427.png
  1. 資料呈現的準備已經完成。我們接下來要使用一個稱為 MMQGIS 的核心附加元件,可參考 使用附加元件 進行搜尋及安裝等相關操作。安裝後,選擇 MMQGIS ‣ Create ‣ Hub Lines

../_images/2525.png
  1. Hub Point Layer 欄位選擇 ne_10m_populated_places_simpleHub ID Attribute 欄位選 nameSpoke Point Layer 欄位選擇 earthquake_with_placesSpoke Hub ID Attribute 欄位選擇 matrix_Tar。此程式會藉由比對屬性欄位值,把每個地震點和最鄰近的人口點用線連接起來。點選 Browse 然後把 Output Shapefile 命名為 earthquake_hub_lines.shp,最後按下 確定 開始執行。

../_images/2622.png
  1. 程式可能會花幾分鐘的時間。你可以在 QGIS 螢幕左下角看到目前進度。

../_images/2722.png
  1. 處理結束後,earthquake_hub_lines 圖層會載到 QGIS 中,可以看到現在每個地震都附帶一條線,連接到最接近的人口聚居地。

../_images/2821.png

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