43 lines
1.6 KiB
Python
43 lines
1.6 KiB
Python
"""提取模板 .qgs 中所有图层名称、类型、数据源"""
|
|
import zipfile, re, os, sys
|
|
|
|
template_dir = r"F:\project\xian\xian_algorithm_new\app\data\template\rainfall"
|
|
for fname in sorted(os.listdir(template_dir)):
|
|
if not fname.endswith('.qgz') or fname.startswith('tmp'):
|
|
continue
|
|
path = os.path.join(template_dir, fname)
|
|
z = zipfile.ZipFile(path)
|
|
# 找到 .qgs 文件
|
|
qgs_name = [n for n in z.namelist() if n.endswith('.qgs')][0]
|
|
content = z.read(qgs_name).decode('utf-8')
|
|
|
|
# 提取 maplayer 块
|
|
maplayer_re = re.compile(r'<maplayer[^>]*>(.*?)</maplayer>', re.DOTALL)
|
|
layers = []
|
|
for m in maplayer_re.finditer(content):
|
|
block = m.group(1)
|
|
# 图层名
|
|
name_m = re.search(r'<layername>([^<]+)</layername>', block)
|
|
# provider
|
|
provider_m = re.search(r'<provider[^>]*>(\w+)</provider>', block)
|
|
# datasource (截取前120字符)
|
|
ds_m = re.search(r'<datasource>(.*?)</datasource>', block, re.DOTALL)
|
|
|
|
name = name_m.group(1) if name_m else '?'
|
|
provider = provider_m.group(1) if provider_m else '?'
|
|
ds = ds_m.group(1).strip()[:120] if ds_m else '?'
|
|
|
|
layers.append((name, provider, ds))
|
|
|
|
print(f"\n{'='*60}")
|
|
print(f"模板: {fname}")
|
|
print(f"{'='*60}")
|
|
for name, provider, ds in layers:
|
|
print(f" [{provider:10s}] {name}")
|
|
if ds:
|
|
print(f" ds: {ds}")
|
|
|
|
# 只分析第一个模板(所有 rainfall 模板结构相同)
|
|
if fname == '暴雨内涝潜在隐患点及人口分布图.qgz':
|
|
break
|