#!/usr/bin/env # -*- coding: utf-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 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 # 获取完整路径 def get_full_path(): return os.path.split(sys.argv[0])[0] # 获取参数 def get_args(): 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=r"xyz.qgz", required=False) parser.add_argument("-file", type=str, default=r"D:\xyz\china\tif.txt", required=False) parser.add_argument("-out", type=str, default=r"D:\xyz\china\png", required=False) parser.add_argument("-min", type=int, default=4, required=False) parser.add_argument("-max", type=int, default=8, 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") lines = f.readlines() f.close() for i in range(0, len(lines)): lines[i] = lines[i].replace('\n', '') return lines # 加载图层 def loadLayers(prj, args): for layer in prj.mapLayers().values(): prj.removeMapLayer(layer) args.authid = None lines = readTxt(args.file) for i in range(0, len(lines)): if len(lines[i]) == 0: continue 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.authid = layer.crs().authid() print("authid: " + args.authid) 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, args): ex = None for layer in prj.mapLayers().values(): rect = layer.extent() if ex is None: ex = Rectangle(rect.xMinimum(), rect.xMaximum(), rect.yMinimum(), rect.yMaximum()) continue if args.authid != layer.crs().authid(): transform = QgsCoordinateTransform(QgsCoordinateReferenceSystem(layer.crs().authid()), QgsCoordinateReferenceSystem(args.authid), prj) min = QgsPoint(rect.xMinimum(), rect.yMinimum()) max = QgsPoint(rect.xMaximum(), rect.yMaximum()) min.transform(transform) max.transform(transform) if min.x() < ex.xmin: ex.xmin = min.x() if min.y() < ex.ymin: ex.ymin = min.y() if max.x() > ex.xmax: ex.xmax = max.x() if max.y() > ex.ymax: ex.ymax = max.y() else: 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() # -3640.3675,1734588.1947,2434663.1477,3677421.7047 [EPSG:32643] # 123543.6722,2730986.0671,2732253.9315,3552923.0518 [EPSG:32643] return str(ex.xmin) + "," + str(ex.xmax) + "," + str(ex.ymin) + "," + str(ex.ymax) + ' [' + args.authid + "]" # 获取坐标点 def setNewRect(ex, xmin, ymin, xmax, ymax): p = QgsPoint(x, y) return p def getExtent2(prj, args): ex = None for layer in prj.mapLayers().values(): rect = layer.extent() print(layer.name() + ", " + rect.toString() + ", " + layer.crs().authid()) if ex is None: ex = Rectangle(rect.xMinimum(), rect.xMaximum(), rect.yMinimum(), rect.yMaximum()) # print(layer.extent().asWktCoordinates()) geo = QgsGeometry.fromWkt(layer.extent().asWktPolygon()) 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() # '-3640.3675,1734588.1947,2434663.1477,3677421.7047 [EPSG:32643]' return str(ex.xmin) + "," + str(ex.xmax) + "," + str(ex.ymin) + "," + str(ex.ymax) + ' [' + args.authid + "]" # 获取XYZ参数 def getXYZOps(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 createXYZ(args): import processing ops = getXYZOps(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()) loadLayers(prj, args) # prj.write(args.file.replace(".txt", ".qgz")) args.ext = getExtent(prj, args) createXYZ(args) qgs.exitQgis() # main if __name__ == '__main__': timer = time.time() init() print(f'耗时:{time.time() - timer:.2f}s')