tile_service_register.py 8.0 KB
# coding=utf-8
#author:        4N
#createtime:    2021/7/19
#email:         nheweijun@sina.com


from app.util.component.ApiTemplate import ApiTemplate
from app.util.component.StructurePrint import StructurePrint
import uuid
from ..models import TileService,Service,db,ServiceFunction,TileScheme

import datetime
import configure
import requests
from requests import Response
import json
from .util.ProjectFile import ProjectFile

class Api(ApiTemplate):

    api_name = "注册电子地图"

    def process(self):
        # 返回结果
        res = {}
        try:
            this_time = datetime.datetime.now()
            service_guid = uuid.uuid1().__str__()
            tile_service_guid = uuid.uuid1().__str__()
            service_function_guid = uuid.uuid1().__str__()
            # 调用电子地图的注册服务接口

            project_file = ProjectFile.create(self.para)
            para = {"name":self.para.get("name"),
                    "title":self.para.get("title"),
                    "type":"tileserver",
                    "capabilities":1 if self.para.get("tile_type") == "WMTS" else 16,
                    "project":project_file,"state":1}

            tile_service_register_url = "{}/dmap/api/manager/RegService".format(configure.dmap_engine)
            resp: Response  = requests.post(tile_service_register_url,data=json.dumps(para),
                                            headers={'Content-Type':'application/json'},timeout=3
                                            )
            if resp.status_code == 200:
                resp.encoding="utf-8"
                resp_json = resp.json()
                if not resp_json["status"]=="1":
                    raise Exception("调用电子地图的注册服务接口失败!")
            else:
                raise Exception("调用电子地图的注册服务接口失败!")

            if Service.query.filter_by(name = self.para.get("name")).one_or_none():
                raise Exception("同名服务已存在!")

            service = Service(
                guid = service_guid,
                name = self.para.get("name"),
                title = self.para.get("title"),
                creator= self.para.get("creator"),
                state = 1,
                create_time = this_time,
                update_time = this_time,
                description = self.para.get("description"),
                node = 1,
                overview= resp_json["url"],
                type = self.para.get("type"),
                catalog_guid = self.para.get("catalog_guid")
            )

            #已存在就删除
            tile_service_isexist = TileService.query.filter_by(name=self.para.get("name")).one_or_none()
            if tile_service_isexist:
                db.session.delete(tile_service_isexist)

            # tile_scheme: TileScheme = TileScheme.query.filter_by(guid=self.para.get("scheme_guid")).one_or_none()

            tile_service = TileService(
                guid = tile_service_guid,
                name = self.para.get("name"),
                tile_type = self.para.get("tile_type"),
                vendor = self.para.get("vendor"),
                create_time = this_time,
                crs = self.para.get("crs"),
                datasource = self.para.get("datasource"),
                description = self.para.get("description"),
                layer_name = self.para.get("layer_name"),
                layer_alias = self.para.get("layer_alias"),
                layer_title = self.para.get("layer_title"),
                layer_style = self.para.get("layer_style"),
                layer_format = self.para.get("layer_format"),
                layer_extent = self.para.get("layer_extent"),
                layer_description = self.para.get("layer_description"),
                # scheme_guid = self.para.get("scheme_guid"),
                # scheme = json.dumps(ModelVisitor.object_to_json(tile_scheme)),

                scheme=self.para.get("scheme"),
                service_guid = service_guid,
                metadata_url = "{}/DMap/Services/{}/MapServer/WMTSServer".format(configure.dmap_engine,self.para.get("name"))
            )

            service_function = ServiceFunction(guid=service_function_guid,
                                               service_guid=service_guid,
                                               type=self.para.get("tile_type"))

            db.session.add(service)
            db.session.add(tile_service)
            db.session.add(service_function)
            db.session.commit()

            res["data"] = service_guid
            res["result"] = True
        except Exception as e:
            db.session.rollback()
            raise e
        return res


    api_doc = {
        "tags": ["电子地图接口"],
        "parameters": [
            {"name": "name",
             "in": "formData",
             "type": "string",
             "description": "[矢量地图,电子地图,影像地图]"},
            {"name": "title",
             "in": "formData",
             "type": "string",
             "description": "[矢量地图,电子地图,影像地图]"},
            {"name": "description",
             "in": "formData",
             "type": "string",
             "description": "[矢量地图,电子地图,影像地图]"},
            {"name": "type",
             "in": "formData",
             "type": "string",
             "description": "[矢量地图,电子地图,影像地图",
             "enum":["矢量地图","电子地图","影像地图"]},
            {"name": "catalog_guid",
             "in": "formData",
             "type": "string",
             "description": "[矢量地图,电子地图,影像地图]"},
            {"name": "scheme_guid",
             "in": "formData",
             "type": "string",
             "description": "[电子地图,影像地图]切片方案"},
            {"name": "overview",
             "in": "formData",
             "type": "string",
             "description": "[电子地图]缩略图"},
            {"name": "tile_type",
             "in": "formData",
             "type": "string",
             "description": "[电子地图]tile_type",
             "enum":["WMTS","TMS"]},
            {"name": "vendor",
             "in": "formData",
             "type": "string",
             "description": "[电子地图]厂商"},
            {"name": "crs",
             "in": "formData",
             "type": "string",
             "description": "[电子地图]坐标系"},
            {"name": "datasource",
             "in": "formData",
             "type": "string",
             "description": "[电子地图]数据路径"},
            {"name": "layer_name",
             "in": "formData",
             "type": "string",
             "description": "[电子地图]图层名"},
            {"name": "layer_alias",
             "in": "formData",
             "type": "string",
             "description": "[电子地图]图层别名"},
            {"name": "layer_title",
             "in": "formData",
             "type": "string",
             "description": "[电子地图]图层标题"},
            {"name": "layer_style",
             "in": "formData",
             "type": "string",
             "description": "[电子地图]图层样式"},
            {"name": "layer_format",
             "in": "formData",
             "type": "string",
             "description": "[电子地图]图层format"},
            {"name": "layer_extent",
             "in": "formData",
             "type": "string",
             "description": "[电子地图]图层范围"},
            {"name": "layer_description",
             "in": "formData",
             "type": "string",
             "description": "[电子地图]图层描述"},
        ],
        "responses": {
            200: {
                "schema": {
                    "properties": {
                    }
                }
            }
        }
    }