跳至內容
AI Agent
QGIS
教學

QGIS 欄位計算機教學:24 個實測運算式與常見陷阱

發布於

要在 QGIS 中計算欄位,先開啟圖層的屬性表,點選 Field Calculator(欄位計算機)圖示(Ctrl+I),選擇新欄位或既有欄位,輸入運算式後按 OK。這部分很快。真正麻煩的是運算式沒有報錯,卻寫入了 NULL、平方度或錯誤的分級。

2026 年 11 月 7 日,我在印度班加羅爾 Indiranagar 及周邊行政區的真實 OpenStreetMap 圖層上(8,709 棟建物、854 條道路、35 所學校、37 個公車站、10 個行政區)執行了 24 個欄位計算機運算式,並在每一個旁邊執行常見的錯誤寫法。以下是附上精確輸出值的運算式手冊、以橢球體為基準量測的隱藏陷阱,以及我把其中最難的三個交給 QGIS 內的 AI 代理之後的結果。

什麼是 QGIS 欄位計算機?

QGIS 欄位計算機是內建工具,用 QGIS 運算式建立或更新屬性表欄位。它可以計算面積、長度、座標等幾何數值,改寫文字,用 CASE WHEN 為資料分級,也能從專案中的其他圖層取得數量或距離。

QGIS 其實提供四個地方執行同樣的運算式,選錯地方是遺失成果的第一個原因:

  • Field Calculator 對話框(Ctrl+I): 直接修改圖層。你可以新增欄位或覆寫既有欄位,套用到全部圖徵或只套用到選取的圖徵。變更會留在編輯暫存區,直到你儲存編輯。
  • 虛擬欄位(對話框內的勾選框): 每次開啟屬性表或繪製地圖時即時計算運算式。我在測試圖層中把建物 fid 27 的面積加倍後,一般面積欄位仍是 197.355,虛擬欄位則更新為 789.418。問題在於虛擬欄位存在 .qgs 專案檔裡,而不是 GeoPackage 或 Shapefile 裡。在新專案中開啟該檔案,這個欄位就不見了。
  • Processing 的「Field calculator」工具(native:fieldcalculator): 寫出一個全新的輸出圖層,原始圖層保持不變。適合用在模型中,或不想直接修改原圖層時。注意 @row_number,它在這裡從 0 開始,在對話框中則從 1 開始。
  • 屬性表上方的快速計算列: 不用開啟完整對話框就能更新既有欄位,已經在編輯模式時寫一行快速運算式很方便。

逐步計算欄位

開啟 Field Calculator

在圖層上按右鍵,選擇 Open Attribute Table(開啟屬性表),再點選屬性表工具列中的算盤圖示。在圖層面板選取該圖層後,按 Ctrl+I 可直接開啟 Field Calculator。

檢查選取狀態與欄位設定

如果地圖上有任何圖徵被選取,Only update N selected feature(s) 預設會被勾選。若要計算整個圖層,請取消勾選。選擇 Create a new field(新增欄位)或 Update existing field(更新既有欄位),設定 Output field name,並選擇 Output field type(有小數的面積與長度用 Decimal number (real),整數計數用 Integer,標籤與分級用 Text (string))。

輸入運算式並檢查 Preview

在左側編輯器輸入運算式,或在中間的函式清單搜尋後按兩下插入。按 OK 之前,一定要檢查編輯器下方的 Preview(預覽)那一行。如果顯示錯誤、NULL,或像 0.0000003 這樣的數字,先修正運算式,再寫入 8,000 筆資料。

按 OK 並儲存編輯

按 OK。如果圖層原本不在編輯模式,QGIS 會提醒你將自動開啟編輯模式。計算完成後,點選屬性表工具列中的 Save Edits(儲存編輯)磁碟片圖示,欄位才會寫入檔案。

以下是道路圖層上的對話框,準備寫入道路等級:

班加羅爾道路圖層上的 QGIS Field Calculator 對話框,勾選了 Only update 39 selected features,新增名為 road_rank 的 Text 欄位,以 CASE WHEN 運算式將 primary 與 secondary 道路分為 arterial,Preview 顯示 arterial。
QGIS 3.44 的 Field Calculator 對話框。注意左上角的勾選框:因為畫布上選取了 39 條道路,只有這 39 筆會被計算。

