ProjectFile.py 7.0 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
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>{xmax}</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"],
                                                                 ))

            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"),
                                                    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="3">
                  <extent>
                    <xmin>{xmin}</xmin>
                    <ymin>{xmax}</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"),
                                                    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"),
                                                    )
        return str(base64.b64encode(project_xml.encode('utf-8')), encoding="utf8")