如何使用QGIS中的表达式选择包含特定文本字符串的要素


16

我需要根据多边形是否属于矿物声明来设置测量宗地多边形shapefile的样式。不幸的是,属性表的“ TITLE”字段中仅包含有关多边形是否属于矿物声明的唯一信息,该信息提供了所调查包裹的完整法定名称。例如,“ DISTRICT LOT 5639,BEING AWARD NO。2 MINERAL CLAIM,KDYD'。我需要一个表达式,用于选择“标题”字段中包含文本“ MINERAL CLAIM”的任何特征。

Answers:


25

您只需要使用LIKE运算符。

例如, "TITLE" LIKE '%MINERAL CLAIM%'

%符号的作用类似于通配符。

LIKE区分大小写,但ILIKE不区分大小写。


并且请注意,这是一个缓慢的操作,您可能需要使用它一次来生成新列,而不是一直将其用作表达式。
bugmenot123

对于大形状而言,速度很慢,因此我将选择内容简单复制/粘贴为新的矢量层。
克里斯(Chris)

@chris您可以在QGIS的其他部分中使用相同的查询,例如定义查询或使用基于规则的呈现进行样式设置-确实取决于您需要应用查询的原因(即分析,可视化,导出等)。选择内容比较繁琐,但是如果将其用作定义查询,则只会在画布上的查询中显示这些功能或使其可供处理。本质上是将选择复制/粘贴为新的矢量层时所做的操作。
SaultDon

索引不能与LIKE一起使用,因此我总是尽量避免一次又一次地使用它们。但是,是的,这可能是无关紧要的,对于小型数据集,肯定还有其他低速的成果。
bugmenot123

1
@ bugmenot123我刚刚了解到,如果数据在postgresql中时有一个索引,LIKE将在特定条件下使用它(例如%在查询中),而不进行顺序扫描!blog.cleverelephant.ca/2016/08/pgsql-text-pattern-ops.html
SaultDon

3

我有这个确切的问题,并使用regex从python控制台解决了。尽管正则表达式可能很棘手,但它非常强大。您将获得可用于更困难的比赛案例的工具。 这是文档。而这里是一个很好的在线机器来测试您正则表达式的字符串。

首先,这里是我运行的快速脚本,用于检查qgis中的正则表达式字符串

import re
RES_STRING='MINERAL CLAIM'
REGEX_HAYSTACK='DISTRICT LOT 5639, BEING AWARD NO. 2 MINERAL CLAIM, KDYD'

REGEX_STRING=re.compile(RES_STRING)
print "searching for "+RES_STRING+" in "+REGEX_HAYSTACK
REGEX_MATCH = REGEX_STRING.search(REGEX_HAYSTACK)
if REGEX_MATCH:
    print "found '"+REGEX_MATCH.group()+"'"
else:
    print "No match found"

对正则表达式匹配感到满意后,可以将其包装在一个函数中,以提供所有匹配功能的选择。下面是执行此操作的函数。

def select_by_regex(input_layer,attribute_name,regex_string):
    import re
    RES_STRING=regex_string
    attribute_name_idx = input_layer.fieldNameIndex(attribute_name)
    if attribute_name_idx<0:
        raise valueError("cannot find attribute"+attribute_name)
    else:
        fids=[]
        for feature in input_layer.getFeatures():
            REGEX_HAYSTACK=feature[attribute_name_idx]
            REGEX_STRING=re.compile(RES_STRING)
            REGEX_MATCH = REGEX_STRING.search(REGEX_HAYSTACK)
            if REGEX_MATCH:
                fids.append(feature.id())
            else:
                pass
        input_layer.setSelectedFeatures(fids)


#USAGE BIT
input_layer = QgsVectorLayer('path/to/shape/file.shp','layer name', 'ogr')
QgsMapLayerRegistry.instance().addMapLayer(input_layer)   
regex_string='MINERAL CLAIM'
attribute_name='TITLE'
select_by_regex(input_layer,attribute_name,regex_string)

您将需要将其保存到文件中并从qgis python ide运行它。

(未经测试,但很自信)


1
学习正则表达式的好建议,但是对于眼前的问题却矫kill过正。
Alphabetasoup15年

@ alpha-beta-soup是。在这种情况下。但是,非常类似的问题肯定会发现它是必不可少的。批号<6000?还是前2个矿物声明?这只是另一个答案(尽管更为复杂/强大)。也许会帮助别人。
紫色先生

3
还请注意,QGIS具有内置的正则表达式匹配功能-regexp_match。
ndawson

当然,答案更“深入”。对于我需要的东西,有些过分了,但还是要感谢。肯定会在将来帮助其他人。
克里斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.