管道基础大数据平台系统开发-【CS】-ExportMap
1
13693261870
2023-04-19 30fcf79d96ae5e8923f5b78bcc1ec4ac56aa6ae6
ExportMap/Sources/xyz.py
@@ -4,18 +4,17 @@
import os
import sys
import time
from qgis.core import *
# C:\Program Files\QGIS 3.16\apps\qgis-ltr\python\qgis
sys.path.append(r"C:\Program Files\QGIS 3.16\apps\qgis-ltr\python\plugins")
import math
import argparse
from qgis.core import *
from qgis.gui import *
from qgis.PyQt.QtGui import *
from qgis.PyQt.QtCore import *
from qgis.PyQt.QtWidgets import *
#from qgis import processing
from processing.core.Processing import Processing
# 获取完整路径
@@ -28,9 +27,12 @@
    print("argv = ", sys.argv[1:])
    parser = argparse.ArgumentParser(description='ArgUtils')
    parser.add_argument("-src", type=str, default=get_full_path(), required=False)
    parser.add_argument("-qgz", type=str, default="xyz.qgz", required=False)
    parser.add_argument("-file", type=str, default=r"D:\xyz\tiles.txt", required=False)
    parser.add_argument("-out", type=str, default=r"D:\xyz\tiles\zy", required=False)
    parser.add_argument("-qgz", type=str, default=r"xyz.qgz", required=False)
    parser.add_argument("-file", type=str, default=r"D:\xyz\4.5g\tif.txt", required=False)
    parser.add_argument("-out", type=str, default=r"D:\xyz\4.5g\png", required=False)
    parser.add_argument("-min", type=int, default=12, required=False)
    parser.add_argument("-max", type=int, default=18, required=False)
    parser.add_argument("-noData", type=int, default=0, required=False)
    return parser.parse_args()
@@ -49,16 +51,102 @@
# 加载图层
def loadLayers(prj, args):
    for layer in prj.mapLayers().values():
        prj.removeMapLayer(layer)
    lines = readTxt(args.file)
    for i in range(0, len(lines)):
        line = lines[i]
        if len(line) == 0:
        if len(lines[i]) == 0:
            continue
        print("layer: " + line)
        layer = QgsRasterLayer(line, "layer_" + str(i))
        if not layer.isValid():
        print("layer: " + lines[i])
        layer = QgsRasterLayer(lines[i], "layer_" + str(i))
        if not layer.isValid() or layer.crs() is None:
            print("layer_" + str(i) + ": failed to load!")
            continue
        if len(prj.mapLayers()) == 0:
            prj.setCrs(layer.crs())
        for j in range(1, layer.bandCount() + 1):
            layer.dataProvider().setNoDataValue(j, args.noData)
        prj.addMapLayer(layer)
# 边界类
class Rectangle:
    def __init__(self, xmin, xmax, ymin, ymax):
        self.xmin = xmin
        self.xmax = xmax
        self.ymin = ymin
        self.ymax = ymax
# 获取边界
def getExtent(prj):
    ex = None
    for layer in prj.mapLayers().values():
        rect = layer.extent()
        print(layer.name() + ", " + rect.toString())
        if ex is None:
            ex = Rectangle(rect.xMinimum(), rect.xMaximum(), rect.yMinimum(), rect.yMaximum())
            continue
        if rect.xMinimum() < ex.xmin:
            ex.xmin = rect.xMinimum()
        if rect.yMinimum() < ex.ymin:
            ex.ymin = rect.yMinimum()
        if rect.xMaximum() > ex.xmax:
            ex.xmax = rect.xMaximum()
        if rect.yMaximum() > ex.ymax:
            ex.ymax = rect.yMaximum()
    # '38399769,38403264,3558330,3561632'
    return str(ex.xmin) + "," + str(ex.xmax) + "," + str(ex.ymin) + "," + str(ex.ymax)
# 获取边界2
def getExtent2(prj):
    rt = None
    for layer in prj.mapLayers().values():
        if rt is None:
            rt = layer.extent()
            continue
        rt = rt.combineExtentWith(layer.extent())
    return str(rt.xMinimum()) + "," + str(rt.xMaximum()) + "," + str(rt.yMinimum()) + "," + str(rt.yMaximum())
# 获取XYZ参数
def getXYZOps(args):
    return {
        'BACKGROUND_COLOR': QColor(0, 0, 0, 0),
        'DPI': 96,
        'EXTENT': args.ext,
        'METATILESIZE': 4,
        'OUTPUT_DIRECTORY': args.out,
        # 'OUTPUT_HTML': 'TEMPORARY_OUTPUT',
        'OUTPUT_HTML': args.out + "\\view.html",
        'QUALITY': 100,
        'TILE_FORMAT': 0,
        'TILE_HEIGHT': 256,
        'TILE_WIDTH': 256,
        'TMS_CONVENTION': False,
        'ZOOM_MAX': args.max,
        'ZOOM_MIN': args.min
    }
# 创建XYZ瓦片
def createXYZ(args):
    import processing
    ops = getXYZOps(args)
    print(ops)
    processing.run("qgis:tilesxyzdirectory", ops)
# 初始化
@@ -66,40 +154,25 @@
    # QgsApplication.setPrefixPath("C:\Program Files\QGIS 3.16", True)
    qgs = QgsApplication([], False)
    qgs.initQgis()
    sys.path.append(r"C:\Program Files\QGIS 3.16\apps\qgis-ltr\python\plugins")
    from processing.core.Processing import Processing
    Processing.initialize()
    import processing
    args = get_args()
    project = QgsProject.instance()
    project.read(os.path.join(args.src, args.qgz))
    print("FileName: " + project.fileName())
    prj = QgsProject.instance()
    prj.read(os.path.join(args.src, args.qgz))
    # prj.read(args.qgz)
    print("FileName: " + prj.fileName())
    loadLayers(project, args)
    loadLayers(prj, args)
    # prj.write(args.file.replace(".txt", ".qgz"))
    ops = {
         'BACKGROUND_COLOR': QColor(0, 0, 0, 0),
         'DPI': 96,
         'EXTENT': '38399808.872500002,38403271.749600001,3558251.197600000,3561749.171400000 []',
         'METATILESIZE': 4,
         'OUTPUT_DIRECTORY': args.out,
         'OUTPUT_HTML': 'TEMPORARY_OUTPUT',
         'QUALITY': 100,
         'TILE_FORMAT': 0,
         'TILE_HEIGHT': 256,
         'TILE_WIDTH': 256,
         'TMS_CONVENTION': True,
         'ZOOM_MAX': 12,
         'ZOOM_MIN': 12
    }
    processing.run("qgis:tilesxyzdirectory", ops)
    args.ext = getExtent(prj)
    createXYZ(args)
    qgs.exitQgis()
# main
if __name__ == '__main__':
    timer = time.time()
    init()
    print(f'耗时:{time.time() - timer:.2f}s')