Files
xian_algorithm_new/app/script/check_layout.py
T
2026-06-21 13:29:19 +08:00

66 lines
2.6 KiB
Python

"""检查布局 Map 项的图层配置"""
import zipfile, re, os
TEMPLATE_DIR = r"F:\project\xian\xian_algorithm_new\app\data\template\rainfall"
fname = "暴雨内涝潜在隐患点及人口分布图.qgz"
path = os.path.join(TEMPLATE_DIR, fname)
z = zipfile.ZipFile(path)
qgs_name = [n for n in z.namelist() if n.endswith('.qgs')][0]
content = z.read(qgs_name).decode('utf-8')
# 提取 Layout 元素(找 Map 项)
# QGIS 有两种布局格式:<Composer> (QGIS 2.x style) 和 <Layout> (QGIS 3.x style)
layout_re = re.compile(r'<(?:Composer|Layout)[^>]*name="([^"]*)"[^>]*>(.*?)</(?:Composer|Layout)>', re.DOTALL)
for m in layout_re.finditer(content):
layout_name = m.group(1)
layout_content = m.group(2)
print(f"=== 布局: {layout_name} ===")
# 检查 Map 项
map_item_re = re.compile(r'<ComposerMap[^>]*>(.*?)</ComposerMap>', re.DOTALL)
for mm in map_item_re.finditer(layout_content):
map_content = mm.group(1)
# 检查是否有 lockedLayers
locked = re.findall(r'<lockedLayers>(.*?)</lockedLayers>', map_content, re.DOTALL)
if locked:
print(f" lockedLayers: {locked[0][:500]}")
# 检查 keepLayerSet
keep_set = re.findall(r'keepLayerSet="([^"]*)"', mm.group(0))
if keep_set:
print(f" keepLayerSet: {keep_set[0]}")
# 检查 followPreset
preset = re.findall(r'followPreset="([^"]*)"', mm.group(0))
if preset:
print(f" followPreset: {preset[0]}")
# 检查 followPresetName
preset_name = re.findall(r'followPresetName="([^"]*)"', mm.group(0))
if preset_name:
print(f" followPresetName: {preset_name[0]}")
# 检查 <layerSet>
layer_set = re.findall(r'<layerSet>(.*?)</layerSet>', map_content, re.DOTALL)
if layer_set:
print(f" layerSet: {layer_set[0][:500]}")
# 检查 <ComposerMapGrid>
grids = re.findall(r'<ComposerMapGrid[^>]*/>', map_content)
print(f" grids: {len(grids)}")
# 也检查 <Layout> 格式 (QGIS 3.x)
map_item2_re = re.compile(r'<LayoutItem[^>]*type="[^"]*map[^"]*"[^>]*>(.*?)</LayoutItem>', re.DOTALL | re.IGNORECASE)
for mm in map_item2_re.finditer(layout_content):
map_content = mm.group(1)
print(f" [LayoutItem Map] attributes: {mm.group(0)[:300]}")
# 打印模板中所有的 map theme / visibility preset
presets = re.findall(r'<(?:visibility-presets|map-theme-collection).*?</(?:visibility-presets|map-theme-collection)>', content, re.DOTALL)
if presets:
print("\n=== 可见性预设 ===")
print(presets[0][:500])