#!/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\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 read_txt(path):
|
f = open(path, encoding="utf-8")
|
lines = f.readlines()
|
f.close()
|
|
for i in range(0, len(lines)):
|
lines[i] = lines[i].replace('\n', '')
|
|
return lines
|
|
|
# 加载图层
|
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)):
|
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.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([], 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')
|