【Python&GIS】GDAL栅格转面&计算矢量面积

        GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理。

        Python的GDAL库作为栅格数据的处理转换库,其支持几百种栅格数据格式,如常见的TIFF、ENVI、HFA、HDF4等。因为遥感影像大部分都是栅格数据,所以GDAL库非常适合处理遥感影像、如光谱指数计算、波段合成、批量下载、栅格转面等。

一、导入所需要的库

        os库用来判断文件是否存在,gdal库用来打开栅格数据并实现栅格转换,osr库用于定义投影,ogr库用于创建并编辑矢量。

var code = "3085904e-43cb-46ec-b554-3611f7b23acb"
import os
from osgeo import gdal, osr, ogr

二、栅格转面

        栅格转面是指将栅格数据转换为连续的面状要素,通常在GIS数据分析和空间建模中使用。其主要意义包括:

  1. 提高数据精度:栅格数据是离散的,而面状要素是连续的,将栅格数据转换为连续的面状要素可以提高数据的精度。

  2. 便于空间分析:栅格数据在进行空间分析和建模时存在不足,而面状要素具有更强的可视化和解释性,便于空间分析和建模。

  3. 方便数据交换:在不同GIS软件和平台之间,栅格数据的格式和处理方式可能存在差异。将栅格数据转换为面状要素可以方便数据的交换和共享。

1.读取栅格数据

# 栅格转面
ds_raster = gdal.Open(different_data)  # 读取路径中的栅格数据
band_raster = ds_raster.GetRasterBand(1)  # 获取需要转为矢量的波段

2.创建投影驱动,并导入投影信息

proj_raster = osr.SpatialReference()
proj_raster.ImportFromWkt(ds_raster.GetProjection())
# 将栅格数据的投影信息赋值给矢量

3.创建矢量驱动,并创建新的属性字段

driver = ogr.GetDriverByName("ESRI Shapefile")
polygon = driver.CreateDataSource(out_shp)  # 创建数据资源
layer_polygon = polygon.CreateLayer("Shp", srs=proj_raster, geom_type=ogr.wkbMultiPolygon)  # 创建图层,定义多面
new_field = ogr.FieldDefn('value', ogr.OFTReal)  # 给目标shp文件添加一个字段,用来存储原始栅格的pixel value
layer_polygon.CreateField(new_field)

4.执行栅格转面函数并关闭数据驱动

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

5.完整代码

def Grid_faceting(different_data, out_shp):
    """
    :param different_data: 输入需要转换的栅格数据
    :param out_shp: 输出矢量的路径
    :return: 
    """
    print("正在栅格转面。。。")
    # 栅格转面
    ds_raster = gdal.Open(different_data)  # 读取路径中的栅格数据
    band_raster = ds_raster.GetRasterBand(1)  # 获取需要转为矢量的波段
    proj_raster = osr.SpatialReference()
    proj_raster.ImportFromWkt(ds_raster.GetProjection())
    # 将栅格数据的投影信息赋值给矢量
    driver = ogr.GetDriverByName("ESRI Shapefile")
    if os.path.exists(out_shp):  # 若文件已经存在,则删除它继续重新做一遍
        driver.DeleteDataSource(out_shp)
    polygon = driver.CreateDataSource(out_shp)  # 创建数据资源
    layer_polygon = polygon.CreateLayer("Shp", srs=proj_raster, geom_type=ogr.wkbMultiPolygon)  # 创建图层,定义多面
    new_field = ogr.FieldDefn('value', ogr.OFTReal)  # 给目标shp文件添加一个字段,用来存储原始栅格的pixel value
    layer_polygon.CreateField(new_field)
    gdal.FPolygonize(band_raster, None, layer_polygon, 0)  # 核心函数,执行的就是栅格转矢量操作
    polygon.SyncToDisk()
    polygon = None

三、计算矢量面积

1.创建数据驱动,打开数据

