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 |   92 +++++++++++++++++++++++++--------------------
 1 files changed, 51 insertions(+), 41 deletions(-)

diff --git a/ExportMap/Sources/xyz.py b/ExportMap/Sources/xyz.py
index 30a053c..85cd51c 100644
--- a/ExportMap/Sources/xyz.py
+++ b/ExportMap/Sources/xyz.py
@@ -28,18 +28,18 @@
     parser = argparse.ArgumentParser(description='ArgUtils')
     parser.add_argument("-src", type=str, default=get_full_path(), 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("-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=18, 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()
 
@@ -50,26 +50,32 @@
 
 
 # 鍔犺浇鍥惧眰
-def loadLayers(prj, args):
+def load_layers(prj, args):
     for layer in prj.mapLayers().values():
         prj.removeMapLayer(layer)
 
-    lines = readTxt(args.file)
+    args.crs = None
+    lines = read_txt(args.file)
     for i in range(0, len(lines)):
         if len(lines[i]) == 0:
             continue
 
-        print("layer: " + lines[i])
+        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):
-            layer.dataProvider().setNoDataValue(j, args.noData)
+            try:
+                layer.dataProvider().setNoDataValue(j, args.noData)
+            except Exception as e:
+                print(e)
 
         prj.addMapLayer(layer)
 
@@ -84,45 +90,47 @@
 
 
 # 鑾峰彇杈圭晫
-def getExtent(prj):
+def get_extent(prj, args):
     ex = None
     for layer in prj.mapLayers().values():
         rect = layer.extent()
-        print(layer.name() + ", " + rect.toString())
-
         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 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()
+        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)
 
-    # '38399769,38403264,3558330,3561632'
-    return str(ex.xmin) + "," + str(ex.xmax) + "," + str(ex.ymin) + "," + str(ex.ymax)
+            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() + "]"
 
 
-# 鑾峰彇杈圭晫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())
+# 璁剧疆鐭╁舰杈圭晫
+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 getXYZOps(args):
-    return {
+def get_xyz_ops(args):
+    ops = {
         'BACKGROUND_COLOR': QColor(0, 0, 0, 0),
         'DPI': 96,
         'EXTENT': args.ext,
@@ -138,14 +146,16 @@
         'ZOOM_MAX': args.max,
         'ZOOM_MIN': args.min
     }
+    print(ops)
+
+    return ops
 
 
 # 鍒涘缓XYZ鐡︾墖
-def createXYZ(args):
+def create_xyz(args):
     import processing
 
-    ops = getXYZOps(args)
-    print(ops)
+    ops = get_xyz_ops(args)
     processing.run("qgis:tilesxyzdirectory", ops)
 
 
@@ -162,11 +172,11 @@
     # prj.read(args.qgz)
     print("FileName: " + prj.fileName())
 
-    loadLayers(prj, args)
+    load_layers(prj, args)
     # prj.write(args.file.replace(".txt", ".qgz"))
 
-    args.ext = getExtent(prj)
-    createXYZ(args)
+    args.ext = get_extent(prj, args)
+    create_xyz(args)
 
     qgs.exitQgis()
 

--
Gitblit v1.9.3