"""检查布局 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 有两种布局格式: (QGIS 2.x style) 和 (QGIS 3.x style) layout_re = re.compile(r'<(?:Composer|Layout)[^>]*name="([^"]*)"[^>]*>(.*?)', 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']*>(.*?)', re.DOTALL) for mm in map_item_re.finditer(layout_content): map_content = mm.group(1) # 检查是否有 lockedLayers locked = re.findall(r'(.*?)', 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]}") # 检查 layer_set = re.findall(r'(.*?)', map_content, re.DOTALL) if layer_set: print(f" layerSet: {layer_set[0][:500]}") # 检查 grids = re.findall(r']*/>', map_content) print(f" grids: {len(grids)}") # 也检查 格式 (QGIS 3.x) map_item2_re = re.compile(r']*type="[^"]*map[^"]*"[^>]*>(.*?)', 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).*?', content, re.DOTALL) if presets: print("\n=== 可见性预设 ===") print(presets[0][:500])