目录
写在文章前
一、给要素编号用哪些功能
二、实现一个最简单的编号
1.数据准备
2.编辑字段计算器表达式
3.查看编号结果
三、更加复杂的编号
1.使用UUID编号
2.根据单个属性排序后编号
3.根据多个属性排序后编号
4.拼接字符串进行编号
5.根据时间编号及实现
众所周知,在社会中存在着各种编号,如:邮政编码、订单编号、身份证号等,这些编号大多用于对事物进行科学地辨识。在地理空间数据中,空间数据不仅存在空间信息,还有属性及时间信息。对于矢量数据文件,其大多是以“表”的形式存在,也就是说矢量数据的每个要素(每行记录)都是可以被编号的。
本文将从怎么利用QGIS的功能对其所能管理的矢量数据进行编号,文中所列举的例子可能不太符合实际情况,但是例子中用到的方法是可以适用于各类与空间信息有关的调查项目中需要编号的场景。
给要素编号的本质是给要素的某一个属性赋值,所赋予要素的值是符合编号规则的字符串(数据类型是字符串型)。在QGIS中,常见的给属性赋值的功能为字段计算器,除此之外也有使用python脚本、工具箱、插件的方式来给要素的某一个属性赋值。QGIS的字段计算器提供了丰富的函数,利用好这些函数就可以生成各种各样的符合需求的编号。这使得QGIS在数据生产中有一定优势。
在读取常见的shapefile、kml、geojson、gml等常见矢量文件同时,QGIS也可以读取Excel、csv等格式的文件为“图层”,也就是说,无空间信息的纯属性数据也可以通过QGIS来编辑。
通常我们编号是根据事先规定好的编码规则进行的,所以编号前需要先根据编码规则分析一下使用哪些函数来实现编码规则。
在本节,我们使用最简单的编号规则(4位顺序号)来演示一下有关功能。
单击主菜单【图层】【创建图层】【新建临时图层】,创建一个包含“ID”和“Name”属性的无几何图形临时图层文件。这里创建无几何图形的图层是为了简化操作,省去给空间数据赋值的过程。
数据创建入口
无几何图形临时图层的配置
使用添加要素按钮给10个要素,给Name填写十个随机名字,也可以不写。
在属性表单击字段计算器按钮,打开字段计算器。
在字段计算器表达式窗口输入以下表达式:
lpad(@id,4,0)
注意不要勾选仅更新1个所选要素
可以发现,已经将ID属性赋值为4位数字长度的顺序号。
使用uuid编号实现比较简单,只需要打开字段计算器,在表达式框中输入以下表达式,运行即可。
uuid( 'WithoutBraces' )
几种变式:
不带短横,如:c2f4bed53daf4498b7216ea155a08d2b
replace( uuid( 'WithoutBraces' ),'-','')
不带短横、大写,如:83397DED76A348838298C2351FEB9FC0
upper( replace( uuid( 'WithoutBraces' ),'-','') )
由于字段计算器提供的函数无法直接给要素排序。但我们可以通过工具箱对属性排序,排序后,要素的“@id“变量会根据排序有所改变。下面还是使用上述数据,根据属性排序编号。
在主菜单找到:
【数据处理】【工具箱】【矢量通用工具】【按表达式排序(Order by expression)】
选中数据图层,表达式选择Name(即根据Name属性的排序),勾选升序排序(不勾选则为降序排序)。
打开字段计算器,使用第二节的表达式对ID字段进行更新。
从数据列表中可以看到ID已经修改为按照Name升序排序的4位序列号。
上图是ID已经修改为按照Name倒序排序的4位序列号。
根据多个属性进行排序有多种方法。
方法一:
利用排序工具中的表达式,拼接多个字段,但这种方式的灵活性相对低一点,不能实现多个属性按各自的规则(升序、倒序)进行组合。
方法二:
我们可以使用【执行SQL语句】(executesql)工具对图层要素进行排序,这样可以实现多个属性按各自的规则(升序、倒序)进行组合。这种方式需要对SQL语句有一定了解。
这里我们介绍一下方法二:
首先准备数据,还是利用上述图层,在其基础上再加一个School属性。描述人物所属的学校
打开工具箱,进行如下配置:
在附加输入的数据源选中需要处理的图层。
在SQL查询中输入以下SQL语句:
select * from input1 order by School desc,Name asc
以上SQL的意思为根据School排倒序,在根据School排序的基础上,School属性一样的要素再根据Name排升序。
在几何图形类型选择没有几何图形。单击运行。
上图是运行成果,可以看到排序效果。
在上述基础上,再次运行lpad(@id,4,0)表达式,得出以下结果。
如果需要对每个学校单独进行编号,可以用执行SQL的方式实现。
在执行SQL工具中,输入以下SQL语句,选择无几何图形,单击运行。
SELECT
CONCAT(School,LPAD((ROW_NUMBER() OVER(PARTITION BY School ORDER BY Name)),4,'0')) AS ID,
Name,
School
FROM
input1
ORDER BY
Name ASC;
以下是执行结果:
在实际情况中,对事物的编号,不仅只有序列号,还有特征码,组织机构信息等等,出于便于管理的需要,编号时通常会拼接一些字符串来生成编号。用QGIS实现拼接字符串编号通常不难。在业务不复杂的情况下,只需要使用字段计算器的拼接功能就可以实现,对于复杂一些的可以通过SQL语句、python脚本实现,第三小结的最后一个例子就是一种使用SQL的情况。
假设有这样一份数据:
stuffNo为员工编号,type为学校代码,School为学校名称,Name为姓名。
假设现在要生成一个全市学校职工的名单,那么可以拼接学校代码和员工代码实现最简单的全是学校职工编号。
在字段计算器中拼接字段即可,拼接符号为”||“
效果如下:
假如有这样一分外卖订单数据,拥有订单号、订单名称,下单时间等等属性信息,送货地址数据为空间信息,这样的数据就是一份典型的地理空间数据。
输入以下公式:
format_date( "CreateTime",'yyyyMMdd')||lpad(@id,8,0)
效果如下: