clip.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. from qgis._core import QgsWkbTypes
  2. from qgis.core import (
  3. QgsVectorLayer,
  4. QgsFeature,
  5. QgsField,
  6. QgsVectorFileWriter
  7. )
  8. import os
  9. # 输入Shapefile路径
  10. input_shp = "E:\\projects\\遥感技术部需求\\裁剪栅格\\data\\grid0.shp"
  11. # 加载输入Shapefile图层
  12. input_layer = QgsVectorLayer(input_shp, "input_layer", "ogr")
  13. # 检查图层是否有效
  14. if not input_layer.isValid():
  15. print("Failed to load input layer")
  16. else:
  17. print("Input layer loaded successfully")
  18. # 获取输入图层的字段信息
  19. fields = input_layer.fields()
  20. # 输出目录路径(所有新的Shapefile文件会保存在这个目录下)
  21. output_dir = "E:\\projects\\遥感技术部需求\\裁剪栅格\\output\\"
  22. # 遍历输入图层的所有要素,并为每个要素保存一个单独的Shapefile文件
  23. for idx, feature in enumerate(input_layer.getFeatures()):
  24. # 获取当前要素的几何数据
  25. geometry = feature.geometry()
  26. # 创建一个新的 Shapefile 文件名,可以使用索引或 ID 来命名
  27. output_shp = os.path.join(output_dir, f"output_{idx + 1}.shp")
  28. # 创建一个新的Shapefile图层来保存单个几何
  29. # 我们假设输入图层是多边形类型,若输入为其他类型,需修改
  30. output_layer = QgsVectorLayer(f"{input_layer.geometryType()}?crs={input_layer.crs().authid()}", f"output_{idx + 1}",
  31. "memory")
  32. output_layer_data_provider = output_layer.dataProvider()
  33. # 将输入图层的字段添加到新图层中
  34. output_layer_data_provider.addAttributes(fields) # 添加字段到数据提供者
  35. output_layer.updateFields() # 更新字段信息
  36. # 创建一个新的要素并设置其几何和属性
  37. new_feature = QgsFeature()
  38. new_feature.setGeometry(geometry)
  39. new_feature.setAttributes(feature.attributes())
  40. # 将新的要素添加到新图层
  41. output_layer_data_provider.addFeature(new_feature)
  42. # 创建输出shapefile
  43. writer = QgsVectorFileWriter(output_shp, 'UTF-8', fields, QgsWkbTypes.MultiPolygon, input_layer.crs(),
  44. 'ESRI Shapefile')
  45. writer.addFeature(feature)
  46. # 完成写入并关闭输出文件
  47. del writer