使用Python在QGIS中“按属性选择”?


16

有没有一种方法可以使用python命令在QGIS中使用“按属性选择”功能?在我的插件中,用户应通过GUI输入一个值,并且该值应在选择具有此属性的所有功能的函数中使用。列名在代码中是固定的,该函数应仅搜索正确的值。

在我当前的解决方案中,该函数将QGIS连接到PostgreSQL数据库并运行SQL语句。这将从结果中创建一个表,并且该表在QGIS中显示为Shapefile。

原则上,突出显示特征就足够了,而不必创建所选内容的新Shapefile就足够了。使用“按属性选择”功能还将跳过不必要的数据库连接。

有没有办法在python中使用功能“按属性选择”,以便突出显示功能?使用QGIS中的功能,所有与查询不匹配的功能都可以暂时删除,这也是可以的。


1
这些答案需要qgis 3更新。
MonsterMushroom

Answers:


8

是。您可以通过python绑定获取所有属性,并在自己的插件中实施额外的过滤。请参阅此PyQGIS Coobook摘录中的摘要和一些示例。然后,您只需从返回的字典中排除任何不匹配的结果。

至于可视化,由于select()没有合适的参数,您可能仍将不得不创建另一层。您可以使用存储层来避免创建物理文件(有关食谱的更多信息)。

编辑:

实际上,您可以使用selectedFeaturesIds()with setSelectedFeatures(ids)将选择更改为您创建的子集。直接引用实现:

/** Get a copy of the user-selected features */  
QList<QgsFeature> selectedFeatures();

/** Return reference to identifiers of selected features */
const QSet<qint64> &selectedFeaturesIds() const;

/** Change selection to the new set of features */
void setSelectedFeatures(const QSet<qint64> &ids);

太遗憾了!我认为这在QGIS中是可能的,因为在ArcGIS中使用arcpy也是可能的。不过,谢谢您的回答!
userHH 2012年

也许有办法;我就是不知道 给网站的其他用户一些时间-也许有人这样做。
lynxlynxlynx

我认为这一定有可能。在QGIS中,可视化与所选内容匹配的所有功能,所有其他功能都暂时被遮盖。
userHH 2012年

是的,我找到了。QGIS是在核心中执行此操作的,但看起来它暴露了足够的界面来适当地调整选择。
lynxlynxlynx

可以给我发送链接吗?
userHH 2012年

9

从QGIS 2.2开始,这是非常自然的方式。可以使用该QgsFeatureRequest.setFilterExpression( unicode )方法通过QGIS表达引擎来完成。

# The important part: get the feature iterator with an expression
it = l.getFeatures( QgsFeatureRequest().setFilterExpression ( u'"Counties" = \'Norwich\'' ) )
# Set the selection
l.setSelectedFeatures( [ f.id() for f in it ] )

最好的事情是:如果您有最新的QGIS版本(2.10及更高版本),它将在数据库中直接进行过滤,因此与其他解决方案相比,它的性能要高得多,同时仍非常易读。


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.