driver = ogr.GetDriverByName("ESRI Shapefile")  # 创建数据驱动
ds = driver.Open(path_shp, 1)  # 创建数据资源

2.创建新字段“Area”用来保存计算得到的面积

layer = ds.GetLayer()
new_field = ogr.FieldDefn("Area", ogr.OFTReal)  # 创建新的字段
new_field.SetWidth(32)
new_field.SetPrecision(16)
layer.CreateField(new_field)

3.循环图层内的所有要素,并计算面积

for feature in layer:
    geom = feature.GetGeometryRef()
    geom2 = geom.Clone()
    area = geom2.GetArea()  # 默认为平方米
    # area = area / 1000000 # 转化为平方公里
    feature.SetField("Area", area)
    # feature.GetField('Area')
    layer.SetFeature(feature)

4.完整代码

def Get_polygon_area(path_shp):
    """
    :param path_shp: 输入矢量文件
    :return: 
    """
    print("正在获取矢量面积。。。")
    driver = ogr.GetDriverByName("ESRI Shapefile")  # 创建数据驱动
    ds = driver.Open(path_shp, 1)  # 创建数据资源
    layer = ds.GetLayer()
    new_field = ogr.FieldDefn("Area", ogr.OFTReal)  # 创建新的字段
    new_field.SetWidth(32)
    new_field.SetPrecision(16)
    layer.CreateField(new_field)
    number = 0
    for feature in layer:
        geom = feature.GetGeometryRef()
        geom2 = geom.Clone()
        area = geom2.GetArea()  # 默认为平方米
        # area = area / 1000000 # 转化为平方公里
        feature.SetField("Area", area)
        # feature.GetField('Area')
        layer.SetFeature(feature)
    ds = None

  

        本文章主要是分享个人在学习Python过程中写过的一些代码。有些部分借鉴了前人以及官网的教程,如有侵权请联系作者删除,大家有问题可以随时留言交流,博主会及时回复。

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
您好!要使用GDAL库在Python中进行栅格矢量操作,您可以按照以下步骤进行: 1. 安装GDAL库:在Python环境中安装GDAL库,可以使用pip命令来安装,如下所示: ``` pip install gdal ``` 2. 导入GDAL库:在Python脚本中导入GDAL库,可以使用以下代码: ``` from osgeo import gdal, ogr ``` 3. 打开栅格文件:使用GDAL库的Open函数打开栅格文件,如下所示: ``` raster_ds = gdal.Open('path/to/raster/file.tif') ``` 4. 获取栅格图层:使用GDAL库的GetRasterBand函数获取栅格图层,如下所示: ``` band = raster_ds.GetRasterBand(1) ``` 5. 创建矢量数据源:使用GDAL库的CreateDataSource函数创建矢量数据源,如下所示: ``` driver = ogr.GetDriverByName('ESRI Shapefile') vector_ds = driver.CreateDataSource('path/to/vector/file.shp') ``` 6. 创建矢量图层:使用矢量数据源的CreateLayer函数创建矢量图层,如下所示: ``` layer = vector_ds.CreateLayer('layer_name', geom_type=ogr.wkbPolygon) ``` 7. 定义矢量属性:使用图层的CreateField函数定义矢量属性,如下所示: ``` field_defn = ogr.FieldDefn('attribute_name', ogr.OFTString) layer.CreateField(field_defn) ``` 8. 栅格矢量:使用GDAL库的Polygonize函数将栅格转换为矢量,如下所示: ``` gdal.Polygonize(band, None, layer, 0, [], callback=None) ``` 9. 保存矢量文件:使用矢量数据源的SyncToDisk函数保存矢量文件,如下所示: ``` vector_ds.SyncToDisk() ``` 这些是使用GDAL库在Python中进行栅格矢量的基本步骤。您可以根据自己的需求对代码进行进一步的调整和优化。希望对您有所帮助!如果有任何问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RS迷途小书童

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值