python使用gdal将栅格文件转为shp

python使用gdal将栅格文件转为shp

将栅格数据转为shp面

from osgeo import gdalconst, gdal, ogr, osr
import os


def raster2poly(raster, outshp):
    inraster = gdal.Open(raster)  # 读取路径中的栅格数据
    inband = inraster.GetRasterBand(1)  # 这个波段就是最后想要转为矢量的波段,如果是单波段数据的话那就都是1
    prj = osr.SpatialReference()
    prj.ImportFromWkt(inraster.GetProjection())  # 读取栅格数据的投影信息,用来为后面生成的矢量做准备

    drv = ogr.GetDriverByName("ESRI Shapefile")
    if os.path.exists(outshp):  # 若文件已经存在,则删除它继续重新做一遍
        drv.DeleteDataSource(outshp)
    Polygon = drv.CreateDataSource(outshp)  # 创建一个目标文件
    Poly_layer = Polygon.CreateLayer(raster[:-4], srs=prj, geom_type=ogr.wkbMultiPolygon)  # 对shp文件创建一个图层,定义为多个面类
    newField = ogr.FieldDefn('value', ogr.OFTReal)  # 给目标shp文件添加一个字段,用来存储原始栅格的pixel value
    Poly_layer.CreateField(newField)

    gdal.FPolygonize(inband, None, Poly_layer, 0)  # 核心函数,执行的就是栅格转矢量操作
    Polygon.SyncToDisk()
    Polygon = None


raster2poly("input_tif.tif", "output_shp.shp")

将栅格数据转为shp点

# 002  转为shp点
from osgeo import ogr, osr, gdal
import numpy as np
import pandas as pd

inputTIF = "input_tif.tif"  # 待输入的TIF路径
NoData_value = -999  # 掩膜遮挡部分的值 NoData
result_path = 'output_shp.shp'  # shp结果文件的存放路径


def createPoint_strNosrs(reader, result_path):
    """
    创建无空间参考且字段类型全部为string的点shp文件
    :param reader: 待生成shp文件的表属性信息 为dict格式 其中最后两个key为点的位置信息  key='point'
    :param result_path: 待生成的shp 文件的存储地址
    :return:
    """
    # 设置shapefile驱动
    driver = ogr.GetDriverByName("ESRI Shapefile")

    # 创建数据源
    data_source = driver.CreateDataSource(result_path)

    # 创建图层
    layer = data_source.CreateLayer("point", geom_type=ogr.wkbPoint)  # 无坐标系文件

    # 初始化字段
    l_list = []
    l_col = list(reader[0].keys())
    for i in range(len(l_col) - 1):
        l_list.append({list(reader[0].keys())[i]: ogr.FieldDefn(str(l_col[i][:10]), ogr.OFTString)})
        ogr.FieldDefn(str(l_col[i][:10]), ogr.OFTString).SetWidth(120)  # 设置长度
        layer.CreateField(ogr.FieldDefn(str(l_col[i][:10]), ogr.OFTString))  # 创建字段

    for row in reader:
        # 创建特征
        feature = ogr.Feature(layer.GetLayerDefn())
        # 和设置字段内容进行关联  ,从数据源中写入数据

        # 设置创建字段
        for use_i in l_list:
            feature.SetField(str(list(use_i.keys())[0][:10]), row[list(use_i.keys())[0]])

        # 创建WKT 文本点
        wkt = row['point']

        # 生成实体点
        point = ogr.CreateGeometryFromWkt(wkt)

        # 使用点
        feature.SetGeometry(point)
        # 添加点
        layer.CreateFeature(feature)
        # 关闭 特征
        feature = None
    # 关闭数据
    data_source = None

# 读取栅格文件
data = gdal.Open(inputTIF, gdal.GA_ReadOnly)
data1= data.GetRasterBand(1).ReadAsArray()

#存储着栅格数据集的地理坐标信息
transform = data.GetGeoTransform()

# NoData_value = data1[0][0]  # 找到tif中代表NoData的值 以免报错
res = np.where(data1 != NoData_value )  # 获取栅格数据中 除去掩膜部分的点的坐标索引

lon = transform[3] + res[1] * transform[4] + res[0] * transform[5]
lat = transform[0] + res[1] * transform[1] + res[0] * transform[2]
values = data1[data1 != NoData_value ]  # 获取栅格数据中  除去掩膜部分的点的值

point = ['POINT (' + str(lat[k]) + ' ' + str(lon[k])+')' for k in range(len(lon))]


dataUse = pd.DataFrame({"value": values, "point": point})

reader = dataUse.to_dict(orient='records')
createPoint_strNosrs(reader, result_path)
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值