QGIS表达式中的函数

本文介绍了QGIS表达式中的内置和自定义函数,包括它们的分类、使用方法、常见函数及其应用。QGIS内置函数分为多个分组,自定义函数允许用户通过Python进行定制。文中还讲解了如何查找和使用函数,以及一些常用函数的功能,如darker、maximum、buffer和date转换函数。
部署运行你感兴趣的模型镜像

编程语言中的函数,与数学函数的定义大不相同。在计算机领域,函数是指一段可以直接被另一段程序或代码引用的程序或代码,也叫做子程序(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日


版权声明


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


在这里插入图片描述

您可能感兴趣的与本文相关的镜像

Kotaemon

Kotaemon

AI应用

Kotaemon 是由Cinnamon 开发的开源项目,是一个RAG UI页面,主要面向DocQA的终端用户和构建自己RAG pipeline

### QGIS 属性表中使用多个表达式的示例 在QGIS中,可以利用字段计算器来创建新的字段或更新现有字段,并通过组合多个表达式实现复杂的数据处理逻辑。下面是一个具体的例子,展示如何在一个操作中应用多个表达式。 #### 创建新字段并计算面积和周长 假设有一个多边形矢量图层,在该图层的属性表里想要增加两个字段分别存储每个多边形要素的实际面积和边界长度: 1. 打开目标图层的属性表; 2. 启动编辑模式; 3. 进入“字段计算器”,勾选“创建虚拟字段”以便于随时更新这些值而不影响原始数据结构; 对于面积字段(命名为`area`),可使用如下表达式: ```sql $area ``` 对于周长字段(命名为`perimeter`),则采用此表达式: ```sql $perimeter ``` 这两个表达式可以直接获取几何对象对应的测量结果[^1]。 #### 组合条件判断与字符串操作 如果希望基于某些特定条件下修改文本型字段的内容,则可以通过嵌套if语句和其他函数完成更复杂的转换工作。例如,当某列中的数值大于某个阈值时改变另一列表项的文字描述: 设有一列名为`value`表示某种指标得分,现在要根据这个分数给定等级标签到新建立的一栏叫作`grade`: ```sql CASE WHEN "value" >= 90 THEN 'Excellent' WHEN "value" BETWEEN 70 AND 89 THEN 'Good' ELSE 'Needs Improvement' END ``` 这里不仅实现了简单的比较运算还加入了范围界定功能[^2]。 #### 文件路径解析及重命名 针对批量导入后的文件可能带有冗余信息的情况,可以运用正则表达式提取有用部分作为最终保存的名字。比如有这样一批来自不同地区的地理空间数据集其全名格式类似:“地区名称_具体项目_mygeodata.shp”。为了去除前缀只保留核心内容可以用以下方式定义输出文件名模板: ```sql regexp_replace( @layer_name , '^.*_(.*)\.shp$', '\\1') ``` 上述命令会匹配整个字符串直到最后一个下划线之后的部分为止,并将其替换为捕获组内的子串即原文件的核心标识[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值