66 lines
2.6 KiB
Python
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])
|