ClipRasterByGrid.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  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 os
  8. from qgis._core import QgsRasterFileWriter, QgsProcessingParameterFolderDestination
  9. from qgis.core import (
  10. QgsVectorLayer,
  11. QgsRasterLayer,
  12. QgsFeature,
  13. QgsGeometry
  14. )
  15. import processing
  16. from PyQt5.QtCore import QFileInfo
  17. from qgis.analysis import QgsRasterCalculator, QgsRasterCalculatorEntry
  18. from qgis.PyQt.QtCore import QCoreApplication
  19. from qgis._core import QgsSpatialIndex, QgsField, QgsRectangle, QgsProcessingParameterVectorDestination, \
  20. QgsVectorFileWriter, QgsWkbTypes, QgsProcessingParameterNumber, QgsProcessingParameterBoolean, QgsGeometry, \
  21. QgsFeature
  22. from qgis.core import (QgsProcessing,
  23. QgsVectorLayer,
  24. QgsFeatureSink,
  25. QgsProcessingException,
  26. QgsProcessingAlgorithm,
  27. QgsProcessingParameterFile,
  28. QgsProcessingParameterFeatureSource,
  29. QgsProcessingParameterFeatureSink)
  30. from qgis import processing
  31. class ClipRasterByMaskProcessingAlgorithm(QgsProcessingAlgorithm):
  32. INPUT_SHP = 'INPUT_SHP'
  33. INPUT_RASTER = 'INPUT_RASTER'
  34. OUTPUT = 'OUTPUT'
  35. def tr(self, string):
  36. return QCoreApplication.translate('Processing', string)
  37. def createInstance(self):
  38. return ClipRasterByMaskProcessingAlgorithm()
  39. def name(self):
  40. return 'cliprasterbymask'
  41. def displayName(self):
  42. return self.tr('按照掩膜范围裁剪栅格数据')
  43. def group(self):
  44. return self.tr('栅格裁剪')
  45. def groupId(self):
  46. return 'rasterclip'
  47. def shortHelpString(self):
  48. return self.tr("遍历输入shp数据要素裁剪输入栅格,保存到输出文件夹。")
  49. def initAlgorithm(self, config=None):
  50. self.addParameter(QgsProcessingParameterFile(
  51. self.INPUT_SHP,
  52. '网格数据',
  53. extension='shp'
  54. ))
  55. self.addParameter(QgsProcessingParameterFile(
  56. self.INPUT_RASTER,
  57. '栅格数据',
  58. extension='tif'
  59. ))
  60. # 通过 setExtensions 方法设置多个扩展名
  61. # self.parameter(self.INPUT_RASTER).setExtensions(['tif', 'img']) # 支持 .shp, .csv, .txt
  62. self.addParameter(QgsProcessingParameterFolderDestination(self.OUTPUT, '输出文件夹'))
  63. # 执行
  64. def processAlgorithm(self, parameters, context, feedback):
  65. input_shp = self.parameterAsString(parameters, self.INPUT_SHP, context)
  66. input_raster = self.parameterAsOutputLayer(parameters, self.INPUT_RASTER, context)
  67. output_raster = self.parameterAsString(parameters, self.OUTPUT, context)
  68. # 输入Shapefile路径
  69. # input_shp = "E:\\projects\\遥感技术部需求\\裁剪栅格\\data\\grid_extent.shp"
  70. # 输入栅格数据路径
  71. # input_raster = "D:\\gisdata\\tif\\unnamed_卫图_Level_12.tif"
  72. # 输出裁剪后的栅格路径
  73. # output_raster = "E:\\projects\\遥感技术部需求\\裁剪栅格\\output\\"
  74. # 加载输入Shapefile和栅格数据
  75. vector_layer = QgsVectorLayer(input_shp, "vector_layer", "ogr")
  76. raster_layer = QgsRasterLayer(input_raster, "raster_layer")
  77. fields = vector_layer.fields()
  78. # 遍历输入图层的所有要素,并为每个要素保存一个单独的Shapefile文件
  79. total = 0
  80. for idx, feature in enumerate(vector_layer.getFeatures()):
  81. # 获取当前要素的几何数据
  82. geometry = feature.geometry()
  83. key = feature["新图号"]
  84. # 创建一个新的 Shapefile 文件名,可以使用索引或 ID 来命名
  85. output_shp = os.path.join(output_raster, f"{key}.shp")
  86. # 创建输出shapefile
  87. writer = QgsVectorFileWriter(output_shp, 'UTF-8', fields, QgsWkbTypes.MultiPolygon, vector_layer.crs(),
  88. 'ESRI Shapefile')
  89. writer.addFeature(feature)
  90. # 完成写入并关闭输出文件
  91. del writer
  92. # 使用QGIS的processing模块进行栅格裁剪
  93. params = {
  94. 'INPUT': raster_layer, # 输入栅格
  95. 'MASK': output_shp, # 用于裁剪的矢量图层
  96. 'OUTPUT': f"{output_raster}\\{key}.tif", # 输出裁剪后的栅格文件
  97. 'CROP_TO_CUTLINE': True
  98. }
  99. # 执行裁剪操作
  100. processing.run('gdal:cliprasterbymasklayer', params)
  101. print(f"Cropped raster saved to {output_raster}")
  102. total = total + 1
  103. return {
  104. "状态": f"处理成功,共裁剪出{total}块栅格数据。"
  105. }