跳至內容
AI Agent
QGIS
Tutorial

QGIS 空間連結教學:依位置、最近距離或 AI

發布於

里昂第 8 區的街道地圖,紅色學校點位各以黑線連到最近的藍色電車站,圖上寫著 710 m,里昂學校到電車站的中位距離。

空間連結是依據要素所在的位置,而不是共同的 ID,把一個圖層的欄位複製到另一個圖層。 在 QGIS 中開啟 Vector > Data Management Tools > Join Attributes by Location…,選好要接收新欄位的圖層、提供欄位的圖層,再選一個「相交」之類的規則,執行即可。如果問題是「哪一個最近」,請改用 Join Attributes by Nearest,或是直接用一句話把整個任務交給 AI Agent。

你想做什麼工具實測時間
讓每個點取得它所在區域的名稱Join Attributes by Location0.21 秒,382 所學校
同樣的事,用一句話下指令AI Agent22 秒,統計與最近距離一起完成
統計或加總每個區域內的點Join Attributes by Location (Summary)0.02 秒,9 個區域
找出最近的要素與距離Join Attributes by Nearest0.06 秒,382 所學校

測試資料

本文所有數字都來自 2026 年 10 月 15 日對法國里昂真實開放資料的同一次測試:

  • 來自 OpenStreetMap 的 9 個 arrondissement(市內行政區)與 382 所學校。
  • 來自 OpenStreetMap 的 106 個電車站。
  • 來自法國國家地形資料庫 IGN BD TOPO 的 103,910 棟建築。

所有圖層都使用 Lambert-93 (EPSG:2154),這是以公尺為單位的投影坐標系統。時間是在 MacBook Air M4 上用 QGIS 3.44 測得。

方法 1:Join attributes by location

這是最典型的空間連結。這裡要讓每所學校取得所屬 arrondissement 的名稱。

開啟工具

Vector > Data Management Tools > Join Attributes by Location…。你也可以在 Processing Toolbox(處理工具箱,Ctrl+Alt+T)中搜尋「join attributes」。

選擇兩個圖層

Join to features in 是接收新欄位的圖層,這裡是 schools。By comparing to 是提供欄位的圖層,這裡是 arrondissements。

勾選空間關係

點在多邊形內的情況,預設選 intersect 最安全。下方的章節會說明每個選項的意思。

選擇欄位與連結類型

在 Fields to add 只保留需要的欄位,這裡是 name。將 Join type 設為 one-to-one,並加上 arr_ 之類的前綴,讓新欄位一眼就能認出來。

執行

Joined layer 先維持暫存圖層,確認結果後再存成 GeoPackage。

QGIS 的 Join attributes by location 對話框。Join to features in:schools。Predicate:已勾選 intersect。By comparing to:arrondissements。Fields to add:name。Join type:Take attributes of the first matching feature only (one-to-one)。Joined field prefix:arr_。
我們實際執行的連結:每所學校取得它所在 arrondissement 的名稱。382 所學校全部配對成功,只花 0.21 秒。

只有在想剔除未配對的資料時,才勾選 Discard records which could not be joined。一開始先不要勾:空白的列正好能告訴你哪裡出了問題。

適合: 你需要的是每個物件所在或接觸的那個要素的一個或幾個欄位。

不適合: 要素之間完全不接觸,例如學校與電車站。這種情況請用方法 4。

方法 2:用一句話請 AI Agent 處理

AI Agent 是我們的 QGIS 外掛,可以依你輸入的需求執行任務。它會讀取圖層名稱與欄位,自己挑選工具,並在你的專案中執行。

我們載入同樣的里昂圖層,給它這個指令:

Count the schools in each arrondissement, then give every school the name of its nearest tram stop and the distance to it in metres.

它先執行了兩個 QGIS 處理工具,再用一小段 Python 把兩個新欄位寫進學校圖層。面板顯示「Worked for 22 s」。過程中它只詢問了一次權限,因為它要修改磁碟上的 GeoPackage。它的統計結果和我們手動執行的完全一致:共 382 所學校,從第 2 區與第 4 區的 27 所,到第 5 區的 56 所。

QGIS 畫面,里昂各 arrondissement 填成橘色並標出學校點位,右側是 AI Agent 面板。需求寫著:Count the schools in each arrondissement, then give every school the name of its nearest tram stop and the distance to it in metres。回覆列出各區學校數,共 382 所學校,並說明 382 所學校都已取得 nearest_tram 與 tram_distance_m 欄位,距離從 49.6 到 4,949.2 m。
一句話完成同樣的兩個連結。回覆附有新圖層的連結,並列出改了哪些內容。

