利用Python实现矢量逐个图斑裁剪栅格,形成图斑对应的栅格文件

7 篇文章 1 订阅
5 篇文章 0 订阅

平时工作中存在,利用矢量裁剪栅格的要求,但多数情况下基于完整的单个矢量裁剪栅格,非利用矢量中某个图斑裁剪栅格,因此做以下工作。
1、将矢量按照单个图斑要素拆分成shp
这里用了县区的矢量。代码如下:

from osgeo import gdal
import osgeo.ogr as ogr
input_shape = r"C:/分类/县区投影.shp" 

driver = ogr.GetDriverByName("ESRI Shapefile")
dataSource = driver.Open(input_shape, 1)
layer = dataSource.GetLayer()
print('the length of layer:', len(layer))
for i, feature in enumerate(layer):
    # 新建DataSource,Layer 
    fid = feature.GetField('DISTNAME')#读取当前Feature某一字段的属性值
    out_ds = driver.CreateDataSource(fid+".shp")
    out_lyr = out_ds.CreateLayer(fid+".shp", layer.GetSpatialRef(), ogr.wkbPolygon)
    def_feature = out_lyr.GetLayerDefn()
    # 生成Shapefile文件
    # current_union = layer[0].Clone()
    geometry = feature.GetGeometryRef()
    current_union = geometry.Clone()
    current_union = current_union.Union(geometry).Clone()

    out_feature = ogr.Feature(def_feature)
    out_feature.SetGeometry(current_union)
    out_lyr.ResetReading()
    out_lyr.CreateFeature(out_feature)

效果如下,原始为一个完整的图层,拆分后为单独的多个图层。
原矢量:
在这里插入图片描述

拆分后矢量:
在这里插入图片描述
2、利用拆分后的矢量循环裁剪栅格
这里使用的掩膜提取的方法进行裁剪,裁剪不规则的范围,非外接矩形。
代码如下:

from osgeo import gdal
import osgeo.ogr as ogr
# tif输入路径,打开文件
input_raster = r"C:/DEM/坡度.tif"
# 栅格文件路径,打开栅格文件
input_raster=gdal.Open(input_raster)
#匹配文件名字,可以编写读取文件夹文件来替换
name =['开县',..........., '石柱土家族自治县']
for n in name:
    #开始裁剪,一行代码
    ds = gdal.Warp(n+".tif",#生成的栅格
              input_raster,
              format = 'GTiff',
              #矢量文件
              cutlineDSName = n+".shp",      
              #cutlineWhere="FIELD = 'whatever'",
              dstNodata = 0)

原栅格:
在这里插入图片描述
拆分后栅格:
在这里插入图片描述
3、逐栅格统计信息
根据个人需要逐个统计相应信息,这里做的是统计坡谱信息熵。
在这里插入图片描述

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现按照矢量数据的属性裁剪栅格数据,可以使用Python中的GDAL库和OGR库。具体步骤如下: 1.读取矢量数据和栅格数据,可以使用OGR库和GDAL库中的相关函数进行读取和处理。 2.获取矢量数据的属性信息,可以使用OGR库中的GetField函数获取属性值。 3.遍历栅格数据中的每一个像素,判断该像素是否在矢量数据范围内。 4.如果该像素在矢量数据范围内,则根据矢量数据的属性值进行裁剪操作。 5.将裁剪后的栅格数据保存为新的栅格数据。 下面是一个简单的示例代码: ```python from osgeo import gdal, ogr # 读取矢量数据 vector = ogr.Open('vector.shp') layer = vector.GetLayer() feature = layer.GetFeature(0) field_value = feature.GetField('field_name') # 读取栅格数据 raster = gdal.Open('raster.tif') band = raster.GetRasterBand(1) cols = raster.RasterXSize rows = raster.RasterYSize # 创建输出栅格数据 driver = gdal.GetDriverByName('GTiff') out_raster = driver.Create('out_raster.tif', cols, rows, 1, band.DataType) out_band = out_raster.GetRasterBand(1) # 遍历栅格数据 for i in range(rows): for j in range(cols): # 获取像素值 pixel_value = band.ReadAsArray(j, i, 1, 1)[0][0] # 判断像素是否在矢量数据范围内 if is_in_vector(layer, j, i): # 根据属性值进行裁剪操作 if pixel_value == field_value: out_band.WriteArray(pixel_value, j, i) # 保存输出栅格数据 out_band.FlushCache() out_band.ComputeStatistics(False) out_raster.SetProjection(raster.GetProjection()) out_raster.SetGeoTransform(raster.GetGeoTransform()) out_raster = None ``` 其中,is_in_vector函数可以根据像素的坐标判断该像素是否在矢量数据范围内。具体实现可以参考OGR库中的SpatialReference类和Geometry类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值