使用 GDALOGR 提取矢量文件唯一字段值

在 GIS 开发中,我们经常需要从 Shapefile 或其他矢量文件中提取属性表的唯一值。今天分享一个简单的 Python 函数,使用 GDAL 的 OGR 模块来实现这个功能。

函数 get_names_from_vector 接收矢量文件路径和字段名作为参数。它首先打开文件,检查字段是否存在,然后遍历所有要素,收集唯一值到集合中。代码中加入了打印语句,便于调试。

这个小工具特别适合批量处理地理数据,比如提取行政区划名称列表。

from osgeo import ogr

def get_names_from_vector(vector_path, name_field):
    """
    读取矢量文件属性表指定列的所有唯一值
    """
    print(f"正在读取矢量文件: {vector_path}")
    
    ogr.RegisterAll()
    
    ds = ogr.Open(vector_path, 0)
    if ds is None:
        raise IOError(f"无法打开文件: {vector_path}")
    
    layer = ds.GetLayer()
    if layer is None:
        raise IOError(f"无法获取图层: {vector_path}")
        
    names = set()
    
    layer_defn = layer.GetLayerDefn()
    field_index = layer_defn.GetFieldIndex(name_field)
    if field_index < 0:
        raise ValueError(f"字段 '{name_field}' 在矢量文件中不存在")
        
    feature_count = layer.GetFeatureCount()
    print(f"发现 {feature_count} 个要素,正在提取 '{name_field}' 字段值...")
    
    for feature in layer:
        val = feature.GetField(name_field)
        if val:
            names.add(str(val))
            
    print(f"共提取到 {len(names)} 个唯一名称")
    return names

上面的代码逻辑如下:

image-20251217103451325

使用示例:names = get_names_from_vector(‘china.shp’, ‘NAME’)。