適合: 你知道要問什麼,但不確定四個連結工具中哪一個能回答,或是需要串接好幾個步驟。

不適合: 每週都要跑同一個連結。這種情況請存成模型或 Python 腳本,一次設定好。

價格: 有免費方案,不需要信用卡。Pro 每月 €49,未含營業稅。

方法 3:用空間連結計數與彙總

方法 1 讓每所學校取得所屬行政區。反過來問「每個行政區有幾所學校」,就要用彙總版本。

在 Processing Toolbox 搜尋 Join attributes by location (summary)。把多邊形放進 Join to features in,點放進 By comparing to,再在 Summaries to calculate 選擇統計項目:計數、總和、平均、中位數、最小值、最大值等。QGIS 會為每個統計項目新增一個欄位,名稱類似 osm_id_count。

里昂九個 arrondissement 的地圖,依學校數從淺黃到深橘上色,並加上標註:9e 38、4e 27、1e 33、6e 41、5e 56、2e 27、3e 54、7e 53、8e 53。紅點代表學校。
一次彙總連結得出各 arrondissement 的學校數:0.02 秒。

它也能加總數值。在 IGN 建築資料上跑一次,就能得到每個 arrondissement 的建築數與其中記錄的住宅單位數:第 3 區有 9,474 棟建築、51,743 個住宅單位,兩項都是最多。

如果只是單純計數,Vector > Analysis Tools > Count Points in Polygon… 用更少的設定就能做到同樣的事。

適合: 答案是每個區域的一個數字:計數、總和、平均。

不適合: 你需要的是配對結果本身的清單。請用方法 1,並選 one-to-many。

方法 4:Join attributes by nearest

當要素之間不接觸時,就用距離來連結。在 Processing Toolbox 搜尋 Join attributes by nearest。

將 Input layer 設為 schools,Input layer 2 設為 tram_stops,Maximum nearest neighbors 設為 1。QGIS 會加上該電車站的欄位、一個 distance 欄位,以及兩端的坐標。

里昂第 8 區的街道地圖。紅色學校點位各以黑線連到最近的藍色電車站。有幾所學校共用同一個電車站。
每所學校連到最近的電車站。整個里昂的中位距離是 710 m,382 所學校中有 86 所在 300 m 以內。

有兩個設定會改變結果:

  • Maximum distance。 設為 300 m 時,只有 86 所學校找到電車站。其餘 296 所仍會留在輸出中,只是欄位是空的,除非你勾選 Discard records which could not be joined。
  • Maximum nearest neighbors。 設為 3 時,382 所學校變成 1,146 列,每所學校與每個電車站各一列。距離完全相同時也會多出一列:在 103,910 棟 IGN 建築上,我們得到 103,911 列。

這裡的距離是直線距離,不是沿街道行走的距離。

適合: 你要問「哪一個最近」和「有多遠」。

不適合: 你需要實際行進的距離。請改用 Processing Toolbox 中的 Network analysis 工具。

該勾選哪一種空間關係

空間關係(predicate)是決定是否配對的空間規則。QGIS 把它讀成「圖層 A [空間關係] 圖層 B」,其中 A 是接收欄位的圖層。

紅色形狀 A 與藍色形狀 B 之間八種空間關係的示意圖:intersect,兩者有任何重疊部分;contain,A 包住整個 B;are within,A 位於 B 之內;equal,幾何完全相同;touch,兩者只共用邊界;overlap,同類型且部分重疊;cross,線穿過另一個要素;no match,即 disjoint,沒有任何連結。
紅色是接收欄位的圖層,藍色是被比較的圖層。

三個規則就能涵蓋大部分工作:

  • intersect:適用於點在多邊形內,以及任何只需要接觸的情況。位於邊界上的要素也會被抓到。
  • are within:要素必須完全位於內部時使用。在我們的建築資料中,與里昂相交的建築有 112 棟沒有完全落在單一 arrondissement 內:108 棟跨越市界,4 棟跨越區與區的邊界。
  • contain:反方向使用,也就是由多邊形去包住點。

你可以同時勾選多個選項。只要其中任何一個成立,要素就算配對成功。

One-to-one、one-to-many 或 largest overlap

位於邊界上的建築會接觸兩個行政區。Join type 決定如何處理它。以下是與里昂相交的 46,250 棟 IGN 建築:

Join type輸出列數時間
One-to-many(每個配對一個要素)46,2541.13 秒
只取第一個配對的要素(one-to-one)46,2500.99 秒
只取重疊最大的要素(one-to-one)46,2509.62 秒

