소스 검색

完善目录结构,修改获取数据接口,dms修改bbox

zhangnaiwen 1 년 전
부모
커밋
ab1b52b121
7개의 변경된 파일140개의 추가작업 그리고 56개의 파일을 삭제
  1. 4 4
      config/config.yml
  2. 3 3
      docker-compose.yml
  3. 6 3
      src/app/api/file.py
  4. 11 37
      src/app/api/mission.py
  5. 45 5
      src/app/mission_jobs/application.py
  6. 35 3
      src/app/mission_jobs/image_slice_job.py
  7. 36 1
      src/app/utils/utils.py

+ 4 - 4
config/config.yml

@@ -1,8 +1,8 @@
 common:
   CACHE_PATH: /data/cache  # 缓存目录
-  OUTPUT_PATH:  /data/output  # 输出目录
-  IMAGE_PATH: /data/image  # 影像数据目录
-  TILESET_PATH: /data/tileset  # 3Dtiles数据目录
+  OUTPUT_PATH:  /data/map_result/output_tiles # 输出目录
+  IMAGE_PATH: /data/map_source/tif  # 影像数据目录
+  TILESET_PATH: /data/map_result/3dtiles  # 3Dtiles数据目录
   WORKER_NUM: 5
   JOB_TIMEOUT: 36000
 
@@ -19,7 +19,7 @@ oauth:
   serviceId: 0
 
 nginx:
-  URL: http://121.43.55.7:80
+  URL: http://121.43.55.7:65458
 
 redis:
   # redis配置

+ 3 - 3
docker-compose.yml

@@ -17,9 +17,9 @@ service:
 
   volumes:
     - /data/sky_stareath_tiler/logs:/data/logs # 日志
-    - /data/image:/data/image  # 影像数据目录
-    - /data/tileset:/data/tileset  # 3Dtiles数据目录
-    - /data/output:/data/output  # 切片输出目录
+    - /data/map_source/tif:/data/map_source/tif  # 影像数据目录
+    - /data/map_result/3dtiles:/data/map_result/3dtiles  # 3Dtiles数据目录
+    - /data/map_result/output_tiles:/data/map_result/output_tiles  # 切片输出目录
     - ./config:/work/sky_stareath_tiler/config  # 配置文件目录,包括软件配置信息
     - ./src:/work/sky_stareath_tiler/src  # 挂载代码测试时使用
   privileged: true

+ 6 - 3
src/app/api/file.py

@@ -1,11 +1,12 @@
 import json
+import os.path
 import traceback
 
 from flask import request, jsonify
 from flask_restx import Resource, Namespace, reqparse
 
 from app.defines import StatesCode
-from app.utils.utils import get_directory_tree
+from app.utils.utils import dir_and_file_tree, get_directory_tree
 from config import Config
 
 ns = Namespace('file', description='文件管理 API接口')
@@ -26,14 +27,16 @@ class GetFilesApi(Resource):
             type = request.args.get('type')
             if type == 'tif':
                 path = config.common.IMAGE_PATH
+                ext = '.tif'
             elif type == '3Dtiles':
                 path = config.common.TILESET_PATH
+                ext = 'tileset.json'
             else:
                 return jsonify(code=StatesCode.PARA_ERROR, message='数据类型错误')
 
-            structure = get_directory_tree(path)
+            structure = dir_and_file_tree(path, ext, [])
 
-            return jsonify(code=StatesCode.SUCCESS, message='获取成功', path=path, data=structure)
+            return jsonify(code=StatesCode.SUCCESS, message='获取成功', data=structure)
         except Exception as e:
             traceback.print_exc()
 

+ 11 - 37
src/app/api/mission.py

@@ -55,7 +55,7 @@ class MissionAPI(Resource):
             tile_grid = form.get('tile_grid', 'WebMercatorQuad')
             tile_format = form.get('tile_format', 'png')
             auto_zoom = int(form.get('auto_zoom', 1))
-            epsg = int(form.get('epsg', 'EPSG:4326'))
+            epsg = form.get('epsg', 'EPSG:4326')
             min_zoom = int(form.get('min_zoom', 1))
             max_zoom = int(form.get('max_zoom', 19))
 
@@ -75,43 +75,19 @@ class MissionAPI(Resource):
             if err_file:
                 return jsonify(code=StatesCode.PARA_ERROR, message='输入文件错误:{},不支持的投影'.format(err_file))
 
-                # 获取token
-            login_data = {
-                'userName': config.oauth.userName,
-                'password': config.oauth.password,
-                'clientId': config.oauth.clientId,
-                'serviceId': config.oauth.serviceId
+            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
             }
