xian_qgis

This commit is contained in:
zzw
2026-06-18 10:12:15 +08:00
commit 9813d6d164
16 changed files with 663 additions and 0 deletions
+105
View File
@@ -0,0 +1,105 @@
import os
import importlib # 动态导入模块
import logging
import sys
from qgis._core import QgsProject
from .map_utils import MapUtils
class Maps:
def __init__(self, model, data, config):
self.model = model # 震情基本数据
self.data = data # 额外数据
self.config = config # 配置参数
def load(self):
# ---加载地图模板---
project = QgsProject.instance() # 获取QGIS项目实例
project.read(self.model["path"]) # 读取地图模板(.qgs或.qgz文件)
db_config = self.config["db"] # 需在application.yml中添加db配置
# 遍历所有图层,更新PostgreSQL图层的连接
for layer in project.mapLayers().values():
if layer.providerType() == "postgres": # 仅处理 PostgreSQL 图层
try:
# 检查配置项是否完整
required_keys = ["host", "port", "database", "username", "password"]
missing_keys = [k for k in required_keys if k not in db_config]
if missing_keys:
logging.error(f"数据库配置缺失键:{missing_keys},跳过图层 {layer.name()}")
continue
# 获取当前图层的数据源 URI
uri = layer.dataProvider().uri()
# 使用位置参数传递,而非关键字参数
uri.setConnection(
db_config["host"], # 主机
str(db_config["port"]), # 端口转换为字符串
db_config["database"], # 数据库名
db_config["username"], # 用户名
db_config["password"] # 密码
)
# 重新设置数据源,刷新连接
layer.setDataSource(uri.uri(), layer.name(), "postgres")
# 验证图层是否有效
if layer.isValid():
logging.info(f"图层 {layer.name()} 数据库连接更新成功")
else:
logging.error(f"图层 {layer.name()} 更新连接后仍无效,请检查配置")
except Exception as e:
logging.error(f"更新图层 {layer.name()} 连接失败:{str(e)}")
logging.info("读取project完成,模板路径:" + self.model["path"] + " 画幅:" + self.model["mapLayout"])
# logging.info("图层--" + str(len(project.mapLayersByName('eqcenter')))) # 日志记录特定图层数量
qLayout = project.layoutManager().layoutByName(self.model["mapLayout"]) # 获取指定名称的布局
imap = qLayout.itemById("Map") # 获取地图项
mapUtils = MapUtils(self.config, project, qLayout) # 创建地图工具实例
# 设置坐标系(当前注释掉,未启用)
# kid = 32000 + (700 if float(self.model["centerY"]) < 0 else 600) + (int(float(self.model["centerX"])/6)+31)
# logging.info("设置坐标系:" + str(kid))
# imap.setCrs(QgsCoordinateReferenceSystem(kid,QgsCoordinateReferenceSystem.CrsType.EpsgCrsId))
# 修改格网
# logging.info("修改格网")
# grid = imap.grid()
# grid.setLineSymbol(None)
# grid.setAnnotationDisplay(QgsLayoutItemMapGrid.DisplayMode.HideAll,QgsLayoutItemMapGrid.BorderSide.Left)
# grid.setAnnotationDisplay(QgsLayoutItemMapGrid.DisplayMode.HideAll, QgsLayoutItemMapGrid.BorderSide.Right)
# grid.setAnnotationDisplay(QgsLayoutItemMapGrid.DisplayMode.HideAll, QgsLayoutItemMapGrid.BorderSide.Bottom)
# grid.setAnnotationDisplay(QgsLayoutItemMapGrid.DisplayMode.HideAll, QgsLayoutItemMapGrid.BorderSide.Top)
# 按照过滤图层,避免以前的数据干扰(动态加载map_filter.py)
if os.path.exists(os.path.join(os.path.split(os.path.realpath(__file__))[0], 'map_filter.py')):
# 添加模块所在目录到 Python 搜索路径
sys.path.insert(0, os.path.split(os.path.realpath(__file__))[0])
importlib.import_module('map_filter').Filter(project, self.model)
# 缩放地图
logging.info("缩放地图")
# 调用缩放方法(参数:缩放规则、中心点坐标、缩放值)
mapUtils.Zoom(self.model["zoomRule"],
{'X': self.model["centerX"], 'Y': self.model["centerY"], 'value': self.model["zoomValue"]})
# 修改制图时间、单位、地图名称等文本
logging.info("正在修改地震信息...")
mapUtils.Update(self.model, "mapTitle") # 更新地图标题
mapUtils.Update(self.model, "mapTime") # 更新制图时间
mapUtils.Update(self.model, "mapUnit") # 更新单位
mapUtils.Update(self.model, "info") # 更新地震信息
# 修改比例尺
logging.info("修改比例尺")
mapUtils.UpdateScale()
# 导出图片
logging.info("导出图片")
mapUtils.Export(self.model["outFile"]) # 导出至指定路径
logging.info(self.model["event"] + "导出完成") # 记录导出完成日志
return self.model["name"]