使用自訂的 Python 表達式函數

警告

本教學已有新的版本,請前往 使用自訂的 Python 表達式函數 (QGIS3)

QGIS 表達式非常的強大,而且也使用在許多核心操作上,像是選取、計算影像值、樣式設定、標記等等。QGIS 也支援使用者自定義的表達式,只要使用一點點的 Python 程式,就可以設計自己的函數,然後把它安插到 QGIS 表達式的引擎中。

內容說明

我們要定義一個函數,它可以找出地圖的 UTM 分區。然後我們要使用這個函數設計表達式,讓使用者滑鼠在圖徵上移動的時候,可以顯示出此處的 UTM 分區。

你還會學到這些

  • 使用 地圖提示(Map Tips) 工具,在滑鼠游移在某圖徵上時顯示自訂的文字。

取得資料

我們要使用 Natural Earth 的 人口居住地 資料庫,請下載 `簡化版 (欄位較少) 的資料庫<http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_populated_places_simple.zip>`_

為了方便起見,你也可以直接用下面的連結下載:

ne_10m_populated_places_simple.zip

操作流程

  1. 打開 QGIS,選擇 圖層 ‣ 加入圖層 ‣ 加入向量圖層

../_images/1176.png
  1. 選擇剛下載的 ne_10m_populated_places_simple.zip 並按下 確定

../_images/2145.png
  1. 選擇 檢視 ‣ 選取 ‣ 使用表示式選取…

../_images/386.png
  1. 切換至 函數編輯器 分頁,這裡你可以撰寫用於在表示式引擎中執行的 PyQGIS 程式碼。

../_images/453.png
  1. 由於 QGIS 中的自訂函數作用在圖徵層級,所以我們可以定義一個稱為 GetUtmZone 的函數,用來計算每個圖徵的 UTM 分區號碼。我們使用每個圖徵的中心經緯度座標來計算 UTM 分區號碼,並且會加上 『N』 或 『S』 來標明此區是位在北半球還是南半球。在編輯器中輸入以下程式碼,把檔案取名為 utm_zones.py,然後按下 儲存檔案

備註

UTM 是依照經度把全球投影成 1 到 60 區,每個 UTM 分區都是經度 6 度寬。這裡我們使用的是簡單的數學公式,依照經度的數值來尋找適當的 UTM 分區,所以請注意這個公式並不處理一些比較特殊的 UTM 分區。

import math
from qgis.core import *
from qgis.gui import *

@qgsfunction(args=0, group='Custom', usesgeometry=True)
def GetUtmZone(value1, feature, parent):
    centroid = feature.geometry()
    longitude = centroid.asPoint().x()
    latitude = centroid.asPoint().y()
    zone_number = math.floor(((longitude + 180) / 6) % 60) + 1

    if latitude >= 0:
        zone_letter = 'N'
    else:
        zone_letter = 'S'

    return '%d%s' % (int(zone_number), zone_letter)
../_images/546.png
  1. 按下 執行腳本後程式碼會被執行,GetUtmZone 函數會被註冊到表達式引擎中。這個步驟只須執行一次,當函數註冊完畢後,就會一直在表達式引擎中出現。

../_images/644.png
  1. 切換到 表示式 分頁,在 Select by expression 視窗中,可看到在 函數列表 的區塊中有個 Custom 群組,其中會出現一個新的函數 GetUtmZone,這代表我們現在可以像使用其他函數一樣使用這個函數了。在文字編輯器中輸入以下表達式,就可以選擇所有落在 40N 的 UTM 分區中的點。按下 選取。(譯按:隨著 QGIS 版本的不同,你可能會看到 $GetUtmZoneGetUtmZone(),但都是一樣的操作方法。)

$GetUtmZone = '40N'
../_images/744.png
  1. 回到 QGIS 主視窗,現在有許多點都被選取並標為黃色,這些就是符合我們給定的 UTM 分區表達式的點。

../_images/843.png
  1. 現在你已經知道我們要怎麼利用自訂表達式選取圖徵,接下來我們要使用同一個函數做另一件事。在 QGIS 中有個隱藏的神器稱為 地圖提示 工具,它會在你把滑鼠移到圖徵上時顯示使用者定義的文字。請在 ne_10m_populated_places_simple 圖層上按右鍵然後選擇 屬性

../_images/944.png
  1. 切換至 顯示 分頁,然後選擇 HTML。在這裡你可以輸入任何你想在圖徵上出現的文字,不過更好的做法是我們可以利用圖層屬性值或是表達式來指定更有用的訊息。按下 插入表達式 鈕。

../_images/1051.png
  1. 你會再次看到熟悉的表達式編輯器。我們要利用 concat 函數來連接 name 屬性和 GetUtmZone 函數的輸出字串,因此輸入以下的表達式後,按下 確定

concat("name", ' | UTM Zone: ', $GetUtmZone)
../_images/1177.png
  1. 顯示 分頁中的文字訊息內就會看到我們剛剛輸入的表達式。按下 確定

../_images/1253.png
  1. 在測試之前,要先取消我們在前幾個步驟選取的點。選擇 檢視 ‣ 選取 ‣ 取消所有圖層的圖徵選取

../_images/1351.png
  1. 選擇 檢視 ‣ 地圖提示工具 以啟動 地圖提示 功能。

../_images/1448.png
  1. 縮放至地圖的任一處然後把滑鼠游標放在任何圖徵上,你就會看到城市的名字和對應的 UTM 分區顯示在地圖提示之中。

../_images/1544.png

If you want to give feedback or share your experience with this tutorial, please comment below. (requires GitHub account)