from qgis._core import QgsWkbTypes
from qgis.core import (
    QgsVectorLayer,
    QgsFeature,
    QgsField,
    QgsVectorFileWriter
)
import os

# 输入Shapefile路径
input_shp = "E:\\projects\\遥感技术部需求\\裁剪栅格\\data\\grid0.shp"

# 加载输入Shapefile图层
input_layer = QgsVectorLayer(input_shp, "input_layer", "ogr")

# 检查图层是否有效
if not input_layer.isValid():
    print("Failed to load input layer")
else:
    print("Input layer loaded successfully")

# 获取输入图层的字段信息
fields = input_layer.fields()

# 输出目录路径（所有新的Shapefile文件会保存在这个目录下）
output_dir = "E:\\projects\\遥感技术部需求\\裁剪栅格\\output\\"

# 遍历输入图层的所有要素，并为每个要素保存一个单独的Shapefile文件
for idx, feature in enumerate(input_layer.getFeatures()):
    # 获取当前要素的几何数据
    geometry = feature.geometry()

    # 创建一个新的 Shapefile 文件名，可以使用索引或 ID 来命名
    output_shp = os.path.join(output_dir, f"output_{idx + 1}.shp")

    # 创建一个新的Shapefile图层来保存单个几何
    # 我们假设输入图层是多边形类型，若输入为其他类型，需修改
    output_layer = QgsVectorLayer(f"{input_layer.geometryType()}?crs={input_layer.crs().authid()}", f"output_{idx + 1}",
                                  "memory")
    output_layer_data_provider = output_layer.dataProvider()

    # 将输入图层的字段添加到新图层中
    output_layer_data_provider.addAttributes(fields)  # 添加字段到数据提供者
    output_layer.updateFields()  # 更新字段信息

    # 创建一个新的要素并设置其几何和属性
    new_feature = QgsFeature()
    new_feature.setGeometry(geometry)
    new_feature.setAttributes(feature.attributes())

    # 将新的要素添加到新图层
    output_layer_data_provider.addFeature(new_feature)

    # 创建输出shapefile
    writer = QgsVectorFileWriter(output_shp, 'UTF-8', fields, QgsWkbTypes.MultiPolygon, input_layer.crs(),
                                 'ESRI Shapefile')
    writer.addFeature(feature)

    # 完成写入并关闭输出文件
    del writer
