ProjectFile.py 6.5 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)

            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>
      <tileMatrixSets>
        <tileMatrixSet>
          <id>default</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>
      </tileMatrixSets>
    </maplayer>
  </projectlayers>
</dmap>
'''

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

            levels = ''
            for level in json.loads(tile_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"),
                                                    crs=para.get("crs"),
                                                    cols=tile_scheme.get("cols"),
                                                    rows=tile_scheme.get("rows"),
                                                    dpi=tile_scheme.get("dpi"),
                                                    x=tile_scheme.get("top_left").split(",")[0],
                                                    y=tile_scheme.get("top_left").split(",")[1],
                                                    levels=levels
                                                    )
        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")