ClipRasterByGrid.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. # -*- coding: utf-8 -*-
  2. __author__ = 'wanger'
  3. __description__ = '按照掩膜范围裁剪栅格数据'
  4. __date__ = '2024-11-25'
  5. __copyright__ = '(C) 2024 by siwei'
  6. __revision__ = '1.0'
  7. import subprocess
  8. from qgis._core import QgsProcessingParameterFolderDestination
  9. from qgis.core import (
  10. QgsRasterLayer,
  11. )
  12. from qgis.PyQt.QtCore import QCoreApplication
  13. from qgis.core import (QgsVectorLayer,
  14. QgsProcessingAlgorithm,
  15. QgsProcessingParameterFile)
  16. class ClipRasterByMaskProcessingAlgorithm(QgsProcessingAlgorithm):
  17. INPUT_SHP = 'INPUT_SHP'
  18. INPUT_RASTER = 'INPUT_RASTER'
  19. OUTPUT = 'OUTPUT'
  20. def tr(self, string):
  21. return QCoreApplication.translate('Processing', string)
  22. def createInstance(self):
  23. return ClipRasterByMaskProcessingAlgorithm()
  24. def name(self):
  25. return 'cliprasterbymask'
  26. def displayName(self):
  27. return self.tr('栅格裁剪')
  28. def group(self):
  29. return self.tr('栅格裁剪')
  30. def groupId(self):
  31. return 'rasterclip'
  32. def shortHelpString(self):
  33. return self.tr("遍历输入shp数据要素裁剪输入栅格,保存到输出文件夹。")
  34. def initAlgorithm(self, config=None):
  35. self.addParameter(QgsProcessingParameterFile(
  36. self.INPUT_SHP,
  37. '网格数据',
  38. extension='shp'
  39. ))
  40. self.addParameter(QgsProcessingParameterFile(
  41. self.INPUT_RASTER,
  42. '栅格数据',
  43. extension='tif'
  44. ))
  45. self.addParameter(QgsProcessingParameterFolderDestination(self.OUTPUT, '输出文件夹'))
  46. # 执行
  47. def processAlgorithm(self, parameters, context, feedback):
  48. input_shp = self.parameterAsString(parameters, self.INPUT_SHP, context)
  49. input_raster = self.parameterAsOutputLayer(parameters, self.INPUT_RASTER, context)
  50. output_raster = self.parameterAsString(parameters, self.OUTPUT, context)
  51. # 加载输入Shapefile和栅格数据
  52. vector_layer = QgsVectorLayer(input_shp, "vector_layer", "ogr")
  53. raster_layer = QgsRasterLayer(input_raster, "raster_layer")
  54. fields = vector_layer.fields()
  55. # 获取分辨率(像素大小)
  56. pixel_width = raster_layer.rasterUnitsPerPixelX()
  57. pixel_height = raster_layer.rasterUnitsPerPixelY()
  58. # 遍历输入图层的所有要素,并为每个要素保存一个单独的Shapefile文件
  59. total = 0
  60. for idx, feature in enumerate(vector_layer.getFeatures()):
  61. # 获取当前要素的几何数据
  62. geometry = feature.geometry()
  63. key = feature["新图号"]
  64. extent = geometry.boundingBox()
  65. # 计算裁剪范围的整数倍,确保裁剪范围对齐
  66. minX = extent.xMinimum()
  67. maxX = extent.xMaximum()
  68. minY = extent.yMinimum()
  69. maxY = extent.yMaximum()
  70. # 通过对齐最大值,确保裁剪范围完整
  71. maxX_aligned = maxX + pixel_width
  72. maxY_aligned = maxY + pixel_width
  73. minX_aligned = minX - pixel_width
  74. minY_aligned = minY - pixel_width
  75. # 设置 gdal_translate 命令和参数
  76. gdal_translate_cmd = [
  77. 'gdal_translate', # GDAL 工具名称
  78. '-projwin', str(minX_aligned), str(maxY_aligned), str(maxX_aligned), str(minY_aligned),
  79. # 裁剪范围(minX, maxY, maxX, minY)
  80. '-of', 'GTiff', # 输出格式为 GeoTIFF
  81. input_raster, # 输入栅格文件路径
  82. f"{output_raster}\\{key}.tif" # 输出文件路径
  83. ]
  84. print(gdal_translate_cmd)
  85. # 运行命令
  86. try:
  87. subprocess.run(gdal_translate_cmd, check=True)
  88. print("gdal_translate 执行成功!")
  89. total = total + 1
  90. except subprocess.CalledProcessError as e:
  91. print(f"gdal_translate 执行失败: {e}")
  92. return {
  93. "状态": f"处理成功,共裁剪出{total}块栅格数据。"
  94. }