geo_analysis.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import json
  2. from shapely import wkt
  3. from database import Database
  4. from typing import Any, List, Dict
  5. database = Database()
  6. async def _intersect_query(
  7. geom: str,
  8. distance: float,
  9. sql_template: str,
  10. srid: int = 4490
  11. ) -> List[Dict[str, Any]]:
  12. """
  13. 通用的空间相交查询函数。
  14. :param geom: WKT格式的几何对象字符串
  15. :param distance: 缓冲区距离(米)
  16. :param sql_template: SQL模板,需包含 {bufWkt} 占位符
  17. :param srid: 空间参考ID,默认为4490
  18. :return: 查询结果列表
  19. """
  20. geometry = wkt.loads(geom)
  21. buf = geometry.buffer(distance / 111194)
  22. bufWkt = buf.wkt
  23. if not bufWkt.startswith(f'SRID={srid}'):
  24. bufWkt = f'SRID={srid};' + bufWkt
  25. sql = sql_template.format(bufWkt=bufWkt)
  26. # logging.debug(sql)
  27. dataList = await database.execute_query(sql)
  28. # logging.debug(dataList)
  29. return dataList
  30. async def intersect_kfq(geom: str) -> List[Dict[str, Any]]:
  31. """
  32. 查询缓冲区内的开发区信息
  33. """
  34. sql_template = (
  35. "select kfqmc as name, gljgdz as address, zdcy as primaryIndustry, "
  36. "kfqjb1 as kfqjb, st_asgeojson(shape) as geom "
  37. "from sde.kfq where st_intersects(shape, '{bufWkt}')"
  38. )
  39. return await _intersect_query(geom, distance=5000, sql_template=sql_template)
  40. async def intersect_gyyd(geom: str) -> List[Dict[str, Any]]:
  41. """
  42. 查询缓冲区内的工业用地信息
  43. """
  44. sql_template = (
  45. "select tdqlr as name, tdzl as address, st_asgeojson(shape) as geom "
  46. "from sde.zjgyydc where st_intersects(shape, '{bufWkt}')"
  47. )
  48. return await _intersect_query(geom, distance=1000, sql_template=sql_template)