-            login_rep = requests.post(config.oauth.URL + '/api/user/login', data=login_data).json()
-
-            # 添加DMS
-            headers = {'token': login_rep.get('message'), 'Content-Type': 'application/x-www-form-urlencoded'}
-            dms_data = \
-                {
-                    'content': json.dumps({
-                        "title": title,
-                        "content": content,
-                        "c_tile_grid": "墨卡托投影切片",
-                        "c_name": c_name,
-                        "c_tile_format": tile_format,
-                        "c_epsg": '4326',
-                        "c_url": config.nginx.URL + config.common.OUTPUT_PATH + '/{z}/{x}/{y}.%s' % tile_format,
-                        "c_content": c_content,
-                        "c_note": c_note,
-                        "c_tile_size": tile_size,
-                        "c_zoom_min": min_zoom,
-                        "c_zoom_max": max_zoom,
-                        "c_auto_zoom": auto_zoom
-                    }),
-                    'modelId': config.dms.modelId,
-                    'columnId': config.dms.columnId
-                }
-            dms_rep = requests.post(config.dms.URL + '/content/addContent', headers=headers, data=dms_data).json()
-            dms_id = dms_rep['content']
-
-            application = Application()
+            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,
@@ -119,8 +95,6 @@ class MissionAPI(Resource):
                 auto_zoom=auto_zoom,
                 min_zoom=min_zoom,
                 max_zoom=max_zoom,
