使用自订的 Python 表达式函数 (QGIS3)

QGIS 表达式非常的强大,而且也使用在许多核心操作上,像是选取、计算影像值、样式设定、标记等等。QGIS 也支援使用者自定义的表达式,只要使用一点点的 Python 程式,就可以设计自己的函数,然后把它安插到 QGIS 表达式的引擎中。

内容说明

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

你还会学到这些

  • 使用 地图提示(Map Tips) 工具,在滑鼠游移在某图征上时显示自订的文字。

获取资料

我们要使用自然地球的 人口居住地 数据库,请下载 简化版 (栏位较少) 的数据库

操作流程

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

../../_images/130.png
  1. 转到 Edit ‣ Select ‣ Select Features By Expression…,或在 Attributes Toolbar 单击 Select features using an expression

../../_images/226.png
  1. Select by Expression 对话框中,切换到 Function Editor 标签。在这里,您可以编写将由表达式引擎执行的任何PyQGIS代码。

../../_images/318.png
  1. 我们将定义一个名为 GetUtmZone 的自定义函数,该函数将计算每个功能的UTM区域号。由于QGIS中的自定义功能在功能级别起作用。我们将使用要素几何的质心,并根据质心几何的经度和纬度计算UTM区域。我们还将在区域中添加 NS 标记,以指示该区域是在北半球还是南半球。 按下屏幕左下方的 + 按钮,然后输入 utm_zones.py 作为文件名。您可以单击底部面板中的 Help 标签将其关闭并展开代码面板。

../../_images/4.gif
  1. 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)
    
    ../../_images/59.png

注解

当前无法从GUI删除表达式文件。如果您想删除 utm_zone.py 文件,则可以转到 Settings ‣ User Profiles ‣ Open Active Profile Folder,然后从 python ‣ expressions

  1. 切换到按表达式选择对话框中的表达式选项卡。在 功能 部分中找到并展开 自定义 组。 您会在列表中注意到一个新的自定义函数 GetUtmZone。现在,我们可以像其他任何函数一样在表达式中使用此函数。在编辑器中键入以下表达式。该表达式将选择所有落在UTM区域 33N 中的点。单击 Zoom to Features,地图将会更改,如果单击 Select Features,您应该会看到UTM区域33N中的点将颜色更改为黄色。

    GetUtmZone() = '33N'
    
    ../../_images/69.png

注解

由于存在错误,此功能在QGIS 3的早期版本中不起作用。已从3.4.5版开始修复此功能。

  1. 回到QGIS主窗口中,您应该看到一些点以黄色突出显示。这些是我们在表达式中指定的UTM区域中的点。

    ../../_images/79.png
  2. 您了解了我们如何定义和使用自定义函数通过表达式选择要素。现在,我们将在另一个上下文中使用相同的功能。QGIS中的隐藏宝石之一是 地图提示 工具。当您将鼠标悬停在功能上时,此工具会显示用户定义的文本。右键单击 ne_10m_populated_places_simple 层,然后选择属性。

    ../../_images/89.png
  3. 切换到显示选项卡。您可以在此处输入将鼠标悬停在图层要素上时将显示的任何文本。更好的是,您可以使用图层字段值和表达式来定义一条更有用的消息。点击 Ɛ 按钮。

    ../../_images/99.png
  4. 你会再次看到熟悉的表达式编辑器。我们要利用 concat 函数来连接 name 属性和 GetUtmZone 函数的输出字串,因此输入以下的表达式后,按下 OK

    concat("name",' | UTM Zone: ', GetUtmZone())
    
    ../../_images/109.png
  5. 您将看到输入的表达式作为显示文本的值。单击 Insert 以将其添加到HTML框中,然后按 OK

    ../../_images/1112.png
  6. 在继续之前,让我们取消选择上一步中选择的功能。转到 Edit ‣ Select ‣ Deselect Features From All Layers,或单击 Attribute Toolbar 上的属性从所有图层中取消选择按钮。

    ../../_images/1210.png
  7. 通过转到 View ‣ Map Tips 或单击 Show Map Tips 按钮来激活 地图提示 工具。

    ../../_images/139.png
  8. 缩放至地图的任一处然后把滑鼠游标放在任何图征上,你就会看到城市的名字和对应的 UTM 分区显示在地图提示之中。

    ../../_images/14.gif