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 |  147 +++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 118 insertions(+), 29 deletions(-)

diff --git a/ExportMap/Sources/xyz.py b/ExportMap/Sources/xyz.py
index 5e8c210..85cd51c 100644
--- a/ExportMap/Sources/xyz.py
+++ b/ExportMap/Sources/xyz.py
@@ -4,6 +4,8 @@
 
 import os
 import sys
+import time
+
 sys.path.append(r"C:\Program Files\QGIS 3.16\apps\qgis-ltr\python\plugins")
 import math
 import argparse
@@ -13,7 +15,6 @@
 from qgis.PyQt.QtCore import *
 from qgis.PyQt.QtWidgets import *
 from processing.core.Processing import Processing
-import processing
 
 
 # 鑾峰彇瀹屾暣璺緞
@@ -26,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()
 
@@ -46,54 +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!")
+            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)
 
 
-# 鍒濆鍖�
-def init():
-    # QgsApplication.setPrefixPath("C:\Program Files\QGIS 3.16", True)
-    qgs = QgsApplication([], True)
-    Processing.initialize()
-    qgs.initQgis()
+# 杈圭晫绫�
+class Rectangle:
+    def __init__(self, xmin, xmax, ymin, ymax):
+        self.xmin = xmin
+        self.xmax = xmax
+        self.ymin = ymin
+        self.ymax = ymax
 
-    args = get_args()
-    project = QgsProject.instance()
-    #project.read(os.path.join(args.src, args.qgz))
-    #print("FileName: " + project.fileName())
 
-    loadLayers(project, args)
+# 鑾峰彇杈圭晫
+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': '38399769.358700000,38403264.373400003,3558330.210400000,3561632.889400000 []',
+        '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': True,
-        'ZOOM_MAX': 8,
-        'ZOOM_MIN': 8
+        '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([], False)
+    qgs.initQgis()
+    Processing.initialize()
+
+    args = get_args()
+    prj = QgsProject.instance()
+    prj.read(os.path.join(args.src, args.qgz))
+    # prj.read(args.qgz)
+    print("FileName: " + prj.fileName())
+
+    load_layers(prj, args)
+    # prj.write(args.file.replace(".txt", ".qgz"))
+
+    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