mission.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import json
  2. import os.path
  3. import traceback
  4. import requests
  5. from flask import request, jsonify
  6. from flask_restx import Resource, Namespace, reqparse
  7. from app.defines import StatesCode
  8. from app.mission_jobs.application import Application
  9. from app.utils.create_geojsonl import verify_geotiff
  10. from config import Config
  11. from starearth.utils.general_utils import print_log
  12. config = Config()
  13. ns = Namespace('mission', description='任务管理 API接口')
  14. slice_mission_parser = reqparse.RequestParser(bundle_errors=True)
  15. slice_mission_parser.add_argument(name='title', type=str, location='form', required=False, help='dms 标题')
  16. slice_mission_parser.add_argument(name='content', type=str, location='form', required=False, help='dms 描述')
  17. slice_mission_parser.add_argument(name='c_name', type=str, location='form', required=False, help='dms 名称')
  18. slice_mission_parser.add_argument(name='c_content', type=str, location='form', required=False, help='dms 描述')
  19. slice_mission_parser.add_argument(name='c_note', type=str, location='form', required=False, help='dms 备注')
  20. slice_mission_parser.add_argument(name='data_path', type=str, location='form', required=False, help='数据目录')
  21. slice_mission_parser.add_argument(name='tile_size', type=int, location='form', required=False, help='瓦片大小')
  22. slice_mission_parser.add_argument(name='tile_format', type=str, location='form', required=False,
  23. help='瓦片格式:png、jpeg、tif')
  24. slice_mission_parser.add_argument(name='auto_zoom', type=int, location='form', required=False,
  25. help='是否自动切片,0:否,1:是')
  26. slice_mission_parser.add_argument(name='epsg', type=str, location='form', required=False, help='投影信息:EPSG:4326、EPSG:3857')
  27. slice_mission_parser.add_argument(name='min_zoom', type=int, location='form', required=False, help='最小切片层级')
  28. slice_mission_parser.add_argument(name='max_zoom', type=int, location='form', required=False, help='最大切片层级')
  29. @ns.route('/mission_slice_api')
  30. class MissionAPI(Resource):
  31. @ns.doc(id='slice', description='切片')
  32. @ns.expect(slice_mission_parser)
  33. def post(self):
  34. """添加任务"""
  35. try:
  36. form = request.form
  37. # dms
  38. title = form.get('title')
  39. content = form.get('content')
  40. c_name = form.get('c_name')
  41. c_content = form.get('c_content')
  42. c_note = form.get('c_note')
  43. data_path = form.get('data_path')
  44. tile_size = int(form.get('tile_size', 256))
  45. tile_grid = form.get('tile_grid', 'WebMercatorQuad')
  46. tile_format = form.get('tile_format', 'png')
  47. auto_zoom = int(form.get('auto_zoom', 1))
  48. epsg = form.get('epsg', 'EPSG:4326')
  49. min_zoom = int(form.get('min_zoom', 1))
  50. max_zoom = int(form.get('max_zoom', 19))
  51. if not data_path:
  52. return jsonify(code=StatesCode.PARA_ERROR, message='输入路径错误')
  53. file_list = []
  54. for file in os.listdir(data_path):
  55. if file.endswith('.tif'):
  56. file_list.append(file)
  57. if not file_list:
  58. return jsonify(code=StatesCode.PARA_ERROR, message='路径无有效文件')
  59. err_file = []
  60. # 验证数据有错误数据直接返回错误数据
  61. for file_name in os.listdir(data_path):
  62. input_file = os.path.join(data_path, file_name)
  63. if os.path.splitext(file_name)[-1] == ".tif":
  64. try:
  65. verify_geotiff(input_file, epsg)
  66. except Exception:
  67. err_file.append(file_name)
  68. if err_file:
  69. return jsonify(code=StatesCode.PARA_ERROR, message='输入文件错误:{},不支持的投影'.format(err_file))
  70. output_path = os.path.join(config.common.OUTPUT_PATH, os.path.basename(data_path))
  71. dms_params = {
  72. 'title': title,
  73. 'content': content,
  74. 'c_name': c_name,
  75. 'c_content': c_content,
  76. 'c_note': c_note
  77. }
  78. application = Application(config)
  79. application.new_mission(
  80. dms_params=dms_params,
  81. data_path=data_path,
  82. output_path=output_path,
  83. tile_size=tile_size,
  84. tile_grid=tile_grid,
  85. tile_format=tile_format,
  86. epsg=epsg,
  87. auto_zoom=auto_zoom,
  88. min_zoom=min_zoom,
  89. max_zoom=max_zoom,
  90. )
  91. return {"code": StatesCode.SUCCESS,
  92. "message": "开始切片预计需要%s分钟,请耐心等待" % str(len(os.listdir(data_path)) * 8)}
  93. except Exception as err:
  94. traceback.print_exc()
  95. return {"code": StatesCode.UNKNOWN_ERROR, "message": str(err)}