当前位置:   article > 正文

【Python&RS】GDAL批量裁剪遥感影像/栅格数据_python遥感影像批量裁剪

python遥感影像批量裁剪

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

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

一、GDAL库的安装

        因为博主的GDAL库的安装有些时候了,所以pip install 的方法能不能安装需要自己尝试。这里推荐大家下载对应包,使用本地安装。

1.打开GDAL库的下载链接,选择自己电脑Python对应的版本,别下载错了哦!

2.然后按住Win+R,输入cmd进入命令行。在cmd终端中,使用cd跳转至下载GDAL包的目录。如 cd /d G:\try\,G:\try\是你狭窄GDAL包的文件夹目录。然后在命令行里输入pip GDAL-3.4.3-cp38-cp38-win_amd64.whl,这是你下载的GDAL包的名称,每个人不一样,别傻乎乎地用我的!

 3.可以在编译器里查看是否安装成功,博主使用的是PyCharm,在设置中可以看到是否安装成功。当然你也可以先编写程序,如果没安装成功,程序会报错=。=

 

二、编写程序

1.导入计算所需库

       GDAL是我们安装的栅格数据处理库。os是系统操作库,用来遍历文件夹。time库用来计算程序执行时间,可以不要。

  1. import time
  2. import os
  3. from osgeo import gdal

2.查看GDAL库中的裁剪函数

        其中,out_raster是输出的栅格数据路径,in_raster是输入的栅格数据路径,cultineDSName是用于裁剪的矢量数据。

  1. ds = gdal.Warp(out_raster, in_raster, format='GTiff',
  2. cutlineDSName=shp_name,
  3. cropToCutline=True,
  4. cutlineWhere=None, dstNodata=0)

        Warp函数主要参数说明,官网有说明文档。因为本人懒得翻译,所以这里参考了这篇文章:Python使用GDAL矢量裁剪栅格,设置背景值为空白(已解决)

  1. gdal.Warp(options = [], format = 'GTiff', outputBounds = None,
  2. outputBoundsSRS = one, xRes = None, yRes = None,
  3. targetAlignedPixels = False, width = 0, height = 0, srcSRS = None,
  4. dstSRS = None, srcAlpha = False, dstAlpha = False, warpOptions = None,
  5. errorThreshold = None, warpMemoryLimit = None, creationOptions = None,
  6. outputType = GDT_Unknown, workingType = GDT_Unknown, resampleAlg = None,
  7. srcNodata = None, dstNodata = None, multithread = False, tps = False,
  8. rpc = False, geoloc = False, polynomialOrder = None,
  9. transformerOptions = None, cutlineDSName = None, cutlineLayer = None,
  10. cutlineWhere = None, cutlineSQL = None, cutlineBlend = None,
  11. ropToCutline = False, copyMetadata = True, metadataConflictValue = None,
  12. setColorInterpretation = False, callback = None, callback_data = None):
  13. 其中:
  14. options — 可以是一个字符串数组,一个字符串或者令其为空值,但是使用后面其他的参数来定义。
  15. format — 输出的格式 (例如"GTiff"等)。
  16. outputBounds — 在目标空间参考系统的输出数据集的范围,形式为 (minX,minY, maxX, maxY) 。
  17. outputBoundsSRS — 如果在dstSRS中没有定义的话,使用这个关键字定义输出数据集的边界的空间参考系统。
  18. xRes, yRes — 在目标参考系统中的像元大小。
  19. targetAlignedPixels —是否强制输出边界为输出分辨率的倍数。
  20. width — 输出栅格的像素列数。
  21. height — 输出栅格的像素行数。
  22. srcSRS —源空间参考系统。
  23. dstSRS — 输出空间参考系统。
  24. srcAlpha — 是否强制将输入数据集的最后一个波段作为alpha波段。
  25. dstAlpha — 是否强制创建一个输出数据集的alpha波段。
  26. outputType — 输出类型 (例如gdal.GDT_Byte等)
  27. workingType — working type (gdal.GDT_Byte, etc…)
  28. warpOptions —变形选项列表。
  29. errorThreshold --近似转换的误差阈值(用像素表示) 。
  30. warpMemoryLimit — 工作缓存大小,单位是bytes
  31. resampleAlg — 重采样模式。
  32. creationOptions — 创建选项列表。
  33. srcNodata — 源数据的nodata值。
  34. dstNodata — 输出数据的nodata值。
  35. multithread — 是否多线程计算和输入输出操作。
  36. tps— 是否使用Thin Plate Spline GCP 转换器。
  37. rpc— 是否使用RPC转换器。
  38. geoloc — 是否使用GeoLocation数组转换器。
  39. polynomialOrder — 多项式GCP插值的阶数。
  40. transformerOptions — 转换参数
  41. cutlineDSName — 剪切线数据集名称。这里的剪切线是指对影像进行剪切的时候所使用的矢量图层。
  42. cutlineLayer — 剪切线图层名称。
  43. cutlineWhere — 剪切线的WHERE语句。
  44. cutlineSQL — 剪切线的SQL 语句。
  45. cutlineBlend — 以像素为单位的剪切线混合距离。
  46. cropToCutline — 是否使用剪切线的extent作为输出的界线。
  47. copyMetadata — 是否拷贝源数据的元数据。
  48. metadataConflictValue — 元数据冲突值。
  49. setColorInterpretation — 是否强制将输入波段的颜色解释赋予输出波段。
  50. callback — 回调函数。
  51. callback_data — 回调函数数据

