如何在PYQGIS中提取活跃图层指定字符串属性的唯一值?
提取QGIS图层属性唯一值的解决方案
方法1:使用QGIS内置uniqueValues()方法(推荐)
QGIS图层对象自带的uniqueValues()方法能直接返回指定字段的所有唯一值,效率远高于手动遍历要素,尤其适合大数据量场景。
替换你代码中获取属性值的部分,改为:
currField = attributeName[int(AttributeSelected) - 1] # 获取目标字段的索引 field_idx = lyr.fields().indexFromName(currField) # 直接获取该字段的唯一值 unique_values = lyr.uniqueValues(field_idx) # 转换为列表(按需选择) unique_values_list = list(unique_values) print("该字段的唯一值:") for val in unique_values_list: print(val)
方法2:Python集合手动去重
如果需要对值做额外过滤处理,可通过遍历要素将值存入集合(集合自动去重):
currField = attributeName[int(AttributeSelected) - 1] all_values = set() # 遍历所有要素,将字段值加入集合 for feature in lyr.getFeatures(): val = feature[currField] all_values.add(val) # 转换为列表 unique_values_list = list(all_values) print("该字段的唯一值:") for val in unique_values_list: print(val)
完整修改后的代码
整合上述方法并优化输入合法性判断,完整代码如下:
from PyQt5.QtGui import * from PyQt5.QtWidgets import QInputDialog # 补充导入必要组件 lyr = iface.activeLayer() print(lyr.name()) print(lyr.featureCount()) # 收集所有字符串类型属性 attributeName = [] allFields = lyr.fields() for field in allFields: if field.typeName() == "String": attributeName.append(field.name()) print("Name: %s" % field.name()) print("Type name (Data type): %s" % field.typeName()) print(attributeName) # 生成选择对话框内容 lbl4dialog = "输入选项编号选择属性:\n" for i in range(len(attributeName)): lbl4dialog += "%d. %s\n" %(i+1, attributeName[i]) title = "选择属性字段" label = lbl4dialog mode = QLineEdit.Normal default = "1" AttributeSelected, ok = QInputDialog.getText(None, title, label, mode, default) # 增加输入合法性判断,避免程序崩溃 if ok and AttributeSelected.isdigit(): selected_attr = attributeName[int(AttributeSelected) - 1] print(f"选中的属性: {selected_attr}") # 使用QGIS内置方法获取唯一值 field_idx = lyr.fields().indexFromName(selected_attr) unique_values = lyr.uniqueValues(field_idx) print("\n该属性的唯一值:") for val in unique_values: print(val) else: print("未选择有效属性")
关键说明
uniqueValues()会自动处理空值,无需额外判断- 补充导入
QInputDialog组件,避免原代码可能出现的运行报错 - 增加输入合法性校验,防止用户输入非数字或取消操作导致程序崩溃
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

