tile_service_register.py 8.2 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.TileProjectFile 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": "scheme",
             "in": "formData",
             "type": "string",
             "description": "[影像地图,电子地图]切片方案json"},

            {"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": {
                    }
                }
            }
        }
    }