import_counties.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. """
  4. 导入县级GeoJSON数据脚本
  5. """
  6. import json
  7. import logging
  8. from pathlib import Path
  9. from sqlalchemy.orm import Session
  10. from app.database import SessionLocal
  11. from app.models.county import County
  12. # 配置日志
  13. logging.basicConfig(level=logging.INFO)
  14. logger = logging.getLogger(__name__)
  15. def import_counties_from_geojson(file_path: str, db: Session):
  16. """从GeoJSON文件导入县级数据
  17. Args:
  18. file_path: GeoJSON文件路径
  19. db: 数据库会话
  20. """
  21. try:
  22. # 读取GeoJSON文件
  23. with open(file_path, 'r', encoding='utf-8') as f:
  24. geojson_data = json.load(f)
  25. # 检查是否为FeatureCollection
  26. if geojson_data['type'] != 'FeatureCollection':
  27. raise ValueError("输入文件必须是GeoJSON FeatureCollection格式")
  28. # 导入每个Feature
  29. for feature in geojson_data['features']:
  30. try:
  31. # 使用模型类方法创建County实例
  32. county = County.from_geojson_feature(feature)
  33. db.add(county)
  34. logger.info(f"成功导入: {county.name}")
  35. except Exception as e:
  36. logger.error(f"导入失败: {feature.get('properties', {}).get('县名', '未知')} - {str(e)}")
  37. continue
  38. # 提交事务
  39. db.commit()
  40. logger.info("数据导入完成")
  41. except Exception as e:
  42. db.rollback()
  43. logger.error(f"导入过程出错: {str(e)}")
  44. raise
  45. def main():
  46. """主函数"""
  47. # 获取数据文件路径
  48. data_dir = Path(__file__).parent.parent.parent / 'data'
  49. geojson_file = data_dir / 'counties.geojson'
  50. if not geojson_file.exists():
  51. logger.error(f"找不到数据文件: {geojson_file}")
  52. return
  53. # 创建数据库会话
  54. db = SessionLocal()
  55. try:
  56. import_counties_from_geojson(str(geojson_file), db)
  57. finally:
  58. db.close()
  59. if __name__ == '__main__':
  60. main()