SliceScheme.py 2.7 KB
# coding=utf-8
#author:        4N
#createtime:    2021/5/17
#email:         nheweijun@sina.com

import xml.etree.ElementTree as ET
from xml.etree.ElementTree import Element
import math



class SliceScheme:

    #这里的 多对象共享的
    def __init__(self,slice_scheme_path):
        self.parameter = {}
        self.levels = []
        tree = ET.parse(slice_scheme_path)
        root:Element = tree.getroot()
        if root.tag.__eq__("TileCacheInfo"):
            TileCacheInfo: Element =root
        else:
            TileCacheInfo :Element= root.find("TileCacheInfo")


        self.parameter["rows"] = float(TileCacheInfo.find("TileRows").text)
        self.parameter["cols"] = float(TileCacheInfo.find("TileCols").text)
        self.parameter["x"] = float(TileCacheInfo.find("TileOrigin").find("X").text)
        self.parameter["y"] = float(TileCacheInfo.find("TileOrigin").find("Y").text)
        self.parameter["dpi"] = float(TileCacheInfo.find("DPI").text)

        self.parameter["wkt"] = TileCacheInfo.find("SpatialReference").find("WKT").text


        LODInfos:Element = TileCacheInfo.find("LODInfos")


        for info in LODInfos.iter("LODInfo"):
            info_dict={}
            info_dict["scale"] = float(info.find("Scale").text)
            info_dict["resolution"] = float(info.find("Resolution").text)
            self.parameter[info.find("LevelID").text] =info_dict

            self.levels.append({"level":int(info.find("LevelID").text),
                                "scale":float(info.find("Scale").text),
                                "resolution":float(info.find("Resolution").text)})

    @staticmethod
    def get_polygon(parameter,level,row,col):
        level=int(level)
        row = int(row)
        col = int(col)
        detaxy = parameter.get(str(level)).get("resolution")* parameter.get("cols")

        minx = detaxy * col + int(parameter.get("x"))
        maxy = -detaxy * row + int(parameter.get("y"))
        maxx = detaxy + minx
        miny = -detaxy + maxy
        return [minx,miny,maxx,maxy]



    def get_poly(self,level,row,col):
        level=int(level)
        row = int(row)
        col = int(col)
        detaxy = self.parameter.get(str(level)).get("resolution")* self.parameter.get("cols")

        minx = detaxy*col + self.parameter.get("x")
        maxy = -detaxy*row +self.parameter.get("y")
        maxx =  detaxy + minx
        miny = -detaxy + maxy

        minx = math.ceil((detaxy*col + self.parameter.get("x"))*1000)/1000.0
        maxy = math.ceil((-detaxy*row +self.parameter.get("y"))*1000)/1000.0
        maxx =  math.ceil((detaxy + minx)*1000)/1000.0
        miny = math.ceil((-detaxy + maxy)*1000)/1000.0

        return [minx,miny,maxx,maxy]