QGIS中的表达式功能强大,并用于许多核心功能:选择,计算字段值,样式,标签等。QGIS还支持用户定义的表达式。借助一些python编程,您可以定义自己的函数,这些函数可以在表达式引擎中使用。
任务概述
我们将定义一个自定义函数,该函数可查找地图要素的UTM区域编号,并使用此函数编写一个表达式,将鼠标悬停在该点上时将UTM区域显示为地图提示。您将学习的内容
悬停在功能上时如何使用该工具显示自定义文本。
Map Tips
获取数据
我们将使用自然地球的“人口稠密的地方”数据集。下载简单(较少列)数据集
程序
ne_10m_populated_places_simple.zip
在QGIS浏览器中找到文件,然后将其展开。选择ne_10m_populated_places_simple.shp
文件并将其拖到画布上。转到编辑‣选择‣按表达式选择要素...或单击属性工具栏上的使用表达式选择要素按钮。
在“按表达式选择”对话框中,切换到“函数编辑器”选项卡。在这里,您可以编写将由表达式引擎执行的任何PyQGIS代码。
我们将定义一个自定义函数
GetUtmZone
,该函数将计算每个功能的UTM区域号。由于QGIS中的自定义功能在功能级别起作用。我们将使用要素几何的质心,并根据质心几何的经度和纬度计算UTM区域。我们还将在区域中添加“ N”或“ S”标记,以指示该区域是在北半球还是南半球。按下屏幕左下方的+按钮,然后输入utm_zones.py
文件名。您可以单击底部面板中的“帮助”标签以将其关闭并展开代码面板。
5. UTM区域是从1到60编号的纵向投影区域。每个UTM区域为6度宽。在这里,我们使用简单的数学公式为给定的经度值找到合适的区域。该公式适用于除少数特殊的UTM区域以外的所有区域。在编辑器窗口中键入以下代码。完成后,单击“保存并加载函数”。
import mathfrom 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
文件,可以转到设置‣用户配置文件‣打开活动配置文件文件夹,然后从python‣表达式中删除文件。
6. 切换到“按表达式选择”对话框中的“表达式”选项卡。在“功能”部分中找到并展开“自定义”组。您会GetUtmZone
在列表中注意到一个新的自定义功能。现在,我们可以像其他任何函数一样在表达式中使用此函数。在编辑器中键入以下表达式。此表达式将选择所有落在UTM区域中的点33N
。单击“缩放到要素”,地图将发生变化,如果单击“选择要素”,则应该看到UTM区域33N中的点将颜色更改为黄色。
GetUtmZone()='33N'
注意
由于存在错误,此功能在QGIS 3的早期版本中不起作用。已从3.4.5版开始修复此功能。
7. 回到QGIS主窗口中,您应该看到一些点以黄色突出显示。这些是我们在表达式中指定的UTM区域中的点。
8. 您了解了我们如何定义和使用自定义函数通过表达式选择要素。现在,我们将在另一个上下文中使用相同的功能。QGIS中的隐藏宝石之一是“地图提示”工具。悬停在功能上时,此工具会显示用户定义的文本。右键单击ne_10m_populated_places_simple
图层,然后选择属性。
9. 切换到显示选项卡。在这里,您可以输入将鼠标悬停在图层要素上时将显示的任何文本。更好的是,您可以使用图层字段值和表达式来定义一条更有用的消息。点击ɛ按钮。
10. 您将再次看到熟悉的表达式编辑器。我们将使用该concat
函数将字段的值name
和自定义函数的结果连接起来GetUtmZone
。输入以下表达式,然后单击“确定”。
concat("name",' | UTM Zone: ', GetUtmZone())
11. 您将看到输入的表达式作为“显示”文本的值。单击插入将其添加到HTML框中,然后按OK。
12. 在继续之前,让我们取消选择上一步中选择的功能。转到编辑‣选择‣从所有图层中取消选择要素,或单击属性工具栏上的从所有图层中取消选择要素按钮。
13. 通过转至查看‣地图提示或单击属性工具栏上的显示地图提示按钮来激活该工具。Map Tips
14. 放大地图的任何区域,然后将鼠标光标放在任何要素上。您将看到城市的名称和相应的UTM区域显示为地图提示。
END
点击下方“阅读原文”查看更多