我正在为流量分配开发一个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)
速度很快,但图层的显示不会改变。 知道为什么吗?
答案 0 :(得分:1)
方法
bool QgsVectorLayer.setSubsetString(self, QString subset)
对图层进行过滤(在setSubsetString中有更多详细信息),因此,只有与过滤器匹配的功能(使用SQL语句或其他定义字符串(“子集” QString提供),才属于该图层)它正在被过滤。因此,当您调用刷新时,仅显示已过滤的功能。
另一方面,方法
QgsFeatureIterator QgsVectorLayer.getFeatures(self, QgsFeatureRequest request=QgsFeatureRequest())
为您请求的匹配功能返回一个迭代器(更多详细信息,请参见getFeatures)。它不会过滤图层。使用迭代器,您只需迭代与请求匹配的功能即可。