You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 13:20:35