app.py 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. from flask import Flask, render_template, request, jsonify
  2. import psycopg2
  3. from psycopg2.extras import DictCursor
  4. import logging
  5. import ollama
  6. import json
  7. import datetime
  8. app = Flask(__name__)
  9. # 配置日志
  10. logging.basicConfig(level=logging.INFO)
  11. logger = logging.getLogger(__name__)
  12. # 连接数据库
  13. conn = psycopg2.connect(
  14. dbname="real3d",
  15. user="postgres",
  16. password="postgis",
  17. host="192.168.100.30",
  18. port="5432"
  19. )
  20. # 后台接口
  21. @app.route("/")
  22. def home():
  23. return render_template('index.html')
  24. # 接收消息,大模型解析
  25. @app.route('/msg', methods=['POST'])
  26. def inputMsg():
  27. # 从请求中获取JSON数据
  28. data = request.get_json()
  29. # 检查是否接收到数据
  30. if not data:
  31. return jsonify({"error": "No data received"}), 400
  32. # 打印接收到的消息
  33. print(data['msg'])
  34. msg = data['msg']
  35. # 调用大模型解析
  36. # 这里调用大模型,并返回解析结果
  37. # 生成提示信息
  38. # 定义输入信息变量
  39. # 定义因子选择和用地类型
  40. factor_selection = ['规划因子', '永久基本农田', '城镇开发边界内', '生态保护红线', '文化保护区', '自然保护地', '风景名胜区', '权属因子', '国有使用权', '防控因子', '河道管理线', '水库', '公益林', '地形因子', '坡度', '邻避因子', '火葬场', '垃圾处理场', '污水处理场', '高压线', '变电站',
  41. '古树', '市政设施', '交通', '城市道路', '主要出入口', '管线', '排水', '供水', '燃气', '电力', '电信', '公共服务设施', '十五分钟社区生活圈邻里中心', '社区服务设施', '零售商业场所', '医疗卫生设施', '教育场所', '幼儿园服务半径', '小学服务半径', '为老服务设施', '文化活动设施', '体育运动场所']
  42. land_types = ['园地', '耕地', '林地', '草地', '湿地', '公共卫生用地', '老年人社会福利用地', '儿童社会福利用地', '残疾人社会福利用地', '其他社会福利用地', '零售商业用地', '批发市场用地', '餐饮用地', '旅馆用地', '公用设施营业网点用地', '娱乐用地', '康体用地', '一类工业用地', '二类工业用地', '广播电视设施用地', '环卫用地', '消防用地', '干渠', '水工设施用地', '其他公用设施用地', '公园绿地', '防护绿地', '广场用地', '军事设施用地', '使领馆用地', '宗教用地', '文物古迹用地', '监教场所用地', '殡葬用地', '其他特殊用地', '河流水面', '湖泊水面', '水库水面', '坑塘水面', '沟渠', '冰川及常年积雪', '渔业基础设施用海', '增养殖用海', '捕捞海域', '工业用海', '盐田用海', '固体矿产用海', '油气用海', '可再生能源用海', '海底电缆管道用海', '港口用海', '农业设施建设用地', '耕地', '园地', '林地', '工矿用地', '畜禽养殖设施建设用地', '水产养殖设施建设用地', '城镇住宅用地', '草地', '湿地', '留白用地', '陆地水域', '游憩用海', '特殊用海', '特殊用地', '其他海域', '居住用地', '绿地与开敞空间用地', '水田', '水浇地', '旱地', '果园', '茶园', '橡胶园', '其他园地', '乔木林地', '竹林地', '城镇社区服务设施用地', '农村宅基地', '农村社区服务设施用地', '机关团体用地', '科研用地', '文化用地', '教育用地', '体育用地', '医疗卫生用地', '社会福利用地', '商业用地',
  43. '商务金融用地', '二类农村宅基地', '图书与展览用地', '文化活动用地', '高等教育用地', '中等职业教育用地', '体育训练用地', '其他交通设施用地', '供水用地', '排水用地', '供电用地', '供燃气用地', '供热用地', '通信用地', '邮政用地', '医院用地', '基层医疗卫生设施用地', '田间道', '盐碱地', '沙地', '裸土地', '裸岩石砾地', '村道用地', '村庄内部道路用地', '渔业用海', '工矿通信用海', '其他土地', '公共管理与公共服务用地', '仓储用地', '交通运输用地', '公用设施用地', '交通运输用海', '航运用海', '路桥隧道用海', '风景旅游用海', '文体休闲娱乐用海', '军事用海', '其他特殊用海', '空闲地', '田坎', '港口码头用地', '管道运输用地', '城市轨道交通用地', '城镇道路用地', '交通场站用地', '一类城镇住宅用地', '二类城镇住宅用地', '三类城镇住宅用地', '一类农村宅基地', '商业服务业用地', '三类工业用地', '一类物流仓储用地', '二类物流仓储用地', '三类物流仓储用地', '盐田', '对外交通场站用地', '公共交通场站用地', '社会停车场用地', '中小学用地', '幼儿园用地', '其他教育用地', '体育场馆用地', '灌木林地', '其他林地', '天然牧草地', '人工牧草地', '其他草地', '森林沼泽', '灌丛沼泽', '沼泽草地', '其他沼泽地', '沿海滩涂', '内陆滩涂', '红树林地', '乡村道路用地', '种植设施建设用地', '娱乐康体用地', '其他商业服务业用地', '工业用地', '采矿用地', '物流仓储用地', '储备库用地', '铁路用地', '公路用地', '机场用地']
  44. # 生成提示信息
  45. prompt = f"""请扮演文本提取工具,基于以下因子选择和用地类型提取其对应的相关数据,并提取其距离的相关数据,
  46. 因子选择:{str(factor_selection)},
  47. 用地类型:{str(land_types)},
  48. landType是用地类型,
  49. ydmjbegin是用地面积的开始值,是较小的那个数,ydmjend是用地面积的结束值,是较大的那个数,单位统一转换为亩
  50. yxyz中的name是因子选择,defalt是条件,defaultvalue是距离,公里、千米的单位转换为米,
  51. 请把这句话:"{msg}",基于因子选择和用地类型提取其对应的相关数据,并提取其距离的相关数据。转换为以下格式:
  52. "landType":"林地","ydmjbegin":30,"ydmjend":50,"yxyz":["name":"幼儿园服务半径","default":"大于","defaultValue":"300"],"useMultiple":false,"useLandType":true,"multipleDistance":0
  53. 并把yxyz中大于、小于、大于等于、小于等于、介于分别替换为gt、lt、get、let、between,然后把结果进行输出"""
  54. try:
  55. res = ollama.generate(
  56. model="qwen2:7b",
  57. stream=False,
  58. prompt=prompt,
  59. options={"temperature": 0},
  60. format="json"
  61. )
  62. print(res["response"])
  63. except Exception as e:
  64. print(f"生成过程中出现错误: {e}")
  65. json_res = res["response"]
  66. json_res = json.loads(json_res)
  67. # 组织成选址需要的数据格式
  68. json_res = jsonResToDict(json_res)
  69. # 返回响应
  70. return jsonify(json_res)
  71. # 获取因子信息
  72. def getFactorByName(name):
  73. with conn.cursor(cursor_factory=DictCursor) as cur:
  74. sql = "SELECT id,bsm FROM base.t_fzss_fzxz_factor WHERE name = %s"
  75. complete_sql = cur.mogrify(sql, (name,)).decode('utf-8')
  76. logger.info(f"Executing SQL: {complete_sql}")
  77. cur.execute(sql, (name,))
  78. # res = cur.fetchall()
  79. res = cur.fetchone()
  80. id = str(res['id'])
  81. return res
  82. def jsonResToDict(json_res):
  83. now = datetime.datetime.now()
  84. formatted_time = now.strftime("%Y%m%d%H%M%S")
  85. res = {
  86. "xzmj": 1500,
  87. "xmmc": "规划选址项目_"+formatted_time,
  88. "jsdw": "建设单位",
  89. "ydxz_bsm": "07", #TODO: 从数据库中获取
  90. "ydmjbegin": json_res["ydmjbegin"],
  91. "ydmjend": json_res["ydmjbegin"],
  92. "geomId": "ecc08a3f4f234befb7f49f9809534164", # TODO: 从数据库中获取
  93. # TODO: 循环遍历
  94. # "yxyz": [
  95. # {
  96. # "id": "259e5bbaab434dbfb9c679bd44d4bfa4",
  97. # "name": "幼儿园服务半径",
  98. # "bsm": "TB_YEY",
  99. # "conditionInfo": {
  100. # "spatial_type": "distance",
  101. # "default": "lt",
  102. # "hasValue": true,
  103. # "defaultValue": "300",
  104. # "unit": "米",
  105. # "clip": false
  106. # }
  107. # }
  108. # ],
  109. "useMultiple": json_res["multipleDistance"],
  110. "useLandType": json_res["multipleDistance"],
  111. "multipleDistance": json_res["multipleDistance"]
  112. }
  113. return res
  114. # getFactorByName("幼儿园服务半径")
  115. if __name__ == '__main__':
  116. app.run()