Python自定義 表達式

[QGIS教學系列]如何用Python編寫自定義的QGIS-Expression

關鍵字: #WebGIS #GIS #QGIS #QGIS2WEB #Plugins

[QGIS教學系列]如何用Python編寫自定義的QGIS-Expression

[QGIS教學系列-利用Python自製QGIS的expression]

今天的教學內容屬於屬型資料操作的進階應用,對於基礎操作有興趣的可以參考以下文章

QGIS提供了各種不同的內建表達式(expression)功能,可以用來進行數據過濾、計算、轉換等操作。QGIS內置了許多常用的expression函數,,Expression使用方法類似於SQL的語言,可以使用各種運算符、函數和變量來構建複雜的邏輯表達涵蓋了數學、字符串、日期、幾何、統計等方面。但是有時候,我們可能需要實現一些特定的邏輯或功能,而內置的函數不能滿足我們的需求。這時候,我們就可以利用Python自製QGIS的expression函數。

expression可以在QGIS的多個地方使用,例如:

  • 屬性表中的選擇、計算、更新等操作
  • 圖層屬性中的符號化、分類、標籤等設置
  • 圖層過濾器中的數據篩選
  • 圖層間的關聯和聯合查詢
  • 圖層計算器中的空間分析
  • 模型設計器中的參數傳遞和控制流

1. 功能介紹

要利用Python自製QGIS的expression函數,我們需要遵循以下幾個步驟:

  1. 打開QGIS,點擊任意一個圖層,進入屬性編輯頁面(F6)
  2. 打開Field Calculator->點擊Function Editor進入編輯頁面
  3. 在編輯器中,編寫自訂功能表達式

2. 範例練習

這邊示範當初製作以下娃娃機地圖時,要針對欄位進行日期格式化所編寫的表達式。

2.1 打開QGIS,點擊任意一個圖層,進入屬性編輯頁面(F6)

首先這是夾娃娃機圖層的屬性資料,其中「設立日期」的資料型態為(Qstring),而我因為要製作時序動畫因此需要將欄位型態轉換成時間(Date&Time),但QGIS進行轉換時對於時間格式有一定的要求,其格式必須為:YYYY/MM/DD。

因此必須對月份以及日期進行向左補0成為兩位數。

屬性資料

2.2 打開Field Calculator->點擊Function Editor進入編輯頁面

這時候可以點擊上方的算盤圖案進入Field Calculator,並在下方表達式欄位切換到Function Editor

Expression
Function Editor編輯頁面

2.3 在編輯器中,編寫自訂功能表達式

接著我們輸入以下的程式碼,這邊會簡單註記說明每段程式碼的作用

from qgis.core import * #載入QGIS內建的相關模組,主要是要引入Qgsfunction
from qgis.gui import * #同上

@qgsfunction(args='auto', group='Custom', usesgeometry=True) #@qgsfunction為固定行輸入,其中
,"args:指定參數數量" "group:該段表達式會被放在哪個頁面" "usesgeometry:是否會用到空間屬性(以下程式碼實際上沒用到)"
##「設立日期」的數據將被當作參數丟進去函式當中,因此要針對其設計轉換函數 ex:2021/7/9 -> 2021/07/07
def Date_formate_convert(value,feature,parent): 
    time=value.split('/')#先根據'/'將資料進行分隔 2021/7/9->[2021,7,9]
    time=[time[0]]+[i.zfill(2) for i in time[1:]] #zill函數可以針對數據進行補0 7.zfill(2)->07
    formate_time=f'{time[0]}/{time[1]}/{time[2]}' #將補0後的數據合併成日期格式
    return formate_time

2.4 Expression進行自訂函式運用

完成定義後,可以切換頁面到Expression,這時候可以在”Custom”找到我們編寫的表達式,並實際進行操作看看轉換成果!

使用自訂義的函數
使用自訂義的函數
成果新增轉換後的欄位
成果新增轉換後的欄位
分享