不知道函式名稱時,使用中間欄上方的搜尋框。它會篩選函式樹,並在右側開啟說明文件,包括參數順序與範例。

行政區圖層上的 QGIS Field Calculator 運算式產生器,在函式清單中搜尋 overlay_contains,右側面板顯示 overlay_contains 的語法與參數,預覽傳回 18。
在函式清單中搜尋 overlay_contains。執行計算前,底部的 Preview 就顯示所選行政區內有 18 所學校。

實測運算式手冊

以下每個運算式都於 2026 年 11 月 7 日在 QGIS 3.44.15 中,以我們的班加羅爾 OpenStreetMap 圖層執行(儲存為 EPSG:4326,專案橢球體 WGS 84)。如果你需要自己區域的測試資料,我們的 在 QGIS 下載 OpenStreetMap 資料 教學說明如何乾淨地取得建物、道路與點位。

下方的建物範例輸出來自建物 fid 27、28、30、60 和 62(有地址和樓層數),以及 fid 1、2 和 3(兩者皆無)。

面積、長度、周長與座標

你要的結果可直接貼上的運算式範例實測結果常見錯誤寫法(與結果)
建物面積,單位 m²(橢球體)$area197.35、110.86、141.11、219.71、318.83area($geometry) 傳回 0.0(約 3e-7 平方度),沒有錯誤
建物面積,單位 m²(投影至 UTM 43N)area(transform($geometry, 'EPSG:4326', 'EPSG:32643'))197.60、110.99、141.29、219.98、319.22轉換至 'EPSG:3857'(Web Mercator)在這裡會使面積膨脹 +5.95%
道路長度,單位公尺(橢球體)$length616.34、7.99、1104.32、9.14、72.24length($geometry) 傳回 0.005681、0.000074(度),沒有錯誤
道路長度,單位公尺(投影至 UTM 43N)length(transform($geometry, 'EPSG:4326', 'EPSG:32643'))616.72、7.99、1105.01、9.14、72.29轉換至 'EPSG:3857' 會使道路長度中位數膨脹 +3.03%
建物周長,單位公尺$perimeter56.72、44.97、48.60、61.54、72.69perimeter($geometry) 在 EPSG:4326 圖層上傳回度
多邊形形心 X(東距,公尺)x(centroid(transform($geometry, 'EPSG:4326', 'EPSG:32643')))786714.46、786437.79、786237.28在多邊形上用 $x 會傳回 NULL 且不報錯;x_at($geometry, 0) 傳回第一個節點(77.642744),不是中心
多邊形形心 Y(北距,公尺)y(centroid(transform($geometry, 'EPSG:4326', 'EPSG:32643')))1435359.45、1435116.32、1436699.32圖層為 EPSG:4326 時,y(centroid($geometry)) 傳回度(12.97...)
列號或圖徵 ID@row_number 或 $id1, 2, 3, 4(對話框),fid 27 的 $id 為 27@row_number 在 GUI 對話框中從 1 開始,在 Processing native:fieldcalculator 中從 0 開始

如果把 $area 寫入 Integer 輸出欄位而不是 Decimal number (real)(以 Processing Field calculator 測試),QGIS 會四捨五入到最接近的整數(197.35 變成 197,110.86 變成 111),而不是無條件捨去。

條件分級(CASE WHEN 與 NULL 處理)

你要的結果可直接貼上的運算式範例實測結果常見錯誤寫法(與結果)
依面積分大小等級CASE WHEN $area < 100 THEN 'small' WHEN $area < 250 THEN 'medium' ELSE 'large' ENDmedium、medium、medium、medium、large未測試
以預設整數取代 NULL 樓層數coalesce(to_int("building:levels"), 1)4、4、2、4、3(樓層數為 NULL 時為 1)"building:levels" + 'a' 傳回 '4a',因為 OSM 標籤是以文字字串儲存
高度分級,NULL 另外歸類CASE WHEN to_int("building:levels") IS NULL THEN 'unknown' WHEN to_int("building:levels") <= 2 THEN 'low' WHEN to_int("building:levels") <= 4 THEN 'mid' ELSE 'high' ENDmid、mid、low、mid、mid(fid 1 為 unknown)省略 WHEN ... IS NULL 會讓每一筆空值落入 ELSE,把 7,636 棟沒有樓層資料的建物標成 'high'

