QGIS表达式中的函数

编程语言中的函数,与数学函数的定义大不相同。在计算机领域,函数是指一段可以直接被另一段程序或代码引用的程序或代码,也叫做子程序(subroutine)、过程(procedure)、方法(method)。

函数在QGIS表达式构建过程中起到重要作用,表达式实际上是函数作用于常量与变量后得到的结果,可以说,函数是表达式的灵魂。

内置函数与自定义函数

QGIS表达式中的函数分为内置函数自定义函数两大类。

内置函数是QGIS系统自带的函数,用户可以在表达式构建过程中调用内置函数,但是不能修改其中的代码。

自定义函数是由用户通过Python语言编写的代码片段,可以根据个性化需求对函数功能进行设计与修改,为用户提供更强大而灵活的定制能力。

  • 系统内置函数

QGIS内置函数分成约20个分组,包括地图、地图图层、记录和属性、时间和日期、数学、数组、条件等。每个分组下所包含的函数数量如下:
在这里插入图片描述

  • 自定义函数

在表达式构造器中切换到【函数编辑器】标签,可以看到自定义函数编辑区由左边的函数列表、右上的函数代码编辑器和右下的帮助区域组成。

默认情况下,函数列表只有一个default函数,是系统提供的自定义函数模版。右侧函数代码编辑器给出了样例代码,提供了导入QGIS模块、自定义函数存储的分组以及函数体代码的参考。
在这里插入图片描述

点击左下角的【+】按钮,在弹出的对话框输入存储的文件名,即可新增自定义函数。

在这里插入图片描述

通常情况下,自定义函数首先需要使用import语句导入引用的Python库,然后设计和编写函数实现代码,例如在函数代码编辑器输入下面的代码:

import math
from qgis.core import *
from qgis.gui import *

@qgsfunction(args=0, group='Custom', usesgeometry=True)
def GetUtmZone(value1, feature, parent):
    """以字符串形式返回几何图形所属的UTM区"""
    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)

该函数的主要功能是计算要素所处的UTM投影分度带,返回以‘N’或者‘S’结尾的投影分度带字符串。
在这里插入图片描述

点击右下角的【保存并载入函数】按钮,将该函数保存,并载入到表达式构造器对应的分组中。此时调出表达式构造器对话框,可看到上述自定义函数出现在custom分组中,双击该函数即可完成函数调用。
在这里插入图片描述

自定义函数能根据需求进行设计和代码编写,为函数的使用提供了更多的可能性,由于涉及到Python编程语言,其使用方式也更加复杂,QGIS官方文档有大量篇幅对这方面进行了详细介绍,感兴趣的朋友可以到QGIS官网查阅相关文档。

查找函数

在表达式构造器中,函数以分组方式在树形结构中列出。如果对函数的分组比较熟悉,大致了解自己所需要的函数属于哪个分组,可以直接展开分组找到该函数。如果知道函数的名字,可以在选择区上方搜索框中输入函数的名字进行快速查找。
在这里插入图片描述

使用函数

双击函数,即可将其添加到代码输入区中。表达式代码编辑器支持参数提示和自动补全功能:输入函数的前几个字母,编辑器将会提示与其匹配的函数名,使用tab按键将实现自动补全。

QGIS中的函数支持命名参数,即在使用函数时,参数的传入可以用命名参数。命名参数可以忽略参数的顺序,方便函数的使用,尤其是参数比较多的情况时,用参数名称和参数值同时出现的方法,可以提高代码的可读性。

例如clamp函数可以实现将输入值限定在指定的范围内,需要三个参数:min,范围最小值;max,范围最大值;value,输入值。默认情况下,clamp函数的参数调用顺序为:clamp(min,value,max),例如,在表达式编辑区写入代码:clamp(1,5,10),可以实现将输入值限定在[1,10]范围,当前输入值为5,因为在[1,10]范围内,函数返回输入值本身,即5。用命名参数调用的方式为:clamp(min:=1,max:=10,value:=5),注意到,参数的顺序并未按照默认顺序给出,而表达式引擎也正确地返回计算结果。
在这里插入图片描述

常用函数

QGIS表达式中的函数将近300个,在表达式构建中正确地使用函数可达到事半功倍的效果。由于篇幅所限,本文不能将函数一一详解,根据函数的常用程度,选择约30个函数并对其进行详细说明。其他函数的用法可以在表达式构造器的帮助文档中获取。
在这里插入图片描述

函数典型应用

darker(@symbol_color,130)

该函数来自《QGIS 3.10矢量样式设置》,用于设置发电厂点要素的描边颜色。darker是颜色函数,返回更暗的颜色字符串。@symbol_color是当前几何图形的渲染颜色,130是暗化因子相对应的整数。该函数实现如下功能:返回比@symbol_color暗30%的颜色值。

maximum("passengers", group_by:="station_class")

maximum是聚合函数,返回字段或者表达式的最大值。"passengers"是属性表中的旅客数量字段,"station_class"是站点类型字段。该函数实现如下功能:按照站点类型分组,返回最大旅客数量。

buffer( $geometry, 10 )

buffer为几何图形函数,实现按照给定半径返回几何图形的缓冲区,$geometry表示当前选中的几何图形,10为缓冲半径,其单位与地图单位相同。

to_date('2020-07-29')

to_date是日期函数,实现将一个字符串转换成日期对象。传入参数代表不同日期形式的字符串,其支持的格式可参考QGIS的相关文档,默认情况下,日期字符串为短横线连接,年份由4位数字表示,月份由2位数字表示,日期用2位数字表示,形如’2020-07-29’。

format_date(now(),'yyyy-MM-dd')

format_date是字符串函数,实现格式化日期字段,返回一个自定义的字符串格式。now()是日期函数,返回当前日期和时间。该表达式的输出结果是短横线连接的当前日期字符串,如:‘2020-07-29’。

小结

本文试图从系统内置函数、自定义函数、函数的使用和查找、常用函数说明和函数典型应用等方面,探讨对QGIS表达式中的函数理解。QGIS表达式中的函数种类繁多,使用方法灵活多变,本文仅为抛砖引玉之作,如果有理解偏差,欢迎指正。


吴建玲

2020年7月30日


版权声明


本文欢迎转载,转载时请注明出处。


在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/QGISClass/article/details/107706843
今日推荐