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