如何在QGS API中优化图层的过滤

时间:2016-05-10 15:55:32

标签: python filter qgis

我正在为流量分配开发一个QGIS插件(在2.8.1版本下),我希望在每个时间步骤显示模拟结果。现在我正在使用时间管理器插件,但是当我的图层有数十万个属性时它会变得很慢。在我的情况下,我确切地知道我想要在每个时间步显示哪些功能ID,所以我认为很容易使它更快。

这是我尝试的内容(抱歉我的python编程方式,但我使用这种语言很新):在我的循环的每个时间步骤我设置要显示的属性索引的有序列表(它们总是有序的在我的情况下)。

# TEST 1 -----------------------------------
for step in time_steps:
            index_start = my_list_of_indexes_start[step]
            index_end = my_list_of_indexes_end[step]
            expression = 'fid >= ' + str(index_start) + ' AND fid <= ' + str(index_end)
            # Or for optimization tests
            # expression = '"FIELD_TIME"' + "=" + str(step)
            layer_dynamic.setSubsetString(expression)
            self.iface.mapCanvas().refresh()                
            time.sleep(0.2)
# TEST 2 ------------------------------------
for step in time_steps:
            index_start = my_list_of_indexes_start[step]
            index_end = my_list_of_indexes_end[step]
            indexes = list(j for j in range(index_start, index_end))
            request = QgsFeatureRequest().setFilterFids(indexes)
            layer_dynamic.getFeatures(request)
            self.iface.mapCanvas().refresh()                
            time.sleep(0.2)

解决方案1 ​​

layer_dynamic.setSubsetString(expression)

在刷新视图时使用在每个时间步骤在画布上显示的正确过滤特征,但它比使用不基于索引的SQL表达式但在属性值上更慢(如TEST 1循环中的注释所示)

解决方案2

layer_dynamic.getFeatures(request)

速度很快,但图层的显示不会改变。 知道为什么吗?

1 个答案:

答案 0 :(得分:1)

方法

bool QgsVectorLayer.setSubsetString(self, QString subset) 

对图层进行过滤(在setSubsetString中有更多详细信息),因此,只有与过滤器匹配的功能(使用SQL语句或其他定义字符串(“子集” QString提供),才属于该图层)它正在被过滤。因此,当您调用刷新时,仅显示已过滤的功能。

另一方面,方法

QgsFeatureIterator QgsVectorLayer.getFeatures(self, QgsFeatureRequest request=QgsFeatureRequest())

为您请求的匹配功能返回一个迭代器(更多详细信息,请参见getFeatures)。它不会过滤图层。使用迭代器,您只需迭代与请求匹配的功能即可。