使用自订的 Python 表达式函数 (QGIS3)¶
QGIS 表达式非常的强大,而且也使用在许多核心操作上,像是选取、计算影像值、样式设定、标记等等。QGIS 也支援使用者自定义的表达式,只要使用一点点的 Python 程式,就可以设计自己的函数,然后把它安插到 QGIS 表达式的引擎中。
内容说明¶
我们将定义一个自定义函数,以查找地图要素的 UTM区域编号, 并使用该函数编写一个表达式,将UTM区域显示为悬停在该点上时的地图提示。
你还会学到这些¶
使用
地图提示(Map Tips)
工具,在滑鼠游移在某图征上时显示自订的文字。
获取资料¶
我们要使用自然地球的 人口居住地 数据库,请下载 简化版 (栏位较少) 的数据库
操作流程¶
在QGIS浏览器中找到
ne_10m_populated_places_simple.zip
文件并将其展开。选择ne_10m_populated_places_simple.shp
文件并将其拖到画布上。
转到 Attributes Toolbar 单击 Select features using an expression。
,或在
在 Select by Expression 对话框中,切换到 Function Editor 标签。在这里,您可以编写将由表达式引擎执行的任何PyQGIS代码。
我们将定义一个名为
GetUtmZone
的自定义函数,该函数将计算每个功能的UTM区域号。由于QGIS中的自定义功能在功能级别起作用。我们将使用要素几何的质心,并根据质心几何的经度和纬度计算UTM区域。我们还将在区域中添加 N 或 S 标记,以指示该区域是在北半球还是南半球。 按下屏幕左下方的 + 按钮,然后输入utm_zones.py
作为文件名。您可以单击底部面板中的 Help 标签将其关闭并展开代码面板。
UTM区域是从1到60编号的纵向投影区域。每个UTM区域均为6度宽。在这里,我们使用简单的数学公式为给定的经度值找到合适的区域。除了少数特殊的 UTM区域 <https://en.wikipedia.org/wiki/Universal_Transverse_Mercator_coordinate_system#Exceptions> `__。之外,该公式适用于所有其他区域。在编辑器窗口中键入以下代码。完成后,单击 :guilabel:`Save and Load Functions。
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() 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)
注解
当前无法从GUI删除表达式文件。如果您想删除 utm_zone.py
文件,则可以转到 ,然后从 。
切换到按表达式选择对话框中的表达式选项卡。在
功能
部分中找到并展开自定义
组。 您会在列表中注意到一个新的自定义函数GetUtmZone
。现在,我们可以像其他任何函数一样在表达式中使用此函数。在编辑器中键入以下表达式。该表达式将选择所有落在UTM区域33N
中的点。单击 Zoom to Features,地图将会更改,如果单击 Select Features,您应该会看到UTM区域33N中的点将颜色更改为黄色。GetUtmZone() = '33N'
注解
由于存在错误,此功能在QGIS 3的早期版本中不起作用。已从3.4.5版开始修复此功能。
回到QGIS主窗口中,您应该看到一些点以黄色突出显示。这些是我们在表达式中指定的UTM区域中的点。
您了解了我们如何定义和使用自定义函数通过表达式选择要素。现在,我们将在另一个上下文中使用相同的功能。QGIS中的隐藏宝石之一是 地图提示 工具。当您将鼠标悬停在功能上时,此工具会显示用户定义的文本。右键单击
ne_10m_populated_places_simple
层,然后选择属性。切换到显示选项卡。您可以在此处输入将鼠标悬停在图层要素上时将显示的任何文本。更好的是,您可以使用图层字段值和表达式来定义一条更有用的消息。点击 Ɛ 按钮。
你会再次看到熟悉的表达式编辑器。我们要利用
concat
函数来连接name
属性和GetUtmZone
函数的输出字串,因此输入以下的表达式后,按下 OK。concat("name",' | UTM Zone: ', GetUtmZone())
您将看到输入的表达式作为显示文本的值。单击 Insert 以将其添加到HTML框中,然后按 OK。
在继续之前,让我们取消选择上一步中选择的功能。转到 Attribute Toolbar 上的属性从所有图层中取消选择按钮。
,或单击通过转到 Show Map Tips 按钮来激活
或单击地图提示
工具。缩放至地图的任一处然后把滑鼠游标放在任何图征上,你就会看到城市的名字和对应的 UTM 分区显示在地图提示之中。