文字整理、格式化與日期

你要的結果可直接貼上的運算式範例實測結果常見錯誤寫法(與結果)
安全地合併門牌號碼與街道名concat("addr:housenumber", ' ', "addr:street")'594 12th Main Road'、'83/4 13th Main Road'(兩者皆 NULL 時為 ' ')"addr:housenumber" || ' ' || "addr:street" 只要任一欄為 NULL 就傳回 NULL
去除道路名稱的字尾(Road、Main、Cross)regexp_replace("name", '\\s+(Road|Main|Cross)$', '')'Chinmaya Mission Hospital'、'13th Main'、'12th Main'只用一個反斜線 \s+ 會失敗,顯示 Invalid regular expression '?+(Road|Main|Cross)$'
將 ID 補零至 12 位數lpad(to_string("osm_id"), 12, '0')'000313829229'、'000313835091'未測試
格式化數字以供顯示format_number($area, 1)'197,4'、'110,9'(在逗號地區設定的 Mac 上,3958.7 顯示為 '3 958,7')輸出是依作業系統地區設定格式化的文字(小數逗號與窄不換行空格),之後無法再拿來計算
兩個日期相差的天數day(age(to_date('2026-11-07'), to_date('2019-03-15')))2794只寫 age(...) 會傳回 QgsInterval 物件;to_date('07/11/2026') 會失敗,除非第二個參數傳入 'dd/MM/yyyy'

把文字寫入 GeoPackage 或 Shapefile 時,也要注意輸出欄位長度。我在 Processing 中把 concat("addr:housenumber", ' ', "addr:street") 寫入長度 40 的文字欄位時,整個執行中止且沒有任何輸出,因為有一條道路(" 80 Feet Road(Sir C.V. Raman Hospital Road)")長達 43 個字元。

跨圖層的空間計數、加總與最近距離

這些運算式讓一個圖層查詢專案中的另一個圖層,不必另外執行 QGIS 空間連結。

你要的結果可直接貼上的運算式範例實測結果常見錯誤寫法(與結果)
計算與每個行政區相交的建物數aggregate('buildings', 'count', "osm_id", filter:=intersects($geometry, geometry(@parent)))4、1552、336、3141、79、402、1179、348、1539、139忘了 filter:=... 會讓每個行政區都得到整個圖層的總數(8709),且不報錯
每個行政區的建物總面積(公頃)round(aggregate('buildings', 'sum', $area, filter:=intersects($geometry, geometry(@parent))) / 10000, 3)0.565、20.292、5.605、59.116、1.037、14.094、16.646、7.991、21.39、1.7會加總碰到行政區邊界的完整建物面積,所以跨界建物會在兩個行政區都被計入
計算每個行政區內的學校數array_length(overlay_contains('schools', "osm_id"))0、2、3、18、0、0、7、3、2、0(總計:35)overlay_contains('schools') 不加第二個參數會傳回 true 或 false,不是數量
到最近公車站的距離(公尺)distance(transform($geometry, 'EPSG:4326', 'EPSG:32643'), transform(array_first(overlay_nearest('bus_stops', $geometry)), 'EPSG:4326', 'EPSG:32643'))125.17、49.39、199.59、158.39、187.97、74.67、123.00、226.61distance($geometry, array_first(overlay_nearest('bus_stops', $geometry))) 傳回 0.001142(度)
計算建物 300 公尺內的公車站數aggregate('bus_stops', 'count', "osm_id", filter:=distance(transform($geometry, 'EPSG:4326', 'EPSG:32643'), transform(geometry(@parent), 'EPSG:4326', 'EPSG:32643')) <= 300)1、1、4、2、2、6、7、7array_length(overlay_nearest('bus_stops', $id, max_distance:=300, limit:=-1)) 傳回 37(所有站點),因為 300 被當成 300 度

五個不會報錯的欄位計算機陷阱

我讀了 YouTube 上 QGIS 教學影片底下的 70 則求助留言:其中 48 則是真正關於撰寫運算式的問題,而這 48 則中有 8 則是運算式無效、傳回 NULL 或什麼都沒選到。更糟的情況反而沒人問,因為運算式照常執行,寫入看似合理的數字。以下是我們在班加羅爾資料上量測到的五個陷阱。

1. $area 與 area($geometry),以及專案橢球體的作用

$area 和 area($geometry) 的計算方式不同,而至少有一篇 2026 年的教學說 $area 在地理座標系統中會傳回平方度。在我們測試的兩種專案設定下都不是這樣。2026 年 11 月 7 日,我們在 EPSG:4326 的班加羅爾圖層上,針對前 200 棟建物和 200 條道路量測了這兩者以及 transform(),並以 WGS 84 橢球體為基準(QgsDistanceArea)比較。

  • $area 和 $length 使用專案橢球體(在 Project > Properties > General > Measurements 設定)。當橢球體為 WGS 84 時,即使圖層和專案都是以度為單位(EPSG:4326),$area 仍會傳回準確的平方公尺。
  • 當專案橢球體設為 None / Planimetric 時,$area 在我們的 EPSG:4326 圖層上仍然沒有傳回平方度。在 QGIS 3.44.15 中,它傳回的平方公尺在 200 棟建物上大了 +3.24% 。
  • area($geometry) 和 length($geometry) 永遠是在圖層本身 CRS 中做平面計算。 在 EPSG:4326 圖層上,area($geometry) 傳回平方度(一棟房子約 0.0000003),在一般小數欄位中會四捨五入成 0.0。
  • 在 area() 之前轉換至 Web Mercator(EPSG:3857),每棟建物面積都會膨脹 +5.95%,即使在班加羅爾的緯度(北緯 13°)也一樣,道路長度則膨脹 +3.03%。轉換至當地 UTM 分區(EPSG:32643)則與橢球體面積相差不超過 +0.12% 。
EPSG:4326 圖層上的運算式(n = 200 棟建物、200 條道路)相對 WGS 84 橢球體的誤差中位數最大誤差
$area(專案橢球體 WGS 84)0.00%0.00%
$area(專案橢球體 None)+3.24%+3.25%
$perimeter(專案橢球體 None)+1.72%+2.25%
道路的 $length(專案橢球體 None)+1.31%+2.61%
area($geometry)-100.00%(平方度)-100.00%
道路的 length($geometry)-100.00%(度)-100.00%
area(transform($geometry, 'EPSG:4326', 'EPSG:32643'))+0.12%+0.12%
道路的 length(transform($geometry, 'EPSG:4326', 'EPSG:32643'))+0.06%+0.06%
area(transform($geometry, 'EPSG:4326', 'EPSG:3857'))+5.95%+5.96%
道路的 length(transform($geometry, 'EPSG:4326', 'EPSG:3857'))+3.03%+3.26%

如果你不確定為什麼 EPSG:4326、EPSG:3857 和 UTM 分區的表現差這麼多,請看我們的說明文章 QGIS 中的 CRS 是什麼。

2. overlay_nearest 的 max_distance 以圖層單位計算,不是公尺

overlay_nearest 函式因為使用空間索引而很快,還有方便的 max_distance 參數。但 max_distance 永遠以圖層的座標單位計算。

當建物與公車站都在 EPSG:4326(度)時,寫 array_length(overlay_nearest('bus_stops', $id, max_distance:=300, limit:=-1)) 會讓 QGIS 找 300 度內的公車站。這涵蓋了整個地球,所以每一棟建物都得到 37(圖層中全部 37 個公車站)。把 300 公尺猜成 max_distance:=0.003 也不太行,因為一度經度和一度緯度換算成公尺並不一樣長:在建物 fid 62 上,0.003 傳回 8 個站,而正確答案是 7。要嘛先把兩個圖層都重新投影到 UTM,要嘛使用上方空間表格最後一列的 aggregate(..., filter:=distance(transform(...))) 寫法。

