QGIS的真正潛力:表達(dá)式深度解析與實(shí)戰(zhàn)技巧

在地理信息科學(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è)部分組成:

  1. 表達(dá)式編輯區(qū):您編寫(xiě)公式的地方,支持語(yǔ)法高亮和自動(dòng)補(bǔ)全。
  2. 函數(shù)列表區(qū):一個(gè)龐大的函數(shù)庫(kù),按類(lèi)別(如幾何、字符串、數(shù)學(xué))整齊排列。您可以搜索并雙擊將函數(shù)添加到編輯器中。
  3. 幫助面板:當(dāng)您選中一個(gè)函數(shù)時(shí),這里會(huì)立即顯示其詳細(xì)說(shuō)明、語(yǔ)法和使用示例,是學(xué)習(xí)和調(diào)試的最佳幫手。
  4. 預(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>

  1. 從實(shí)踐開(kāi)始:從一個(gè)簡(jiǎn)單的需求入手,如創(chuàng)建一個(gè)復(fù)合標(biāo)注。
  2. 善用幫助:表達(dá)式構(gòu)建器中的幫助面板是您最好的老師。
  3. 不斷探索:當(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)始你的探索之旅吧。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • """1.個(gè)性化消息: 將用戶的姓名存到一個(gè)變量中,并向該用戶顯示一條消息。顯示的消息應(yīng)非常簡(jiǎn)單,如“Hello ...
    她即我命閱讀 5,856評(píng)論 0 6
  • 1、expected an indented block 冒號(hào)后面是要寫(xiě)上一定的內(nèi)容的(新手容易遺忘這一點(diǎn)); 縮...
    庵下桃花仙閱讀 1,159評(píng)論 1 2
  • 一、工具箱(多種工具共用一個(gè)快捷鍵的可同時(shí)按【Shift】加此快捷鍵選取)矩形、橢圓選框工具 【M】移動(dòng)工具 【V...
    墨雅丫閱讀 1,827評(píng)論 0 0
  • 跟隨樊老師和伙伴們一起學(xué)習(xí)心理知識(shí)提升自已,已經(jīng)有三個(gè)月有余了,這一段時(shí)間因?yàn)樘鞖獾脑蛐菡n,順便整理一下之前學(xué)習(xí)...
    學(xué)習(xí)思考行動(dòng)閱讀 1,191評(píng)論 0 2
  • 一臉憤怒的她躺在了床上,好幾次甩開(kāi)了他抱過(guò)來(lái)的雙手,到最后還堅(jiān)決的翻了個(gè)身,只留給他一個(gè)冷漠的背影。 多次嘗試抱她...
    海邊的藍(lán)兔子閱讀 1,084評(píng)論 1 4

友情鏈接更多精彩內(nèi)容