问题描述
QGIS根据指定的文字进行换行标注
项目的需要先描述一下:
- 需要标注的字段太长,需要进行换行标注
- 需要换行的数据不确定有多少(适用于批量数据的操作)
- 我需要根据指定文字进行换行
- 如:成山头海洋生态自然保护区,我想将自然保护区放在第二行显示,像这样显示:
- 如:成山头海洋生态自然保护区,我想将自然保护区放在第二行显示,像这样显示:
环境说明
- QGIS 3.28.7-Firenze
解决方法
方法1:在标注表达公式中直接设置
在QGIS中有这样一个直接进行换行标注的功能,具体的操作:
依次点击
输入如下公式:
代码如下所示(如匹配‘国家级自然保护区’ 在‘国’断开分行,根据需求修改)
CASE WHEN regexp_match(name,'国家级自然保护区') THEN substr( "name",1,regexp_match( "name",'国')-1)+ '\n' + substr( "name",regexp_match( "name",'国')) WHEN regexp_match(name,'自然保护区') THEN substr( "name",1,regexp_match( "name",'自')-1)+ '\n' + substr( "name",regexp_match( "name",'自'))WHEN regexp_match(name,'海洋生态') THEN substr( "name",1,regexp_match( "name",'自')-1)+ '\n' + substr( "name",regexp_match( "name",'自'))ELSE substr( "name",1,regexp_match( "name",'生')-1)+ '\n' + substr( "name",regexp_match( "name",'生')) END
CASE WHEN condition THEN result ELSE result END:
对条件按顺序进行计算,如果条件为真,计算停止,并返回相应的结果。如果没有一个条件为真,返回ELSE子句中的值。此外,如果未设置ELSE子句且不满足任何条件,返回NULL。
WHEN condition:
待评估的条件表达式
THEN result:
如果条件 判断为真那么将返回结果。
ELSE result:
如果上面的所有条件都不满足,那么结果将会返回。
substr(string,start[,length]):
返回字符串的一部分。
[ ]
标示可选的部分。
string:
完整的输入字符串
start:
整数,如果为从1开始的正整数则从起始位置开始提取; 如果为负数,则从尾部倒数计算位置,然后再正向提取。
length:
表示要提取字符串长度的整数。如果length为负数,返回字符串将从字符串末尾省略给定的字符长度。
regexp_match(input_string,regex)
返回unicode字符串中与正则表达式匹配的第一个匹配位置,如果未找到子字符串,返回0。
input_string:
对正则表达式进行测试的字符串
regex:
待测试的正则表达式,反斜杠字符必须进行双重转义(例如,“\s"匹配空白字符或”\b"匹配单词边界)。
方法2:利用QGIS中的标注中的【格式】功能
将需要换行标注的字段做个换行处理,这种方法需要新建一个临时的字段,以【name2】为例:
公式根据需求修改,完成后点击添加字段图片中的位置1处,停止编辑,保存内容。
CASE WHEN regexp_match(name,'自然保护区') THEN replace(name,'自然保护区','A自然保护区')ELSE replace(name,'生态系统','A生态系统')END
replace(string,before,after):
替换字符串,返回一个字符串、数组或字符串映射替换后的字符串。返回一个字符串,其中所提供的字符串或字符串数组被一个字符串或字符串数组替换。
string:
输入字符串
before:
待替换的字符串或字符串数组
after:
用作替换的字符串或字符串数组
执行结果如下所示:
然后再点击以执行如下操作:
【需要说明】
- 在使用【按该字符换行】功能,这个字符可以是字符串(汉字也可以)
- 对应的字符串会被删除,示例中的A会被省略掉,所以需要做临时的字段处理。
小结
示例中的情况,基本可以满足项目的需求,但是仍然会存在个例,可以自行修改属性表格,也可以进一步完善公式,使其一步到位。