3. NULL 資料會直接落入 CASE WHEN 的 ELSE 分支

在我們的班加羅爾資料集中,8,709 棟建物只有 1,073 棟(12.3%)有 building:levels 標籤。其餘 7,636 棟是 NULL。

如果你寫 CASE WHEN to_int("building:levels") <= 2 THEN 'low' WHEN to_int("building:levels") <= 4 THEN 'mid' ELSE 'high' END,兩個 <= 比較在 NULL 資料上都會得到未知,於是該筆資料落入 ELSE。結果你會在沒有任何警告的情況下,把 7,636 棟沒有樓層資料的建物歸類為高樓。資料有缺漏時,一定要把 WHEN "field" IS NULL THEN 'unknown' 放在第一個分支(或省略 ELSE,讓不符合的資料維持 NULL)。

4. 「Only update selected features」會讓欄位其餘部分維持 NULL

只要地圖畫布上選取了任何一個圖徵,Field Calculator 就會自動勾選 Only update N selected feature(s) 。

我在班加羅爾選取了 39 條 primary 道路,然後把 CASE WHEN "highway" IN ('primary', 'secondary') THEN 'arterial' ELSE 'local' END 寫入新欄位 road_rank,QGIS 對這 39 筆寫入 'arterial',其他 815 條道路(包括運算式明確列出的全部 28 條 secondary 道路)都維持 NULL。

在選取 39 條 primary 道路的情況下執行 Field Calculator 後的 QGIS 道路圖層屬性表:primary 列的 road_rank 為 arterial,secondary 與 residential 列為 NULL,row_n 顯示 @row_number 產生的 1、2、3。
因為開啟對話框時已選取 39 條 primary 道路,即使 CASE 運算式有處理它們,28 條 secondary 道路和 787 條 local 道路仍然是 NULL。

5. 雙引號與單引號(為什麼 "building" = "yes" 傳回 NULL)

在 QGIS 運算式中,雙引號 " " 代表欄位名稱,單引號 ' ' 代表文字值。

如果你輸入 "building" = "yes",QGIS 會找名為 building 的欄位,並拿它和另一個名為 yes 的欄位比較。因為沒有名為 yes 的欄位,運算式會得到 NULL(底層的 QgsExpression 解析器會回報 Field 'yes' not found)。同樣地,如果欄位名稱含有冒號,例如 OpenStreetMap 的 building:levels,少了雙引號就會失敗,顯示 syntax error, unexpected Unknown_CHARACTER。在 Fields and Values 清單中按兩下欄位名稱,每次都會插入正確的引號。

跳過語法:用 AI 代理執行同樣的計算

手寫 $area 很快。但要寫出包含兩個 transform()、一個 @parent 幾何參照和距離篩選條件的巢狀 aggregate(),大家最後往往會跑去 Stack Exchange 求救。

我們開發的 AI Agent 是嵌入 QGIS 的對話面板,所以這一節談的是我們自己的工具。因為它在你開啟的 QGIS 專案中運作,會先檢查你的圖層名稱、欄位型別、CRS 和唯一值,再替你執行 Field Calculator 或 Processing 工具。

2026 年 11 月 7 日,我把測試計畫中三個多步驟計算交給 AI Agent(v1.9.4,Medium effort,Balanced permissions),每個對話一句話,使用完全相同的五個 EPSG:4326 班加羅爾圖層。

任務實際送出的提示詞代理耗時與我們獨立檢查的比對結果
A. 鄰近計數"Add a field called bus_stops_300m to the buildings layer with the number of bus stops within 300 metres of each building."39 秒通過。建立了整數欄位,8,709 棟建物全部填值,與我們在 EPSG:32643 中以建物輪廓到站點計算的數量比對,0 筆不符(範圍 0 到 8)。
B. 分級與樣式"Class the buildings into low (1 or 2 levels), mid (3 or 4) and high (5 or more) from the building:levels field, store the class in a new field called height_class, and style the buildings by that class."18 秒通過。563 棟 low、442 棟 mid、68 棟 high(1,073 棟全部符合我們的規則)。7,636 筆沒有樓層數的資料維持 NULL,並以第四個灰色 "Unknown levels" 類別呈現。
C. 各行政區學校數與建物面積"For each ward, add the number of schools and the total building area in hectares."37 秒通過(方法不同)。school_count 在 10/10 個行政區相符(總計 35)。building_ha 在 10/10 個行政區與裁切後的建物面積相符(總計 148.25 公頃)。

