Python OGR 矢量操作

矢量数据的读取顺序:文件(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()  # 通过指定的四至范围对图层中的要素进行筛选

猜你喜欢

转载自blog.csdn.net/qq_40292148/article/details/132432557