【Python&GIS】Python处理矢量数据的基本操作(查询、修改、删除、新建)

        ogr库是一个处理地理空间矢量数据的开源库。它可以读取多种数据格式,进行地理处理、属性表操作、数据分析等操作。目前ogr和osr库已集成到GDAL库中,可以对栅格数据、矢量数据进行处理分析,被3S的研究人员广泛应用。感兴趣的可以自己去了解一下,不懂得可以一起交流!

        最近发现之前写的代码都快不认识了,所以及时做笔记真的很重要。今天给大家分享下如何使用Python对矢量数据进行编辑,顺便自己也复习一下。

一、安装库

        osgeo这个库真的非常强大,大家可以自己去了解一下。矢量数据分为datasource,layer,feature三个层次!!!

from osgeo import gdal, osr, ogr

二、查询矢量数据

1.打开矢量数据

def Open_Vector(path_shp):
    ds = ogr.Open(path_shp, True)
    # True表示以读写方式打开
    layer = ds.GetLayer(0)
    # 获取图层,图层

2.获取字段属性

def Get_Data(layer):
    feature_count = layer.GetFeatureCount()
    # 获取要素的数量
    feature = layer.GetFeature(1)
    # 获取shp中第一个要素
    field_count = layer.GetLayerDefn().GetFieldCount()
    # 获取要素的字段数
    field_data = feature.GetField("1")
    # 获取字段“1”的值

3.获取字段的值

def Get_field(layer):
    for feature in layer:
        # feature的意义就是GIS中泛指的要素(一个shp中包含多少个面)
        field_data = feature.GetField("1")
        # 获取字段“1”的值
        print(field_data)
    # 获取要素的字段值!!!!!

4.获取图层地理范围

def Get_Spatial(layer):
    left, right, down, up = layer.GetExtent()
    print(left, right, down, up)
    # 获取图层的地理范围

5.获取某一要素的地理范围

def Get_feature_Spatial(layer):
    feature = layer.GetFeature(0)
    geom = feature.GetGeometryRef()
    # 获取该要素的地理空间范围
    left, right, down, up = geom.GetEnvelope()
    # 获取四个角点的坐标

三、修改矢量数据

1.修改要素的字段值

def Repair_field(layer):
    feature = layer.GetFeature(1)
    # 获取shp中第一个要素
    feature.SetField("Id", "3")
    # 将当前要素的"Id"字段值改为"3"
    layer.SetFeature(feature)
    # 修改要素的字段值!!!!!

四、创建新矢量

1.创建新字段

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)
    # 创建新的字段!!!!!

2.创建新的矢量文件(shp)

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

五、删除矢量数据

1.删除字段

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的字段
    # 删除字段!!!!!

2.删除要素

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过程中写过的一些代码。有些部分借鉴了前人以及官网的教程,如有侵权请联系作者删除,大家有问题可以随时留言交流,博主会及时回复。

你可能感兴趣的:(Sensing,python,开发语言,矢量编辑,GIS)