From 5f80de49c4a00416591054180bf809a12a76d686 Mon Sep 17 00:00:00 2001 From: 13693261870 <252740454@qq.com> Date: 星期四, 07 十一月 2024 16:40:53 +0800 Subject: [PATCH] 1 --- ExportMap/Sources/xyz.py | 171 ++++++++++++++++++++++++++++++++++++++++++--------------- 1 files changed, 126 insertions(+), 45 deletions(-) diff --git a/ExportMap/Sources/xyz.py b/ExportMap/Sources/xyz.py index 733f9b0..85cd51c 100644 --- a/ExportMap/Sources/xyz.py +++ b/ExportMap/Sources/xyz.py @@ -4,21 +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") -from processing.core.Processing import Processing -Processing.initialize() -import processing -#from qgis import processing - 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 processing.core.Processing import Processing # 鑾峰彇瀹屾暣璺緞 @@ -31,16 +27,19 @@ 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\dom0.2m\tif.txt", required=False) + parser.add_argument("-out", type=str, default=r"D:\xyz\dom0.2m\png", required=False) + parser.add_argument("-min", type=int, default=12, required=False) + parser.add_argument("-max", type=int, default=15, required=False) + parser.add_argument("-noData", type=int, default=0, required=False) return parser.parse_args() # 璇诲彇鏂囨湰鏂囦欢 -def readTxt(filePath): - f = open(filePath, encoding="utf-8") +def read_txt(path): + f = open(path, encoding="utf-8") lines = f.readlines() f.close() @@ -51,57 +50,139 @@ # 鍔犺浇鍥惧眰 -def loadLayers(prj, args): - lines = readTxt(args.file) +def load_layers(prj, args): + for layer in prj.mapLayers().values(): + prj.removeMapLayer(layer) + + args.crs = None + lines = read_txt(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_" + str(i) + ": " + 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!") - #prj.addRasterLayer(line, "layer_" + str(i)) + continue + + if len(prj.mapLayers()) == 0: + args.crs = layer.crs() + print("authid: " + args.crs.authid()) + prj.setCrs(layer.crs()) + + for j in range(1, layer.bandCount() + 1): + try: + layer.dataProvider().setNoDataValue(j, args.noData) + except Exception as e: + print(e) + + 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 get_extent(prj, args): + ex = None + for layer in prj.mapLayers().values(): + rect = layer.extent() + if ex is None: + # print(layer.extent().asWktCoordinates()); geo = QgsGeometry.fromWkt(layer.extent().asWktPolygon()) + ex = Rectangle(rect.xMinimum(), rect.xMaximum(), rect.yMinimum(), rect.yMaximum()) + continue + + if args.crs.authid() != layer.crs().authid(): + transform = QgsCoordinateTransform(layer.crs(), args.crs, prj) + min = QgsPoint(rect.xMinimum(), rect.yMinimum()) + max = QgsPoint(rect.xMaximum(), rect.yMaximum()) + min.transform(transform) + max.transform(transform) + + set_rect_bound(ex, min.x(), min.y(), max.x(), max.y()) + + else: + set_rect_bound(ex, rect.xMinimum(), rect.yMinimum(), rect.xMaximum(), rect.yMaximum()) + + # 123543.6722,2730986.0671,2732253.9315,3552923.0518 [EPSG:32643] + # return '38400309.1314,38403253.7083,3559920.4768,3561690.3144 [CGCS2000 / 3-degree Gauss-Kruger zone 38]' + return str(ex.xmin) + "," + str(ex.xmax) + "," + str(ex.ymin) + "," + str(ex.ymax) + ' [' + args.crs.authid() + "]" + + +# 璁剧疆鐭╁舰杈圭晫 +def set_rect_bound(ex, xmin, ymin, xmax, ymax): + if xmin < ex.xmin: + ex.xmin = xmin + if ymin < ex.ymin: + ex.ymin = ymin + if xmax > ex.xmax: + ex.xmax = xmax + if ymax > ex.ymax: + ex.ymax = ymax + + +# 鑾峰彇XYZ鍙傛暟 +def get_xyz_ops(args): + ops = { + '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 + } + print(ops) + + return ops + + +# 鍒涘缓XYZ鐡︾墖 +def create_xyz(args): + import processing + + ops = get_xyz_ops(args) + processing.run("qgis:tilesxyzdirectory", ops) # 鍒濆鍖� def init(): # QgsApplication.setPrefixPath("C:\Program Files\QGIS 3.16", True) - qgs = QgsApplication([], True) + qgs = QgsApplication([], False) qgs.initQgis() + Processing.initialize() 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) + load_layers(prj, args) + # prj.write(args.file.replace(".txt", ".qgz")) - for alg in qgs.processingRegistry().algorithms(): - print(alg.id(), "->", alg.displayName()) - - 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 = get_extent(prj, args) + create_xyz(args) qgs.exitQgis() # main if __name__ == '__main__': + timer = time.time() init() - + print(f'鑰楁椂:{time.time() - timer:.2f}s') -- Gitblit v1.9.3