import json import os.path import traceback import requests from flask import request, jsonify from flask_restx import Resource, Namespace, reqparse from app.defines import StatesCode from app.mission_jobs.application import Application from app.utils.create_geojsonl import verify_geotiff from config import Config from starearth.utils.general_utils import print_log config = Config() ns = Namespace('mission', description='任务管理 API接口') slice_mission_parser = reqparse.RequestParser(bundle_errors=True) slice_mission_parser.add_argument(name='title', type=str, location='form', required=False, help='dms 标题') slice_mission_parser.add_argument(name='content', type=str, location='form', required=False, help='dms 描述') slice_mission_parser.add_argument(name='c_name', type=str, location='form', required=False, help='dms 名称') slice_mission_parser.add_argument(name='c_content', type=str, location='form', required=False, help='dms 描述') slice_mission_parser.add_argument(name='c_note', type=str, location='form', required=False, help='dms 备注') slice_mission_parser.add_argument(name='data_path', type=str, location='form', required=False, help='数据目录') slice_mission_parser.add_argument(name='tile_size', type=int, location='form', required=False, help='瓦片大小') slice_mission_parser.add_argument(name='tile_format', type=str, location='form', required=False, help='瓦片格式:png、jpeg、tif') slice_mission_parser.add_argument(name='auto_zoom', type=int, location='form', required=False, help='是否自动切片,0:否,1:是') slice_mission_parser.add_argument(name='epsg', type=str, location='form', required=False, help='投影信息:EPSG:4326、EPSG:3857') slice_mission_parser.add_argument(name='min_zoom', type=int, location='form', required=False, help='最小切片层级') slice_mission_parser.add_argument(name='max_zoom', type=int, location='form', required=False, help='最大切片层级') @ns.route('/mission_slice_api') class MissionAPI(Resource): @ns.doc(id='slice', description='切片') @ns.expect(slice_mission_parser) def post(self): """添加任务""" try: form = request.form # dms title = form.get('title') content = form.get('content') c_name = form.get('c_name') c_content = form.get('c_content') c_note = form.get('c_note') data_path = form.get('data_path') tile_size = int(form.get('tile_size', 256)) tile_grid = form.get('tile_grid', 'WebMercatorQuad') tile_format = form.get('tile_format', 'png') auto_zoom = int(form.get('auto_zoom', 1)) epsg = form.get('epsg', 'EPSG:4326') min_zoom = int(form.get('min_zoom', 1)) max_zoom = int(form.get('max_zoom', 19)) if not data_path: return jsonify(code=StatesCode.PARA_ERROR, message='输入路径错误') file_list = [] for file in os.listdir(data_path): if file.endswith('.tif'): file_list.append(file) if not file_list: return jsonify(code=StatesCode.PARA_ERROR, message='路径无有效文件') err_file = [] # 验证数据有错误数据直接返回错误数据 for file_name in os.listdir(data_path): input_file = os.path.join(data_path, file_name) if os.path.splitext(file_name)[-1] == ".tif": try: verify_geotiff(input_file, epsg) except Exception: err_file.append(file_name) if err_file: return jsonify(code=StatesCode.PARA_ERROR, message='输入文件错误:{},不支持的投影'.format(err_file)) output_path = os.path.join(config.common.OUTPUT_PATH, os.path.basename(data_path)) dms_params = { 'title': title, 'content': content, 'c_name': c_name, 'c_content': c_content, 'c_note': c_note } application = Application(config) application.new_mission( dms_params=dms_params, data_path=data_path, output_path=output_path, tile_size=tile_size, tile_grid=tile_grid, tile_format=tile_format, epsg=epsg, auto_zoom=auto_zoom, min_zoom=min_zoom, max_zoom=max_zoom, ) return {"code": StatesCode.SUCCESS, "message": "开始切片预计需要%s分钟,请耐心等待" % str(len(os.listdir(data_path)) * 8)} except Exception as err: traceback.print_exc() return {"code": StatesCode.UNKNOWN_ERROR, "message": str(err)}