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"]