在任務 A 中,代理沒有掉進 300 度的 overlay_nearest 陷阱。它的工具紀錄顯示,它檢查了兩個圖層、確認 CRS、以公制單位從建物輪廓計算(不是用形心,用形心的話會有 667 棟建物的答案不同),並在回答前核對最小值與最大值。

QGIS 中的 AI Agent 面板,為 8,709 棟班加羅爾建物新增 bus_stops_300m 欄位後,回報數量介於 0 到 8 且無缺值,並註明是從每棟建物輪廓到 37 個站點的直線距離。
AI Agent 中的任務 A:39 秒完成 8,709 棟建物的 300 公尺公車站計數,在 EPSG:4326 專案中沒有掉進度數陷阱。

在任務 B 中,它先檢查 building:levels 的唯一值,發現 8,709 棟建物中有 7,636 棟沒有樓層數,於是讓這些資料在 height_class 中維持 NULL,而不是落入 high,並在地圖上套用 4 個類別的分類樣式。

AI Agent 面板與 QGIS 圖層面板,顯示 height_class 欄位分為 low、mid、high 和 Unknown levels,回答中列出 563 棟 low、442 棟 mid、68 棟 high 和 7,636 棟 unknown。
任務 B:代理先檢查欄位,讓 7,636 棟沒有樓層資料的建物不落入 ELSE 分支,並為四個群組都設定樣式。

看渲染出來的地圖,就能明白為什麼在 OpenStreetMap 資料上檢查 NULL 很重要:灰色建物就是那 87.7% 沒有記錄 building:levels 標籤的建物。

班加羅爾 Indiranagar 中心區的 QGIS 渲染地圖,建物以淺黃色代表 low、橘色代表 mid、深紅色代表 high、灰色代表樓層未知,疊加道路與代表公車站的黑點。
依 height_class 設定樣式的 Indiranagar 中心區:563 棟 low(黃)、442 棟 mid(橘)、68 棟 high(紅),以及 7,636 棟在 OSM 中沒有樓層標籤(灰)。

在任務 C 中,代理的 building_ha 數字與手冊中每個行政區公頃數那一列略有不同:New Thippasandra 為 20.151 ha,而不是 20.292 ha(-0.69%),Jeevan Bhimanagar 為 -0.14%,Indiranagar 為 -0.06%。我查了原因,發現代理其實用了比我的 intersects() 篩選更嚴格的幾何方法:它先在行政區邊界裁切建物多邊形再加總面積,所以跨界的建物不會在兩個行政區重複計算,它也在回覆中說明了這點。它確實讓行政區圖層停留在編輯模式且有未提交的編輯,並在回答中告訴我編輯尚未儲存。

QGIS 中的 AI Agent 面板,回報 10 個班加羅爾行政區各自的 school_count 和 building_ha,並註明建物輪廓已依行政區邊界裁切,編輯尚未儲存。
任務 C:代理在加總公頃數前,先依行政區邊界裁切跨界建物,並註明圖層編輯仍未提交。

以下是提交那些編輯後的行政區圖層屬性表:

10 個班加羅爾行政區的 QGIS 屬性表,顯示新增的 school_count 整數欄位和 building_ha 小數欄位,旁邊是 Domlur、Indiranagar、New Thippasandra 和 Ulsoor 等行政區名稱。
新增了 school_count(總計 35)和 building_ha(總計 148.25 公頃)的 10 個行政區。

三個任務是很小的樣本(n = 3),而且我給的提示詞很清楚,寫明了欄位和分級界限,所以請把這當成示範,而不是基準測試。像 $area 或 concat() 這種簡單公式,用 Field Calculator 對話框比打一則對話訊息還快。代理真正有價值的地方,是需要跨圖層彙總、CRS 轉換或多步驟 Processing 流程,或你原本得寫 PyQGIS 腳本 的時候。你也可以在我們的 QGIS AI 總覽 比較其他助理工具。

