矢量数据的读取顺序:文件(datasource) → 图层(layer) → 特征(feature)、字段(field)
导入所需库
try:
from osgeo import gdal, ogr, osr
except:
import gdal, ogr, osr
读取文件
ogr.RegisterAll() # 注册所有的驱动
datasource = ogr.Open(shp_path, 0) # 0表示只读,1为可写
读取图层
layer_num = datasource.GetLayerCount() # 获取该数据源中的图层个数。一般shp只有一个,mdb、dxf等可能会有多个。
layer = datasource.GetLayerByIndex(0) # 获取第一个图层
left, right, down, up = layer.GetExtent() # 该图层的的边界(左经度、右经度、下纬度、下纬度)
字段与特征是紧密联系在一起的。一个图层中有许多特征(点/线/面),字段即特征的属性,每个图层会有总体的字段定义(类似于给一张表定义表头)。
字段
读取字段定义(与整个图层对应):
layer_defin = layer.GetLayerDefn() # 该图层所有字段的定义
field_num = layer_defin.GetFieldCount() # 该图层的字段数
field_defin = layer_definition.GetFieldDefn(0) # 根据下标,获取某个字段的定义
print(field.GetName(), field.GetNameRef()) # 字段名称
print(field.GetType(), field_dfn.GetTypeName()) # 字段的数据类型。
# 注:GetType()得到的是一个数字,和OGRFieldType有对应关系。比如2对应于Real,4对应于String
print(field.GetWidth(), field.GetPrecision()) # 字段的宽度,精度
创建字段(与整个图层对应):
layer.CreateField(ogr.FieldDefn("name",ogr.OFTString)) # 添加一个名为name、类型为ogr.OFTString(字符型)的字段
删除字段(与整个图层对应):
layer.DeleteField(index) # 通过字段下标删除字段
读取字段值(与某个特征对应):
feature.GetField("name") # 通过字段名查看字段,name表示字段名
修改字段值(与某个特征相对应):
feature.SetField("name","ww") # 设置当前特征的name字段值为"ww"
layer.SetFeature(feature)
特征
读取单个特征:
feature_count = layer.GetFeatureCount() # 该图层的特征个数
# 1、通过FID获取特征
feature = layer.GetFeature(index)
# 2、遍历特征
feature = layer.GetNextFeature()
while feature is not None:
print(" 第{}个要素:".format(feature.GetFID()))
feature = layer.GetNextFeature()
geometry = feature.GetGeometryRef() # 特征中的几何体
left, right, down, up = geometry.GetEnvelope() # 该特征的边界
删除特征:
id = feature.GetFID()
layer.DeleteFeature(int(id)) # 通过FID删除特征
筛选特征:
layer.SetAttributeFilter() # 通过属性表的SQL语句对图层中的要素进行筛选
layer.SetSpatialFilter() # 通过指定的几何对象对图层中的要素进行筛选
layer.SetSpatialFilterRect() # 通过指定的四至范围对图层中的要素进行筛选