如何使用PyQGIS读取属性值?


18

用pyqgis获取包含在属性表中的信息的方法是什么,例如第2列第2行?


这很有用,但这似乎只是为您提供属性的值。似乎属性必须是名称/值对。如何获得每个属性的名称?这就是“领域”的全部内容吗?
ajpieri

这并不能真正回答问题。如果您有其他问题,可以点击提问进行提问。一旦您有足够的声誉,您还可以悬赏以吸引更多对此问题的关注。- 评分
马丁HUGI

Answers:


43

要遍历图层中的每个要素,请使用getFeatures()生成器。这将返回QgsFeature图层中的要素()的迭代器。

for feature in layer.getFeatures():
    pass # do something with feature

如果您只对某个特定功能感兴趣,而不是对图层中的所有功能感兴趣,则可以使用QgsFeatureRequestFID 来访问它:

fid = 1 # the second feature (zero based indexing!)
iterator = layer.getFeatures(QgsFeatureRequest().setFilterFid(fid))
feature = next(iterator)

一旦有了QgsFeature对象,就可以使用该attributes()方法来检索与该特征(即行)关联的属性(即列或字段),例如:

# get the feature's attributes
attrs = feature.attributes()
# print the second attribute (note zero based indexing of Python lists)
print(attrs[1])

如果要通过名称而不是数字来索引字段,则需要使用字段映射:

idx = layer.fieldNameIndex('name')
print(feature.attributes()[idx])

字段索引在循环期间不应更改,因此您只需调用一次即可。

PyQGIS食谱中提供了更多信息和示例:http ://www.qgis.org/pyqgis-cookbook/vector.html#iterating-over-vector-layer

更新资料

您可以通过使用更轻松地访问功能属性QgsFeaturedict,例如

for feature in layer.getFeatures():
    name = feature["name"]

我不确定使用哪个版本或者是否一直存在。


11

以为我实际上会添加一些代码,因为谷歌搜索这个问题会返回这个问题...大多数人都希望对链接的链接进行快速解释或代码片段,链接会导致具有大量附加信息的页面。

为了获得表中的信息,您首先必须访问图层的要素。就我而言,我将要素放在变量中。然后循环浏览这些功能,并为每个功能调用其属性,然后可以使用其列索引进行打印。例如,如果我想获取第二列中的所有值,则可以这样做:

lyr = iface.activeLayer()

features = lyr.getFeatures()

for feat in features:
    attrs = feat.attributes()
    print attrs[1]

1

上面的答案仅显示了如何对活动层执行此操作。我认为,在许多情况下,您可能希望为不是活动图层或在“图层”窗口中选中的图层找到所述属性。下面的代码将获取已添加到“层”窗口中的所有层的列表(无论它们是否处于选中状态),并在第2行第2列中找到属性。

from qgis.core import QgsProject

layer = QgsProject.instance().mapLayersByName("myLayerName")[0]
        value = layer.getFeature(2).attribute(2)

注意mapLayersByName返回具有给定名称的图层列表。我假设此示例存在一个。

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.