跳转至

50_在 QGIS3 中使用自定义 Python 表达式函数

原文链接: https://www.qgistutorials.com/en/docs/3/custom_python_functions.html

使用自定义 Python 表达式函数 (QGIS3)

QGIS 中的表达式功能非常强大,并在许多核心功能中使用:选择、计算字段值、样式设置、标注等。QGIS 还支持用户自定义表达式。通过一点 Python 编程,你就可以定义自己的函数,这些函数可以在表达式引擎中使用。

任务概述

我们将定义一个自定义函数,用于查找地图要素的 UTM 分带编号,并使用该函数编写一个表达式,当鼠标悬停在点上时,将 UTM 分带显示为地图提示。

你将学到的其他技能

  • 如何使用 地图提示 工具在悬停于要素上时显示自定义文本。

获取数据

我们将使用 Natural Earth 的 人口居住点 数据集。下载 简易版(字段较少)数据集

操作步骤

  1. 在 QGIS 浏览器中找到 ne_10m_populated_places_simple.zip 文件并展开它。选择 ne_10m_populated_places_simple.shp 文件并将其拖到画布上。

../../_images/190.png

  1. 转到 编辑 ‣ 选择 ‣ 按表达式选择要素… 或点击属性工具栏上的 使用表达式选择要素 按钮。

../../_images/250.png

  1. 在“按表达式选择”对话框中,切换到 函数编辑器 选项卡。在这里,你可以编写任何将由表达式引擎执行的 PyQGIS 代码。

../../_images/329.png

  1. 我们将定义一个名为 GetUtmZone 的自定义函数,用于计算每个要素的 UTM 分带编号。由于 QGIS 中的自定义函数在要素级别工作。我们将使用要素几何图形的质心,并根据质心几何图形的经纬度计算 UTM 分带。我们还会在分带号后添加‘N’或‘S’标识,以指示该分带位于北半球还是南半球。点击屏幕左下角的 + 按钮,输入 utm_zones.py 作为文件名。你可以点击底部面板中的“帮助”标签来关闭它并展开代码面板。

../../_images/4.gif

  1. 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 ```

../../_images/513.png

注意

目前无法从图形用户界面删除表达式文件。如果你希望删除 utm_zone.py 文件,可以转到 设置 ‣ 用户配置文件 ‣ 打开活动配置文件文件夹,并从 python ‣ expressions 文件夹中删除该文件。

  1. 在“按表达式选择”对话框中切换到 表达式 选项卡。在函数部分找到并展开 自定义 组。你会在列表中注意到一个新的自定义函数 GetUtmZone。我们现在可以在表达式中像使用任何其他函数一样使用此函数。在编辑器中键入以下表达式。该表达式将选择所有落在 UTM 分带 33N 中的点。点击 缩放到要素,地图将发生变化,如果你点击 选择要素,应该会看到 UTM 33N 分带中的点变为黄色。

bash GetUtmZone() = '33N'

../../_images/613.png

注意

由于一个错误,此功能在早期 QGIS 3 版本中无法使用。从 3.4.5 版本开始已经修复。

  1. 回到 QGIS 主窗口,你应该看到一些以黄色高亮显示的点。这些是落在表达式中指定的 UTM 分带中的点。

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

../../_images/813.png 9. 切换到 显示 选项卡。在这里,你可以输入任何文本,当你在该图层的要素上悬停时将显示该文本。更好的方法是,你可以使用图层字段值和表达式来定义更有用的信息。点击 Ɛ 按钮。

../../_images/913.png 10. 你会再次看到熟悉的表达式编辑器。我们将使用 concat 函数来连接 name 字段的值和我们的自定义函数 GetUtmZone 的结果。输入以下表达式并点击 确定。

```bash
concat("name",' | UTM Zone: ', GetUtmZone())
```

![../../_images/1017.png](images/1017.png)
  1. 你会看到表达式已作为“显示文本”的值输入。点击 插入 将其添加到 HTML 框中,然后按 确定。

    ../../_images/1120.png 12. 在进行下一步之前,让我们取消上一步中选择的要素。转到 编辑 ‣ 选择 ‣ 取消选择所有图层的要素 或点击属性工具栏上的 取消选择所有图层的要素 按钮。

    ../../_images/1218.png 13. 通过转到 视图 ‣ 地图提示 或点击属性工具栏上的 显示地图提示 按钮来激活 地图提示 工具。

    ../../_images/1316.png 14. 放大到地图的任何区域,并将鼠标光标悬停在任意要素上。你将看到城市名称和相应的 UTM 分带作为地图提示显示出来。

    ../../_images/14.gif


如果你想反馈或分享你学习本教程的体验,请在下方评论。(需要 GitHub 账户)