-                # dms
-                dms_id=dms_id
             )
 
             return {"code": StatesCode.SUCCESS,

+ 45 - 5
src/app/mission_jobs/application.py

@@ -1,3 +1,7 @@
+import json
+import os
+
+import requests
 import rq
 
 from app.mission_jobs.image_slice_job import image_slice_job
@@ -7,16 +11,51 @@ from connection import Connection
 
 class Application:
 
-    # def __init__(self, config):
-    #     self._config = config
+    def __init__(self, config):
+        self._config = config
+
+    def new_mission(self, dms_params, data_path, output_path, tile_size, tile_grid, tile_format, epsg, auto_zoom, min_zoom, max_zoom):
+
+        # 获取token
+        login_data = {
+            'userName': self._config.oauth.userName,
+            'password': self._config.oauth.password,
+            'clientId': self._config.oauth.clientId,
+            'serviceId': self._config.oauth.serviceId
+        }
+        login_rep = requests.post(self._config.oauth.URL + '/api/user/login', data=login_data).json()
+
+        # 添加DMS
+        headers = {'token': login_rep.get('message'), 'Content-Type': 'application/x-www-form-urlencoded'}
+        dms_data = \
+            {
+                'content': json.dumps({
+                    "title": dms_params.get('title'),
+                    "content": dms_params.get('content'),
+                    "c_tile_grid": "墨卡托投影切片",
+                    "c_name": dms_params.get('c_name'),
+                    "c_tile_format": tile_format,
+                    "c_epsg": '4326',
+                    "c_url": self._config.nginx.URL + '/%s/{z}/{x}/{y}.%s' % (os.path.basename(data_path), tile_format),
+                    "c_content": dms_params.get('c_content'),
+                    "c_note": dms_params.get('c_note'),
+                    "c_tile_size": tile_size,
+                    "c_zoom_min": min_zoom,
+                    "c_zoom_max": max_zoom,
+                    "c_auto_zoom": auto_zoom,
+                    "bbox": ''
+                }, ensure_ascii=False),
+                'modelId': self._config.dms.modelId,
+                'columnId': self._config.dms.columnId
+            }
+        dms_rep = requests.post(self._config.dms.URL + '/content/addContent', headers=headers, data=dms_data).json()
+        dms_id = dms_rep['content']
 
-    def new_mission(self, data_path, tile_size, tile_grid, tile_format, epsg, auto_zoom, min_zoom, max_zoom, dms_id):
         # 影像切片
         config = Config()
         connection = Connection(config)
         # 添加任务
         q = rq.Queue(name='default', connection=connection.redis_conn)
-        output_path = config.common.OUTPUT_PATH
 
         q.enqueue(image_slice_job,
                   kwargs={"data_path": data_path,
@@ -28,7 +67,8 @@ class Application:
                           "auto_zoom": auto_zoom,
                           "min_zoom": min_zoom,
                           "max_zoom": max_zoom,
-                          "dms_id": dms_id
+                          "dms_id": dms_id,
+                          "dms_data":dms_data
                           },
                   job_timeout=int(config.common.JOB_TIMEOUT)
                   )

+ 35 - 3
src/app/mission_jobs/image_slice_job.py

@@ -1,14 +1,17 @@
+import json
 import os
 
 import requests
 import rq
+from osgeo import ogr
 
 from app.mission_jobs.image_slice import slice_zxy
 from config import Config
 from connection import Connection
+from starearth.utils.general_utils import print_log
 
 
-def image_slice_job(data_path, output_path, tile_size, tile_grid, tile_format, epsg, auto_zoom, min_zoom, max_zoom, dms_id):
+def image_slice_job(data_path, output_path, tile_size, tile_grid, tile_format, epsg, auto_zoom, min_zoom, max_zoom, dms_id, dms_data):
     config = Config()
     # connection = Connection(config)
 
@@ -30,8 +33,8 @@ def image_slice_job(data_path, output_path, tile_size, tile_grid, tile_format, e
     #                   )
 
     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":
+            input_file = os.path.join(data_path, file_name)
             slice_zxy(
                 input_file=input_file,
                 output_path=output_path,
@@ -56,11 +59,40 @@ def image_slice_job(data_path, output_path, tile_size, tile_grid, tile_format, e
 
     headers = {'token': login_rep.get('message')}
 
+    geojsonl_file_list = []
+
+    for file_name in os.listdir(data_path):
+        if os.path.splitext(file_name)[-1] == ".geojsonl":
+            geojsonl_file = os.path.join(data_path, file_name)
+            geojsonl_file_list.append(geojsonl_file)
+
+    new_geometry = None
+    for geojsonl_file in geojsonl_file_list:
+        with open(geojsonl_file, 'r') as f:
+            geometry = json.loads(f.read())['geometry']
+        if new_geometry is None:
+            src_geometry = ogr.CreateGeometryFromJson(json.dumps(geometry))
+        else:
+            src_geometry = new_geometry
+        dst_geometry = ogr.CreateGeometryFromJson(json.dumps(geometry))
+        new_geometry = src_geometry.Union(dst_geometry)
+
+    dms_data['content'] = json.loads(dms_data['content'])
+    dms_data['content']['bbox'] = new_geometry.ExportToJson()
+    dms_data['content']['id'] = dms_id
+    dms_data['content'] = json.dumps(dms_data['content'], ensure_ascii=False)
+
     # 修改dms
+    updateContent = requests.post(config.dms.URL + '/content/updateContent', headers=headers, data=dms_data)
+    print_log(updateContent)
+    print_log(updateContent.json())
+    # 提交dms
     data = {
         'id': dms_id,
         'columnId': config.dms.columnId,
         'state': 1
     }
 
-    requests.post(config.dms.URL + '/content/updateAudit', headers=headers, data=data)
+    updateAudit = requests.post(config.dms.URL + '/content/updateAudit', headers=headers, data=data)
+    print_log(updateAudit)
+    print_log(updateAudit.json())

+ 36 - 1
src/app/utils/utils.py

@@ -1,8 +1,13 @@
+import json
 import os
 
+from config import Config
+
+config = Config()
+
 
 def get_directory_tree(path):
-    tree = {'name': path}
+    tree = {'name': path.replace(config.common.TILESET_PATH, '')}
     if os.path.isdir(path):
         tree['type'] = 'directory'
         tree['children'] = [get_directory_tree(os.path.join(path, child)) for child in os.listdir(path)]
@@ -10,3 +15,33 @@ def get_directory_tree(path):
     else:
         tree['type'] = 'file'
     return tree
+
+
+def filter_file(item, condition):
+    if condition == '.tif':
+        result = os.path.splitext(item)[-1] == condition
+
+    elif condition == 'tileset.json':
+        result = os.path.basename(item) == condition
+
+    else:
+        result = False
+
+    return result
+
+
+def dir_and_file_tree(path, ext, temp_list=[]):
+    path_tree = os.listdir(path)  # 获取当前目录下的文件和目录
+    for item in path_tree:
+        subtree = path + '/' + item
+        if os.path.isdir(subtree):  # 判断是否为目录
+            x1 = []
+            item_dict = {'label': item, 'type': 'directory', 'value': path.replace(config.common.TILESET_PATH, ''),
+                         'children': x1}
+            temp_list.append(item_dict)
+            dir_and_file_tree(subtree, ext, x1)  # 递归深度优先遍历
+        else:
+            if filter_file(item, ext):
+                temp_list.append({'label': item, 'type': 'file', 'value': path.replace(config.common.TILESET_PATH, '')})
+
+    return temp_list