raster.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. from fastapi import APIRouter, Depends, HTTPException, UploadFile, File
  2. from fastapi.responses import FileResponse
  3. from sqlalchemy.orm import Session
  4. from ..database import get_db
  5. from ..services import raster_service
  6. import os
  7. import shutil
  8. from fastapi import BackgroundTasks
  9. from typing import List
  10. from pydantic import BaseModel
  11. router = APIRouter()
  12. class RasterBatchExportRequest(BaseModel):
  13. raster_ids: List[int]
  14. @router.get("/{raster_id}", summary="获取栅格数据", description="获取指定ID的栅格数据信息")
  15. async def get_raster(raster_id: int, db: Session = Depends(get_db)):
  16. """获取指定ID的栅格数据信息"""
  17. return raster_service.get_raster_data(db, raster_id)
  18. @router.post("/import", summary="导入栅格数据", description="将TIFF格式的栅格数据导入到数据库中")
  19. async def import_raster_data(file: UploadFile = File(...), db: Session = Depends(get_db)):
  20. """导入栅格数据到数据库"""
  21. # 检查文件类型
  22. if not file.filename.endswith('.tif'):
  23. raise HTTPException(status_code=400, detail="只支持TIFF格式的栅格数据")
  24. return await raster_service.import_raster_data(file, db)
  25. @router.get("/{raster_id}/export", summary="导出栅格数据", description="将指定ID的栅格数据导出为TIFF文件")
  26. async def export_raster_data(raster_id: int, db: Session = Depends(get_db)):
  27. """导出指定ID的栅格数据为TIFF文件"""
  28. result = raster_service.export_raster_data(db, raster_id)
  29. # 检查文件是否存在
  30. if not os.path.exists(result["file_path"]):
  31. if "temp_dir" in result and os.path.exists(result["temp_dir"]):
  32. shutil.rmtree(result["temp_dir"])
  33. raise HTTPException(status_code=404, detail="导出文件不存在")
  34. # 返回文件下载
  35. return FileResponse(
  36. path=result["file_path"],
  37. filename=f"raster_{raster_id}.tif",
  38. media_type="image/tiff",
  39. background=BackgroundTasks().add_task(shutil.rmtree, result["temp_dir"]) if "temp_dir" in result else None
  40. )
  41. @router.post("/export/batch", summary="批量导出栅格数据", description="将多个ID的栅格数据批量导出为TIFF文件")
  42. async def export_raster_data_batch(request: RasterBatchExportRequest, db: Session = Depends(get_db)):
  43. """批量导出栅格数据为TIFF文件"""
  44. result = raster_service.export_raster_data_batch(db, request.raster_ids)
  45. # 检查文件是否存在
  46. if not os.path.exists(result["file_path"]):
  47. if "temp_dir" in result and os.path.exists(result["temp_dir"]):
  48. shutil.rmtree(result["temp_dir"])
  49. raise HTTPException(status_code=404, detail="导出文件不存在")
  50. # 返回文件下载
  51. return FileResponse(
  52. path=result["file_path"],
  53. filename=os.path.basename(result["file_path"]),
  54. media_type="application/zip",
  55. background=BackgroundTasks().add_task(shutil.rmtree, result["temp_dir"]) if "temp_dir" in result else None
  56. )