50_在 QGIS3 中使用自定义 Python 表达式函数
原文链接: https://www.qgistutorials.com/en/docs/3/custom_python_functions.html
使用自定义 Python 表达式函数 (QGIS3)¶
QGIS 中的表达式功能非常强大,并在许多核心功能中使用:选择、计算字段值、样式设置、标注等。QGIS 还支持用户自定义表达式。通过一点 Python 编程,你就可以定义自己的函数,这些函数可以在表达式引擎中使用。
任务概述¶
我们将定义一个自定义函数,用于查找地图要素的 UTM 分带编号,并使用该函数编写一个表达式,当鼠标悬停在点上时,将 UTM 分带显示为地图提示。
你将学到的其他技能¶
- 如何使用
地图提示工具在悬停于要素上时显示自定义文本。
获取数据¶
我们将使用 Natural Earth 的 人口居住点 数据集。下载 简易版(字段较少)数据集
操作步骤¶
- 在 QGIS 浏览器中找到
ne_10m_populated_places_simple.zip文件并展开它。选择ne_10m_populated_places_simple.shp文件并将其拖到画布上。
- 转到 编辑 ‣ 选择 ‣ 按表达式选择要素… 或点击属性工具栏上的 使用表达式选择要素 按钮。
- 在“按表达式选择”对话框中,切换到 函数编辑器 选项卡。在这里,你可以编写任何将由表达式引擎执行的 PyQGIS 代码。
- 我们将定义一个名为
GetUtmZone的自定义函数,用于计算每个要素的 UTM 分带编号。由于 QGIS 中的自定义函数在要素级别工作。我们将使用要素几何图形的质心,并根据质心几何图形的经纬度计算 UTM 分带。我们还会在分带号后添加‘N’或‘S’标识,以指示该分带位于北半球还是南半球。点击屏幕左下角的 + 按钮,输入utm_zones.py作为文件名。你可以点击底部面板中的“帮助”标签来关闭它并展开代码面板。
- UTM 分带是纵向投影带,编号从 1 到 60。每个 UTM 分带宽 6 度。这里我们使用一个简单的数学公式来查找给定经度值对应的分带。此公式适用于除少数 特殊 UTM 分带 之外的所有情况。在编辑窗口中键入以下代码。完成后,点击 保存并加载函数。
```bash import math from qgis.core import * from qgis.gui import *
@qgsfunction(args=0, group='Custom', usesgeometry=True) def GetUtmZone(value1, feature, parent): """Return the UTM Zone of the feature's geometry as a string""" centroid = feature.geometry().centroid() if centroid: 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)else: return None ```
注意
目前无法从图形用户界面删除表达式文件。如果你希望删除 utm_zone.py 文件,可以转到 设置 ‣ 用户配置文件 ‣ 打开活动配置文件文件夹,并从 python ‣ expressions 文件夹中删除该文件。
- 在“按表达式选择”对话框中切换到 表达式 选项卡。在函数部分找到并展开 自定义 组。你会在列表中注意到一个新的自定义函数
GetUtmZone。我们现在可以在表达式中像使用任何其他函数一样使用此函数。在编辑器中键入以下表达式。该表达式将选择所有落在 UTM 分带33N中的点。点击 缩放到要素,地图将发生变化,如果你点击 选择要素,应该会看到 UTM 33N 分带中的点变为黄色。
bash GetUtmZone() = '33N'
注意
由于一个错误,此功能在早期 QGIS 3 版本中无法使用。从 3.4.5 版本开始已经修复。
- 回到 QGIS 主窗口,你应该看到一些以黄色高亮显示的点。这些是落在表达式中指定的 UTM 分带中的点。
8. 你看到了我们如何定义并使用自定义函数来按表达式选择要素。现在我们将在另一个上下文中使用相同的函数。QGIS 中的一个隐藏宝藏是 地图提示 工具。当你在要素上悬停时,此工具会显示用户定义的文本。右键点击
ne_10m_populated_places_simple图层并选择 属性。
9. 切换到 显示 选项卡。在这里,你可以输入任何文本,当你在该图层的要素上悬停时将显示该文本。更好的方法是,你可以使用图层字段值和表达式来定义更有用的信息。点击 Ɛ 按钮。
10. 你会再次看到熟悉的表达式编辑器。我们将使用 concat 函数来连接 name 字段的值和我们的自定义函数 GetUtmZone 的结果。输入以下表达式并点击 确定。
```bash
concat("name",' | UTM Zone: ', GetUtmZone())
```

-
你会看到表达式已作为“显示文本”的值输入。点击 插入 将其添加到 HTML 框中,然后按 确定。
12. 在进行下一步之前,让我们取消上一步中选择的要素。转到 编辑 ‣ 选择 ‣ 取消选择所有图层的要素 或点击属性工具栏上的 取消选择所有图层的要素 按钮。
13. 通过转到 视图 ‣ 地图提示 或点击属性工具栏上的 显示地图提示 按钮来激活 地图提示工具。
14. 放大到地图的任何区域,并将鼠标光标悬停在任意要素上。你将看到城市名称和相应的 UTM 分带作为地图提示显示出来。
如果你想反馈或分享你学习本教程的体验,请在下方评论。(需要 GitHub 账户)






8. 你看到了我们如何定义并使用自定义函数来按表达式选择要素。现在我们将在另一个上下文中使用相同的函数。QGIS 中的一个隐藏宝藏是 地图提示 工具。当你在要素上悬停时,此工具会显示用户定义的文本。右键点击