在PyQGIS中使用表达式选择要素


13

如何使用表达式使用PyQGIS选择功能?

我尝试使用,QgsExpression但select方法却不接受:

exp = QgsExpression("'ogc_fid' = 482")
cLayer = canvas.currentLayer()
cLayer.select(exp)

是否可以,如果可以,我该怎么做?

Answers:


24

按着这些次序:

  1. 获取图层参考:

    cLayer = iface.mapCanvas().currentLayer()

  2. 从表达式获取featureIterator:

    expr = QgsExpression( "\"ogc_fid\"=482" )

    it = cLayer.getFeatures( QgsFeatureRequest( expr ) )

  3. 根据从2中获得的结果来构建功能部件ID列表:

    ids = [i.id() for i in it]

  4. 选择具有在3.中获得的ID的功能:

    cLayer.setSelectedFeatures( ids )


注意:如果要使用字符串值设置表达式,则需要以这种方式在该值上添加引号:

expr = QgsExpression( " \"name\" = 'my string' " )

如果您的字符串值来自变量,则可以执行以下操作:

myVariable = 'my string'
expr = QgsExpression( " \"name\" = '{}' ".format(myVariable) )

我怎么说呢"\"ogc_fid\"=482 AND name=\"hello world\""?在这里说这在python中不可用:qgis.org/api/…。也许您知道一种规避此限制的方法?
Jenia Ivanov

2
请记住,字段名称必须用双引号引起来,字符串值必须用单引号引起来,数字不需要用引号引起来。在您的示例中:"\"ogc_fid\"=482 AND \"name\"='hello world'"。顺便说一句,您包含在注释中的链接实际上表明static属性BinaryOperatorText在Python绑定中不可用,但是运算符确实适用于QgsExpression,即使它们通过Python绑定使用也是如此。
赫尔曼·卡里略

@GermánCarrillo我在上面使用了您的方法,但是尽管已经复制并粘贴了一个已知值以进行搜索,但仍无法使它返回任何值。该列包含字符串,因此我使用了expr = QgsExpression("\"police_ref\" = 'P0580996'")。我已经尝试在搜索词中添加一个换行符(对于单引号),但这没有任何区别。有趣的是,如果我打开要查询的属性表,并在其中使用表达式生成器,那么如果我作为示例使用的Police_ref在第一行中,则它会做出选择,但不是这样
Alex

@GermánCarrillo抱歉,不要介意,我不确定我做了什么不同的操作,但是现在可以选择功能了!对于其他阅读者而言,单引号不需要换行符
Alex

6

这在QGIS Python控制台上为我工作

layer = qgis.utils.iface.activeLayer()
layer .selectByExpression(" \"ogc_fid\" = '{}' ".format(482))

欢迎使用GIS SE。作为新用户,请参加游览。现有(已接受)的答案要完整得多。对此有何改善?通常,获得信誉点的方法是回答未回答的问题,但是如果它专门解决了先前解决方案中的问题,则欢迎对三年的老问题提出新的完整答案(在这种情况下,肯定会提到该问题) 。
文斯

2

您只需要在GUI界面中进行测试:“按表达式选择”。如果可行,您可以将其粘贴到Python代码中,并用双引号“”引起来。

exp = QgsExpression("ogc_fid=482")

如果与字符串进行比较,则可以添加单引号“。

exp = QgsExpression("ogc_fid='482'")

这是python中相同的原理,它可以使双引号和单引号有所不同。

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.