ogr库是一个处理地理空间矢量数据的开源库。它可以读取多种数据格式,进行地理处理、属性表操作、数据分析等操作。目前ogr和osr库已集成到GDAL库中,可以对栅格数据、矢量数据进行处理分析,被3S的研究人员广泛应用。感兴趣的可以自己去了解一下,不懂得可以一起交流!
最近发现之前写的代码都快不认识了,所以及时做笔记真的很重要。今天给大家分享下如何使用Python对矢量数据进行编辑,顺便自己也复习一下。
osgeo这个库真的非常强大,大家可以自己去了解一下。矢量数据分为datasource,layer,feature三个层次!!!
from osgeo import gdal, osr, ogr
def Open_Vector(path_shp):
ds = ogr.Open(path_shp, True)
# True表示以读写方式打开
layer = ds.GetLayer(0)
# 获取图层,图层
def Get_Data(layer):
feature_count = layer.GetFeatureCount()
# 获取要素的数量
feature = layer.GetFeature(1)
# 获取shp中第一个要素
field_count = layer.GetLayerDefn().GetFieldCount()
# 获取要素的字段数
field_data = feature.GetField("1")
# 获取字段“1”的值
def Get_field(layer):
for feature in layer:
# feature的意义就是GIS中泛指的要素(一个shp中包含多少个面)
field_data = feature.GetField("1")
# 获取字段“1”的值
print(field_data)
# 获取要素的字段值!!!!!
def Get_Spatial(layer):
left, right, down, up = layer.GetExtent()
print(left, right, down, up)
# 获取图层的地理范围
def Get_feature_Spatial(layer):
feature = layer.GetFeature(0)
geom = feature.GetGeometryRef()
# 获取该要素的地理空间范围
left, right, down, up = geom.GetEnvelope()
# 获取四个角点的坐标
def Repair_field(layer):
feature = layer.GetFeature(1)
# 获取shp中第一个要素
feature.SetField("Id", "3")
# 将当前要素的"Id"字段值改为"3"
layer.SetFeature(feature)
# 修改要素的字段值!!!!!
def Create_field(layer):
# layer.CreateField(ogr.FieldDefn('name', ogr.OFTString)) # ogr.OFTString表示字符型
new_field = ogr.FieldDefn('value', ogr.OFTReal) # 给目标shp文件添加一个字段
new_field.SetWidth(32)
new_field.SetPrecision(16)
layer.CreateField(new_field)
# 创建新的字段!!!!!
def Create_shp(shp):
target_proj = osr.SpatialReference()
# 初始化osr.SpatialReference对象以形成一个合法的坐标系统
target_proj.ImportFromEPSG(4326)
driver = ogr.GetDriverByName("ESRI Shapefile")
polygon = driver.CreateDataSource(shp) # 创建数据资源
layer_polygon = polygon.CreateLayer("Shp", srs=target_proj, geom_type=ogr.wkbMultiPolygon)
# 创建图层,定义多面
new_field = ogr.FieldDefn('value', ogr.OFTReal)
layer_polygon.CreateField(new_field)
# 给目标shp文件添加一个字段
layer_defn = layer_polygon.GetLayerDefn()
# 定义图层
feature = ogr.Feature(layer_defn)
# 创建要素
feature.SetField("value", 5)
# 给该要素的value字段定义为5
geom = ogr.CreateGeometryFromWkt("POLYGON ((0 0,20 0,10 15,0 0))")
# 定义一个空间图形
feature.SetGeometry(geom)
# 将图形赋值到要素上
layer_polygon.CreateFeature(feature)
# 创建该要素,写入
layer_polygon = None
def Delete_field(layer):
field_name = "2"
field_count = layer.GetLayerDefn().GetFieldCount()
# 获取要素的字段数
for i in range(field_count):
# 循环该要素的所有字段
if field_name == layer.GetLayerDefn().GetFieldDefn(i).GetName():
# 判断字段名是否等于输入的字段名,如果是返回它的索引值
layer.DeleteField(i)
# 删除索引为i的字段
# 删除字段!!!!!
def Delete_feature(layer):
feature_count = layer.GetFeatureCount()
# 获取要素的数量
for i in range(0, feature_count):
if layer.GetFeature(i).GetField("1") == 0:
layer.DeleteFeature(i)
for feat in layer:
if feat.GetField('Area') < 20 or feat.GetField('Area') > 3000:
layer.DeleteFeature(feat.GetFID())
# 删除要素!!!!!
由于我代码中已给详细的解释,所以就不单独加以文字说明了。本文章主要是分享个人在学习Python过程中写过的一些代码。有些部分借鉴了前人以及官网的教程,如有侵权请联系作者删除,大家有问题可以随时留言交流,博主会及时回复。