我們的量測方式。 所有測試於 2026 年 11 月 7 日在 macOS 上的 QGIS 3.44.15-Solothurn 中進行,使用班加羅爾 Indiranagar 的 OpenStreetMap 資料(邊界框 12.968, 77.634, 12.986, 77.656,ODbL),專案 CRS 為 EPSG:4326。手冊中的每個運算式都在相同的圖徵 ID 上,以獨立的 Python 或 QgsDistanceArea 計算驗證。面積與長度誤差是依 fid 取前 200 棟建物和 200 條道路,對照使用 WGS 84 橢球體(EPSG:7030)的 QgsDistanceArea 量測。AI Agent 1.9.4 以 Medium effort 和 Balanced permissions 測試,每個任務都在新的對話中進行。YouTube 問題統計來自一個 25,276 則留言的語料庫,從中篩出 59 部影片底下的 70 則求助留言。

常見問題

為什麼我在 QGIS 中的 $area 計算錯誤或傳回 0?

先檢查你是不是輸入了 area($geometry) 而不是 $area。在以度儲存的圖層上(EPSG:4326),area($geometry) 傳回平方度(一棟房子約 0.0000003),在小數欄位中會四捨五入成 0.0。請使用 $area,並在 Project > Properties > General > Measurements 將專案橢球體設為 WGS 84,或在運算式中用 area(transform($geometry, 'EPSG:4326', 'EPSG:32643')) 搭配你當地的 UTM 分區重新投影幾何。避免使用 EPSG:3857(Web Mercator),在我們的測試中,即使在北緯 13° 它也讓建物面積膨脹了 +5.95%。

如何在 QGIS 欄位計算機中寫 IF 或 CASE 條件式?

兩種結果時,使用 if(condition, value_if_true, value_if_false),例如 if($area < 100, 'small', 'large')。三個以上的類別,使用 CASE WHEN ... THEN ... ELSE ... END:

CASE WHEN to_int("building:levels") IS NULL THEN 'unknown' WHEN to_int("building:levels") <= 2 THEN 'low' WHEN to_int("building:levels") <= 4 THEN 'mid' ELSE 'high' END

把 IS NULL 檢查放在第一個。否則每一筆空值都會落入 ELSE。

為什麼欄位計算機在全部或大部分資料列傳回 NULL?

四個常見原因:

  1. 地圖上選取了圖徵,所以 Only update N selected feature(s) 被勾選,所有未選取的資料列都維持 NULL。
  2. 你用 || 串接文字(例如 "addr:housenumber" || ' ' || "addr:street"),只要有一個 NULL 輸入,整個結果就變成 NULL。請改用 concat()。
  3. 你在文字值外面加了雙引號("building" = "yes"),這會讓 QGIS 去找名為 yes 的欄位。文字值請用單引號("building" = 'yes')。
  4. 你在多邊形或線圖層上使用 $x 或 $y。$x 只適用於點;多邊形請用 x(centroid($geometry))。

如何在 QGIS 欄位計算機中計算以公頃為單位的面積?

將 Output field type 設為 Decimal number (real),Precision 設為 2 或 3,然後輸入 $area / 10000(前提是專案面積單位為平方公尺,且已在 Project > Properties > General 設定專案橢球體)。若要讓儲存的值本身四捨五入到小數點後 3 位,使用 round($area / 10000, 3)。

如何在欄位計算機中只更新選取的圖徵?

先在地圖畫布或屬性表中選取圖徵,再開啟 Field Calculator(Ctrl+I)。左上角的 Only update N selected feature(s) 勾選框會自動勾選。選擇 Update existing field,從下拉選單挑選欄位,輸入運算式後按 OK。

免費試用 AI Agent

在 QGIS 裡開口就能完成

AI Agent 會在你自己的 QGIS 專案中,執行你描述的任務。免費使用,不需信用卡。

免費試用 AI Agent
由以下作者撰寫Yvann Barbot
·9 min read