One-to-many 把跨越區界的 4 棟建築重複算了一次。這對列出配對清單是正確的,但用在加總就錯了:這些建築會被算兩次。

「第一個配對」會保留 QGIS 最先遇到的配對,所以邊界上的建築可能被分到任一個行政區。「重疊最大」則選擇涵蓋它最多面積的行政區,這是比較公平的答案,但在這裡花的時間是十倍。

CRS 的陷阱

錯誤的坐標參考系統 (CRS) 很少會讓連結直接失敗,它只會悄悄改變結果。

  • 位置連結可以混用 CRS。 我們把學校留在 WGS 84 (EPSG:4326),行政區用 Lambert-93。QGIS 會即時重新投影,382 所學校全部配對成功。
  • 距離沿用輸入圖層的單位。 對 WGS 84 的檔案執行 Join by nearest,中位「距離」會是 0.0071。那是度,不是公尺。請先用 Vector > Data Management Tools > Reproject Layer… 把兩個圖層都重新投影到以公尺為單位的投影 CRS。
  • Maximum distance 也用同樣的單位。 以度為單位的 300 可以涵蓋整個地球。

我們另一篇文章 什麼是 CRS 說明了度與公尺的差別,以及圖層位置不對時該怎麼修正。

大型圖層的速度

QGIS 處理城市規模的連結只需要幾秒。以下是 103,910 棟 IGN 建築的結果:

  • 與 9 個行政區做 one-to-one 連結:從 GeoPackage 讀取只要 0.97 秒。
  • 同一個圖層改用 Shapefile:1.69 秒。執行 Vector > Data Management Tools > Create Spatial Index… 之後是 1.04 秒。
  • 為每棟建築找最近的電車站:3.5 秒。
  • Largest overlap:9.62 秒,是最慢的選項。

四個習慣可以讓大型連結保持快速:

  • 使用 GeoPackage。 它內建空間索引。Shapefile 需要 .qix 檔,Create Spatial Index 會幫你產生。
  • 只要需要的欄位。 在 Fields to add 中填寫欄位,不要全部複製。
  • 除非邊界要素真的重要,否則避免 largest overlap。
  • 先修復幾何。 無效的多邊形會讓執行中止,並顯示「has invalid geometry」。Processing Toolbox 中的 Fix geometries 工具可以修復它。你也可以在輸入圖層旁的扳手圖示下,變更 Invalid feature filtering。

也要檢查點位落在哪裡。382 個學校點位中,只有 211 個落在 IGN 建築內。其餘的標在操場和庭院,所以「學校在建築內」的條件會漏掉 171 所學校。

重點整理

用 Join Attributes by Location 搭配 intersect,讓點取得所在區域的名稱。

要計數或加總每個區域,用 Summary 版本;要找最近的要素與距離,用 Join Attributes by Nearest。

要算總數就選 one-to-one,需要每個配對時就選 one-to-many。

做任何距離運算之前,先重新投影到以公尺為單位的 CRS。

如果不確定該用哪個工具,就把想要的結果告訴 AI Agent,再檢查它做了什麼。

常見問題

QGIS 的空間連結是什麼?

空間連結是依位置把一個圖層的欄位加到另一個圖層:在內部、接觸或最近。在 QGIS 中,主要工具有 Join Attributes by Location、用於計數與統計的 Summary 版本,以及用於距離的 Join Attributes by Nearest。

如何在 QGIS 中依位置連結屬性?

開啟 Vector > Data Management Tools > Join Attributes by Location…。在 Join to features in 設定接收欄位的圖層,在 By comparing to 設定來源圖層,勾選 intersect,選擇欄位和 one-to-one 連結類型,然後執行。

依位置連結和依最近距離連結有什麼不同?

依位置連結要求要素必須接觸或重疊,條件取決於你勾選的空間關係。依最近距離連結不需要接觸:它會找出最近的要素並加上距離欄位,單位是輸入圖層 CRS 的單位。

為什麼我的空間連結結果欄位是空的?

通常是要素不符合空間關係:點剛好在多邊形外面、空間關係太嚴格(例如 "are within"),或是幾何無效。請在地圖上檢查兩個圖層,試試 "intersect",並執行 Fix Geometries。如果其中一個圖層缺少 CRS,位置也會跑掉。

AI 可以在 QGIS 做空間連結嗎?

可以。AI Agent 會依你輸入的需求執行 QGIS 工具。在我們的里昂測試中,它只用一句話就在 22 秒內完成各行政區的計數和最近距離連結,結果和手動執行的相同。

在 QGIS 免費試用 AI Agent,不需信用卡

由以下作者撰寫TerraLab
·6 min read
聯絡