在地理信息科學(xué)的世界里,QGIS 以其開(kāi)源、強(qiáng)大和靈活的特性,成為了無(wú)數(shù)GIS專業(yè)人士和愛(ài)好者的首選工具。然而,要真正駕馭 QGIS 并將其效能發(fā)揮到極致,僅僅掌握?qǐng)D形用戶界面的點(diǎn)擊操作是遠(yuǎn)遠(yuǎn)不夠的。今天,我們將深入探討 QGIS 中一個(gè)堪稱“瑞士軍刀”的功能——表達(dá)式(Expressions)。
無(wú)論您是希望自動(dòng)化數(shù)據(jù)處理、創(chuàng)建動(dòng)態(tài)的地圖符號(hào)系統(tǒng),還是構(gòu)建智能化的打印布局,表達(dá)式都將是您不可或缺的利器。

什么是 QGIS 表達(dá)式?
簡(jiǎn)單來(lái)說(shuō),QGIS 表達(dá)式是一種微型編程語(yǔ)言,它允許您通過(guò)編寫(xiě)公式來(lái)訪問(wèn)和處理數(shù)據(jù)。這些公式可以執(zhí)行數(shù)學(xué)計(jì)算、操作文本、評(píng)估地理空間關(guān)系,并根據(jù)特定條件返回動(dòng)態(tài)結(jié)果。
表達(dá)式的應(yīng)用場(chǎng)景幾乎貫穿了 QGIS 的每一個(gè)角落:
- 數(shù)據(jù)計(jì)算:使用字段計(jì)算器根據(jù)現(xiàn)有屬性動(dòng)態(tài)創(chuàng)建或更新字段。
- 要素選擇:構(gòu)建復(fù)雜的查詢邏輯,精確選擇符合多重條件的要素。
- 動(dòng)態(tài)樣式與標(biāo)注:根據(jù)要素的屬性值(如人口數(shù)量、道路等級(jí))自動(dòng)改變其顏色、大小或標(biāo)簽內(nèi)容,讓地圖“活”起來(lái)。
- 幾何生成:在不創(chuàng)建新圖層的情況下,動(dòng)態(tài)生成緩沖區(qū)、質(zhì)心等幾何圖形用于渲染。
- 打印布局自動(dòng)化:自動(dòng)更新標(biāo)題、比例尺、圖例等,甚至根據(jù)地圖集要素動(dòng)態(tài)顯示信息。
- 表單約束:在數(shù)據(jù)采集時(shí),設(shè)置字段的默認(rèn)值或驗(yàn)證規(guī)則,確保數(shù)據(jù)質(zhì)量。
核心工具:表達(dá)式字符串構(gòu)建器
QGIS 提供了一個(gè)強(qiáng)大的集成界面——表達(dá)式字符串構(gòu)建器,來(lái)幫助我們編寫(xiě)和測(cè)試表達(dá)式。這不僅僅是一個(gè)簡(jiǎn)單的文本框,更是一個(gè)功能完備的開(kāi)發(fā)環(huán)境。
它主要由以下幾個(gè)部分組成:
- 表達(dá)式編輯區(qū):您編寫(xiě)公式的地方,支持語(yǔ)法高亮和自動(dòng)補(bǔ)全。
- 函數(shù)列表區(qū):一個(gè)龐大的函數(shù)庫(kù),按類(lèi)別(如幾何、字符串、數(shù)學(xué))整齊排列。您可以搜索并雙擊將函數(shù)添加到編輯器中。
- 幫助面板:當(dāng)您選中一個(gè)函數(shù)時(shí),這里會(huì)立即顯示其詳細(xì)說(shuō)明、語(yǔ)法和使用示例,是學(xué)習(xí)和調(diào)試的最佳幫手。
- 預(yù)覽區(qū):實(shí)時(shí)顯示當(dāng)前表達(dá)式在某個(gè)要素上的計(jì)算結(jié)果,讓您能夠立即驗(yàn)證公式的正確性。
表達(dá)式函數(shù)巡禮:從入門(mén)到精通
QGIS 提供了數(shù)百個(gè)內(nèi)置函數(shù)。我們不必一次性記住所有,但了解幾個(gè)關(guān)鍵類(lèi)別及其代表性函數(shù),將極大地拓寬您的數(shù)據(jù)處理思路。
1. 幾何函數(shù) (Geometry Functions)
這是GIS的核心。幾何函數(shù)允許您查詢、計(jì)算和操作要素的空間屬性。
-
$geometry:返回當(dāng)前要素的幾何對(duì)象本身。 -
$area:計(jì)算多邊形要素的面積。 -
length():計(jì)算線要素的長(zhǎng)度。 -
buffer($geometry, 100):為當(dāng)前要素創(chuàng)建一個(gè)100地圖單位的緩沖區(qū)。 -
intersection(geom1, geom2):返回兩個(gè)幾何對(duì)象的交集部分。 -
transform($geometry, 'EPSG:4326', 'EPSG:3857'):動(dòng)態(tài)進(jìn)行坐標(biāo)參考系變換。
實(shí)戰(zhàn)示例:假設(shè)您想為一個(gè)“河流”圖層設(shè)置樣式,使其寬度與河流等級(jí)("level"字段)成正比,您可以在符號(hào)系統(tǒng)設(shè)置中使用表達(dá)式:"level" * 5。
2. 條件函數(shù) (Conditional Functions)
條件函數(shù)讓您的邏輯充滿智慧,能夠根據(jù)不同情況返回不同結(jié)果。
-
CASE ... WHEN ... THEN ... ELSE ... END:這是最強(qiáng)大、最常用的條件語(yǔ)句,用于處理多個(gè)分支邏輯。 -
if(condition, result_if_true, result_if_false):簡(jiǎn)單的二元條件判斷。 -
coalesce(value1, value2, ...):返回參數(shù)列表中的第一個(gè)非空(non-NULL)值,非常適合為缺失數(shù)據(jù)提供默認(rèn)值。
實(shí)戰(zhàn)示例:為城市點(diǎn)圖層創(chuàng)建標(biāo)注,根據(jù)人口("POP"字段)分為三類(lèi):
CASE
WHEN "POP" > 1000000 THEN '特大城市'
WHEN "POP" > 500000 THEN '大城市'
ELSE '中小型城市'
END
3. 字符串函數(shù) (String Functions)
處理文本屬性是家常便飯。字符串函數(shù)可以幫助您拼接、格式化和提取文本信息。
-
concat('名稱: ', "NAME")或更簡(jiǎn)潔的'名稱: ' || "NAME":連接字符串,創(chuàng)建復(fù)合標(biāo)簽。 -
format_number(12345.67, 2):將數(shù)字格式化為帶千位分隔符和兩位小數(shù)的字符串('12,345.67')。 -
regexp_replace('QGIS 3.44', '\\d+\\.\\d+', 'LTS'):使用正則表達(dá)式進(jìn)行高級(jí)替換,結(jié)果為'QGIS LTS'。 -
upper()/lower():將文本轉(zhuǎn)換為大寫(xiě)或小寫(xiě)。
實(shí)戰(zhàn)示例:創(chuàng)建一個(gè)包含名稱和面積的詳細(xì)標(biāo)注:
"NAME" || '\n' || '面積: ' || format_number(round($area / 1000000, 2), 2) || ' km2'
這個(gè)表達(dá)式將顯示城市名稱,換行后顯示格式化后的平方千米面積。
4. 聚合函數(shù) (Aggregates Functions)
聚合函數(shù)允許您對(duì)一組要素(通常來(lái)自另一個(gè)圖層)進(jìn)行統(tǒng)計(jì)計(jì)算,這是進(jìn)行空間關(guān)聯(lián)分析的利器。
-
aggregate(layer, aggregate, expression, filter):最核心的聚合函數(shù)。 -
sum(expression)、count(expression)、mean(expression):在聚合函數(shù)內(nèi)部使用的具體統(tǒng)計(jì)方法。
實(shí)戰(zhàn)示例:計(jì)算每個(gè)“省”圖層內(nèi),所有“城市”圖層的人口總和。在“省”圖層的字段計(jì)算器中創(chuàng)建一個(gè)新字段 total_pop,使用以下表達(dá)式:
aggregate(
layer:='城市',
aggregate:='sum',
expression:="population",
filter:=intersects($geometry, geometry(@parent))
)
這個(gè)表達(dá)式會(huì)遍歷所有與當(dāng)前省份多邊形相交的城市點(diǎn),并將其"population"字段的值累加起來(lái)。
5. 變量 (Variables)
變量提供了對(duì)QGIS工程、圖層、地圖布局等環(huán)境信息的動(dòng)態(tài)訪問(wèn)。它們都以 @ 符號(hào)開(kāi)頭。
-
@project_crs:返回當(dāng)前工程的坐標(biāo)參考系。 -
@layer_name:返回當(dāng)前表達(dá)式所在圖層的名稱。 -
@map_scale/@map_rotation:在打印布局中,動(dòng)態(tài)獲取當(dāng)前地圖項(xiàng)的比例尺和旋轉(zhuǎn)角度。 -
@user_full_name:獲取當(dāng)前用戶的全名,用于制圖信息的自動(dòng)署名。
更上一層樓:創(chuàng)建自定義函數(shù)
當(dāng)內(nèi)置函數(shù)無(wú)法滿足您獨(dú)特的、復(fù)雜的計(jì)算需求時(shí),QGIS 允許您使用 Python 編寫(xiě)自己的自定義函數(shù)。通過(guò)菜單欄的 視圖 -> 面板 -> 函數(shù)編輯器,您可以定義一個(gè)函數(shù),它將自動(dòng)出現(xiàn)在表達(dá)式構(gòu)建器的 "Custom" 組中。
例如,創(chuàng)建一個(gè)計(jì)算兩數(shù)之和的簡(jiǎn)單函數(shù):
from qgis.core import *
from qgis.gui import *
@qgsfunction(args='auto', group='Custom')
def my_sum(value1, value2, feature, parent):
"""計(jì)算兩個(gè)值的和"""
return value1 + value2
保存后,您就可以在任何表達(dá)式中像使用內(nèi)置函數(shù)一樣調(diào)用 my_sum(field1, field2)。
結(jié)論
QGIS 表達(dá)式是連接數(shù)據(jù)和地圖可視化之間的強(qiáng)大橋梁,是提升工作效率、實(shí)現(xiàn)高級(jí)地圖制圖和分析自動(dòng)化的關(guān)鍵技能。它將靜態(tài)的數(shù)據(jù)屬性轉(zhuǎn)變?yōu)閯?dòng)態(tài)的、有意義的地理信息。
初看起來(lái),函數(shù)列表可能令人望而生畏,但請(qǐng)記?。?/p>
- 從實(shí)踐開(kāi)始:從一個(gè)簡(jiǎn)單的需求入手,如創(chuàng)建一個(gè)復(fù)合標(biāo)注。
- 善用幫助:表達(dá)式構(gòu)建器中的幫助面板是您最好的老師。
- 不斷探索:當(dāng)您遇到一個(gè)重復(fù)性的手動(dòng)任務(wù)時(shí),問(wèn)問(wèn)自己:“我能用表達(dá)式來(lái)解決它嗎?”
現(xiàn)在就打開(kāi) QGIS,調(diào)出表達(dá)式構(gòu)建器,開(kāi)始你的探索之旅吧。