提升效率并删除不必要的文件

This commit is contained in:
wzy-warehouse
2026-06-21 15:24:09 +08:00
parent e84aae3ea6
commit 95a74d00f3
24 changed files with 31 additions and 575 deletions
+23 -75
View File
@@ -1,6 +1,6 @@
"""
地图生成主流程控制器。
协调模板加载图层过滤、缩放、文本更新导出。
模板加载图层过滤 → 缩放 → 文本更新导出。
"""
import os
import time
@@ -9,7 +9,6 @@ from qgis.core import QgsProject, QgsDataSourceUri
from app.config.paths import get_logger
from app.config.qgis_mappings import TABLE_RENAMES, SCHEMA_REPLACEMENTS
from .template_cache import TemplateCache
from .template_modifier import TemplateModifier
from .layer_filter import LayerFilter
from .map_exporter import MapExporter
@@ -17,56 +16,37 @@ from app.utils.map_zoom import MapZoom
logger = get_logger("qgis.service")
# 全局模板缓存(跨请求复用)
template_cache = TemplateCache()
class MapService:
def __init__(self, config: dict):
self.config = config
def generate(self, model: dict) -> str:
"""
执行完整的地图生成流程。
"""
_timing = {} # {step: seconds}
_timing = {}
t_total = time.time()
template_path = model["path"]
template_name = os.path.basename(template_path)
project = QgsProject.instance()
is_cache_hit = template_cache.is_loaded(template_path)
# ── 步骤 1:加载/恢复模板 ──
# ── 步骤 1:加载模板 ──
t0 = time.time()
if is_cache_hit:
logger.info(f"[缓存命中] {template_name}")
project.clear()
project, texts, extent = template_cache.restore_template(template_path)
template_cache.reset_project_state(project, texts, extent)
else:
logger.info(f"[首次加载] {template_name}")
project.clear()
modifier = TemplateModifier(self.config)
actual_path = modifier.modify(template_path)
project.read(actual_path)
if actual_path != template_path:
try:
os.remove(actual_path)
except OSError:
pass
project.clear()
modifier = TemplateModifier(self.config)
actual_path = modifier.modify(template_path)
project.read(actual_path)
if actual_path != template_path:
try:
os.remove(actual_path)
except OSError:
pass
_timing["1.load"] = time.time() - t0
# ── 步骤 2:图层连接修正 ──
t0 = time.time()
if not is_cache_hit:
self._fix_invalid_layers(project)
self._fix_invalid_layers(project)
_timing["2.connections"] = time.time() - t0
# ★ 首次加载完成后再保存缓存(确保图层已修正)
if not is_cache_hit:
template_cache.save_current(template_path, model.get("mapLayout", "A3"))
# ── 步骤 3:图层过滤 ──
t0 = time.time()
LayerFilter().apply(project, model)
@@ -77,15 +57,11 @@ class MapService:
layout = project.layoutManager().layoutByName(model["mapLayout"])
if layout is None:
available = [l.name() for l in project.layoutManager().layouts()]
raise RuntimeError(
f"模板中未找到布局 '{model['mapLayout']}',可用布局:{available}"
)
raise RuntimeError(f"模板中未找到布局 '{model['mapLayout']}',可用布局:{available}")
map_item = layout.itemById("Map")
zoom = MapZoom(project, layout, map_item)
zoom.execute(model["zoomRule"], {
"X": model["centerX"],
"Y": model["centerY"],
"value": model["zoomValue"],
"X": model["centerX"], "Y": model["centerY"], "value": model["zoomValue"],
})
_timing["4.zoom"] = time.time() - t0
@@ -99,18 +75,14 @@ class MapService:
total = time.time() - t_total
steps = ", ".join(f"{k}={v:.1f}s" for k, v in _timing.items())
logger.info(
f"{'[缓存命中]' if is_cache_hit else '[首次加载]'} "
f"{template_name}{total:.1f}s ({steps})"
)
logger.info(f"{template_name}{total:.1f}s ({steps})")
return model["name"]
def _fix_invalid_layers(self, project: QgsProject) -> None:
"""只修复 TemplateModifier 处理后仍无效的图层TemplateModifier 已修正大部分连接)"""
"""只修复 TemplateModifier 处理后仍无效的图层"""
t0 = time.time()
db_config = self.config["db"]
override = self.config.get("template_override", {})
actual_schema = override.get("actual", {}).get("schema", "qgis")
actual_schema = "qgis"
fixed = 0
failed = 0
@@ -120,7 +92,7 @@ class MapService:
continue
total += 1
if layer.isValid():
continue # TemplateModifier 已修正,跳过
continue
try:
self._fix_postgres_layer(layer, db_config, actual_schema)
if layer.isValid():
@@ -138,42 +110,21 @@ class MapService:
f"修复{fixed}, 仍失败{failed}, 耗时{elapsed:.1f}s"
)
@staticmethod
def _resolve_postgres_layers(project: QgsProject) -> None:
"""FlagDontResolveLayers 跳过了数据库连接,重新 setDataSource 触发"""
for layer in project.mapLayers().values():
if layer.providerType() != "postgres":
continue
try:
source = layer.source()
if source:
layer.setDataSource(source, layer.name(), "postgres")
except Exception:
pass
@staticmethod
def _fix_postgres_layer(layer, db_config, actual_schema):
"""修正单个 PostgreSQL 图层的连接参数"""
try:
uri = layer.dataProvider().uri()
uri.setConnection(
db_config["host"],
str(db_config["port"]),
db_config["database"],
db_config["username"],
db_config["password"],
db_config["host"], str(db_config["port"]),
db_config["database"], db_config["username"], db_config["password"],
)
# Schema 替换
uri_str = uri.uri()
for old_schema in SCHEMA_REPLACEMENTS:
if f'table="{old_schema}".' in uri_str:
uri_str = uri_str.replace(
f'table="{old_schema}".',
f'table="{actual_schema}".',
)
uri_str = uri_str.replace(f'table="{old_schema}".', f'table="{actual_schema}".')
uri = QgsDataSourceUri(uri_str)
break
# 表名映射
uri_str = uri.uri()
for old_name, new_name in TABLE_RENAMES.items():
full_old = f'table="{actual_schema}"."{old_name}"'
@@ -181,17 +132,14 @@ class MapService:
if full_old in uri_str:
uri_str = uri_str.replace(full_old, full_new)
uri = QgsDataSourceUri(uri_str)
# SRID 修正
uri_str = uri.uri()
if " srid=0 " in uri_str:
uri_str = uri_str.replace(" srid=0 ", " srid=4326 ")
uri = QgsDataSourceUri(uri_str)
layer.setDataSource(uri.uri(), layer.name(), "postgres")
if layer.isValid():
logger.debug(f" 图层 {layer.name()} 连接更新成功")
else:
logger.error(f" 图层 {layer.name()} 更新后仍无效")
except Exception as e:
logger.error(f" 更新图层 {layer.name()} 连接失败: {e}")
logger.error(f" 更新图层 {layer.name()} 连接失败: {e}")