TileProjectFiledev.py 9.3 KB
# coding=utf-8
#author:        4N
#createtime:    2021/12/6
#email:         nheweijun@sina.com


from app.modules.service.models import TileScheme
from app.util.component.ModelVisitor import ModelVisitor
from app.util.component.StructurePrint import StructurePrint
import json
import base64


class ProjectFile:

    @classmethod
    def create(cls,para):
        if para.get("tile_type").__eq__("WMTS"):

            if para.get("scheme"):
                tile_scheme = json.loads(para.get("scheme"))
            else:
                tile_scheme: TileScheme = TileScheme.query.filter_by(guid=para.get("scheme_guid")).one_or_none()
                if not tile_scheme:
                    raise Exception("切片方案不存在!")
                tile_scheme = ModelVisitor.object_to_json(tile_scheme)

            default_scheme = {}
            other_scheme = []
            if isinstance(tile_scheme,list):
                for ts in tile_scheme:
                    if ts.get("isDefault"):
                        default_scheme = ts
                    else:
                        other_scheme.append(ts)
            else:
                default_scheme = tile_scheme

            project_xml_format = '''
<?xml version="1.0"?>
<dmap projectname="wmtstest" version="4.0">
  <projectCrs>
    <spatialrefsys>
      <wkt>{wkt}</wkt>
      <proj4>{proj4}</proj4>
      <srid>{srid}</srid>
      <description/>
      <projectionacronym/>
    </spatialrefsys>
  </projectCrs>
  <projectlayers>
    <maplayer name="{name}" alias="{alias}" type="0">
      <extent>
        <xmin>{xmin}</xmin>
        <ymin>{ymin}</ymin>
        <xmax>{xmax}</xmax>
        <ymax>{ymax}</ymax>
      </extent>
      <style>{layer_style}</style>
      <format>{layer_format}</format>
      <vendor>{vendor}</vendor>
      <datasource>{datasource}</datasource>
      <defaultTileMatrixSet>{defaultTileMatrixSet}</defaultTileMatrixSet>
      <tileMatrixSets>
        <tileMatrixSet>
          <id>{id}</id>
          <crs>{crs}</crs>
          <tileCols>{cols}</tileCols>
          <tileRows>{rows}</tileRows>
          <dpi>{dpi}</dpi>
          <tileOrigin>
            <X>{x}</X>
            <Y>{y}</Y>
          </tileOrigin>
          <levels>
            {levels}
          </levels>
        </tileMatrixSet>
        {other_tileMatrixSet}
      </tileMatrixSets>
    </maplayer>
  </projectlayers>
</dmap>
'''

            level_each = '''<level>
              <id>{lev}</id>
              <scaleDenominator>{scale}</scaleDenominator>
              <resolution>{resolution}</resolution>
            </level>
            '''

            levels = ''
            for level in json.loads(default_scheme.get("levels")):
                levels = "{}{}".format(levels, level_each.format(lev=level["level"],
                                                                 scale=level["scale"],
                                                                 resolution=level["resolution"],
                                                                 ))
            #删除空格
            levels = levels.strip()

            layer_extent = para.get("layer_extent").split(",")

            project_xml = project_xml_format.format(wkt="",
                                                    proj4="",
                                                    srid=para.get("crs").split("::")[-1],
                                                    name=para.get("layer_name"),
                                                    alias=para.get("alias") if para.get("alias") else "",
                                                    xmin=layer_extent[0],
                                                    xmax=layer_extent[1],
                                                    ymin=layer_extent[2],
                                                    ymax=layer_extent[3],
                                                    layer_style=para.get("layer_style"),
                                                    layer_format=para.get("layer_format"),
                                                    vendor=para.get("vendor"),
                                                    datasource=para.get("datasource"),
                                                    id=default_scheme.get("name"),
                                                    crs=para.get("crs"),
                                                    cols=default_scheme.get("cols"),
                                                    rows=default_scheme.get("rows"),
                                                    dpi=default_scheme.get("dpi"),
                                                    x=default_scheme.get("top_left").split(",")[0],
                                                    y=default_scheme.get("top_left").split(",")[1],
                                                    levels=levels,
                                                    other_tileMatrixSet=cls.create_other(other_scheme),
                                                    defaultTileMatrixSet=default_scheme.get("name"),
                                                    )
        else:

            project_xml_format = '''
<?xml version="1.0"?>
<dmap projectname="tmstest" version="4.0">
  <projectCrs>
    <spatialrefsys>
      <wkt>{wkt}</wkt>
      <proj4>{proj4}</proj4>
      <srid>{srid}</srid>
      <description/>
      <projectionacronym/>
    </spatialrefsys>
  </projectCrs>
  <projectlayers>
    <maplayer name="{name}" alias="{alias}" type="0">
      <extent>
        <xmin>{xmin}</xmin>
        <ymin>{ymin}</ymin>
        <xmax>{xmax}</xmax>
        <ymax>{ymax}</ymax>
      </extent>
      <style>{layer_style}</style>
      <format>{layer_format}</format>
      <vendor>{vendor}</vendor>
      <datasource>{datasource}</datasource>
    </maplayer>
  </projectlayers>
</dmap>
'''
            layer_extent = para.get("layer_extent").split(",")
            project_xml = project_xml_format.format(wkt="",
                                                    proj4="",
                                                    srid=para.get("crs").split("::")[-1],
                                                    name=para.get("layer_name"),
                                                    alias=para.get("alias") if para.get("alias") else "",
                                                    xmin=layer_extent[0],
                                                    xmax=layer_extent[1],
                                                    ymin=layer_extent[2],
                                                    ymax=layer_extent[3],
                                                    layer_style=para.get("layer_style"),
                                                    layer_format=para.get("layer_format"),
                                                    vendor=para.get("vendor"),
                                                    datasource=para.get("datasource"),
                                                    )

        project_xml = project_xml.strip()
        StructurePrint().print(project_xml)
        StructurePrint().print(str(base64.b64encode(project_xml.encode('utf-8')), encoding="utf8"))
        return str(base64.b64encode(project_xml.encode('utf-8')), encoding="utf8")

    @classmethod
    def create_other(cls,other_scheme):
        other = ""

        for scheme in other_scheme:

            tileMatrixSet='''
        <tileMatrixSet>
          <id>{id}</id>
          <crs>{crs}</crs>
          <tileCols>{cols}</tileCols>
          <tileRows>{rows}</tileRows>
          <dpi>{dpi}</dpi>
          <tileOrigin>
            <X>{x}</X>
            <Y>{y}</Y>
          </tileOrigin>
          <levels>
            {levels}
          </levels>
        </tileMatrixSet>
            '''

            level_each = '''<level>
              <id>{lev}</id>
              <scaleDenominator>{scale}</scaleDenominator>
              <resolution>{resolution}</resolution>
            </level>
            '''

            levels = ''
            for level in json.loads(scheme.get("levels")):
                levels = "{}{}".format(levels, level_each.format(lev=level["level"],
                                                                 scale=level["scale"],
                                                                 resolution=level["resolution"],
                                                                 ))
            # 删除空格
            levels = levels.strip()
            tileMatrixSet = tileMatrixSet.format(id=scheme.get("name"),
                                                 crs=scheme.get("crs"),
                                                 cols=scheme.get("tileCols"),
                                                 rows=scheme.get("tileRows"),
                                                 dpi=scheme.get("dpi"),
                                                 x=scheme.get("top_left").split(",")[0],
                                                 y=scheme.get("top_left").split(",")[1],
                                                 levels=levels
                                                 )
            tileMatrixSet = tileMatrixSet.strip()
            other+=tileMatrixSet

        other = other.strip()
        return other