Quellcode durchsuchen

实现根据表名传递geojson数据

drggboy vor 1 Monat
Ursprung
Commit
fc54392b7b
2 geänderte Dateien mit 28 neuen und 12 gelöschten Zeilen
  1. 12 4
      app/api/vector.py
  2. 16 8
      app/services/vector_service.py

+ 12 - 4
app/api/vector.py

@@ -43,10 +43,18 @@ async def export_vector_data(vector_id: int, db: Session = Depends(get_db)):
         background=BackgroundTasks().add_task(shutil.rmtree, result["temp_dir"]) if "temp_dir" in result else None
     )
 
-@router.get("/export/all", summary="导出所有矢量数据", description="将整个矢量数据表导出为GeoJSON文件")
-async def export_all_vector_data_api(db: Session = Depends(get_db)):
-    """导出整个矢量数据表为GeoJSON文件"""
-    result = vector_service.export_all_vector_data(db)
+@router.get("/export/all", summary="导出矢量数据", description="将指定的矢量数据表导出为GeoJSON文件")
+async def export_all_vector_data_api(table_name: str = "vector_data", db: Session = Depends(get_db)):
+    """导出指定矢量数据表为GeoJSON文件
+    
+    Args:
+        table_name (str): 要导出的矢量数据表名,默认为'vector_data'
+        db (Session): 数据库会话
+        
+    Returns:
+        FileResponse: GeoJSON文件下载响应
+    """
+    result = vector_service.export_all_vector_data(db, table_name)
     
     # 检查文件是否存在
     if not os.path.exists(result["file_path"]):

+ 16 - 8
app/services/vector_service.py

@@ -9,6 +9,7 @@ from typing import List
 import uuid
 import tempfile
 import struct
+from sqlalchemy.sql import text
 
 
 class DecimalEncoder(json.JSONEncoder):
@@ -154,18 +155,26 @@ def export_vector_data_batch(db: Session, vector_ids: List[int]):
     return _export_vector_data_to_file(vector_data_list, f"export_batch_{'_'.join(map(str, vector_ids))}")
 
 
-def export_all_vector_data(db: Session):
-    """导出整个矢量数据表为GeoJSON格式并保存到文件"""
-    # 查询所有矢量数据
-    vector_data_list = db.query(VectorData).all()
+def export_all_vector_data(db: Session, table_name: str = "surveydata"):
+    """导出指定的矢量数据表为GeoJSON格式并保存到文件
+    
+    Args:
+        db (Session): 数据库会话
+        table_name (str): 要导出的矢量数据表名,默认为'surveydata'
+        
+    Returns:
+        dict: 包含导出文件路径和临时目录的字典
+    """
+    # 使用动态表名查询
+    query = text(f"SELECT * FROM {table_name}")
+    vector_data_list = db.execute(query).fetchall()
 
     # 如果没有数据,抛出异常
     if not vector_data_list:
-        raise HTTPException(status_code=404, detail="数据库中没有矢量数据")
+        raise HTTPException(status_code=404, detail=f"表 {table_name} 中没有矢量数据")
 
     # 调用现有的导出函数
-    return _export_vector_data_to_file(vector_data_list, "export_all")
-
+    return _export_vector_data_to_file(vector_data_list, f"export_{table_name}")
 
 
 def parse_geom_field(geom_value) -> dict:
@@ -200,7 +209,6 @@ def parse_geom_field(geom_value) -> dict:
     return None
 
 
-
 def _export_vector_data_to_file(vector_data_list: List[VectorData], base_filename: str):
     """将矢量数据列表导出为 GeoJSON 文件"""
     features = []