3.编写遍历代码,实现使用一个或多个shp批量裁剪多个栅格数据

  1. shp_files = os.listdir(in_shape)
  2. # 以列表展开所有目录下的文件名
  3. for shp_file in shp_files:
  4. # 从列表中遍历
  5. if shp_file.endswith('.shp'):
  6. # 判断是否为shp文件
  7. shp_name = os.path.join(in_shape, shp_file)
  8. # 定义shp文件的目录+名称
  9. files = os.listdir(in_path)
  10. # 打开需要裁剪的文件夹,将所有文件以列表的形式列出
  11. for file in files:
  12. if file[-4:] == '.tif':
  13. # 判断文件是否为.tif结尾
  14. filename = os.path.join(in_path, file)
  15. # 确定找到的文件名
  16. in_raster = gdal.Open(filename)
  17. out_raster = os.path.join(out_path, file[-8:-4]+shp_file[:-4]+".tif")
  18. ds = gdal.Warp(out_raster, in_raster, format='GTiff',
  19. cutlineDSName=shp_name,
  20. cropToCutline=True,
  21. cutlineWhere=None, dstNodata=0)
  22. ds = None
  23. # 关闭处理空间,释放内存

三、完整代码

  1. # -*- coding: utf-8 -*-
  2. """
  3. @Time : 2023/5/19 9:05
  4. @Auth : RS迷途小书童
  5. @File :Clip Raster Data.py
  6. @IDE :PyCharm
  7. @Purpose :基于GDAL批量裁剪栅格数据
  8. """
  9. import time
  10. import os
  11. from osgeo import gdal
  12. def clip_batch(in_path, out_path, in_shape):
  13. """
  14. :param in_path: 需要裁剪的文件夹
  15. :param out_path: 输出文件夹
  16. :param in_shape: 存放shp的文件夹
  17. :return:
  18. """
  19. shp_files = os.listdir(in_shape)
  20. # 以列表展开所有目录下的文件名
  21. for shp_file in shp_files:
  22. # 从列表中遍历
  23. if shp_file.endswith('.shp'):
  24. # 判断是否为shp文件
  25. shp_name = os.path.join(in_shape, shp_file)
  26. # 定义shp文件的目录+名称
  27. files = os.listdir(in_path)
  28. # 打开需要裁剪的文件夹,将所有文件以列表的形式列出
  29. for file in files:
  30. if file[-4:] == '.tif':
  31. # 判断文件是否为.tif结尾
  32. filename = os.path.join(in_path, file)
  33. # 确定找到的文件名
  34. in_raster = gdal.Open(filename)
  35. out_raster = os.path.join(out_path, file[-8:-4]+shp_file[:-4]+".tif")
  36. ds = gdal.Warp(out_raster, in_raster, format='GTiff',
  37. cutlineDSName=shp_name,
  38. cropToCutline=True,
  39. cutlineWhere=None, dstNodata=0)
  40. ds = None
  41. # 关闭处理空间,释放内存
  42. if __name__ == "__main__":
  43. # 直接执行函数
  44. start = time.perf_counter() # 开始时间
  45. in_shape = r"G:\pology" # 矢量范围
  46. in_path = r"G:\30mlandcoverdata" # 输入栅格路径
  47. out_path = r"G:\landusedata\3" # 输出栅格路径
  48. clip_batch(in_path, out_path, in_shape)
  49. end = time.perf_counter() # 结束时间
  50. print('finish')
  51. print('Running time: %s Seconds' % (end - start))
  52. # 展示程序运行时间

        如果大家在学习Python或者RS时有什么问题,可以随时留言交流!如果大家对批量处理有兴趣同样可以留言给博主,博主会分享相关代码以供学习!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/310545
推荐阅读
相关标签
  

闽ICP备14008679号