Files
YunNanProject/Util/AreaUtil.py
2025-09-10 10:12:26 +08:00

103 lines
3.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import json
import os
def load_jiancheng_data():
"""加载简称映射数据"""
# 获取JianCheng.json文件路径
jiancheng_path = os.path.join(
os.path.dirname(os.path.dirname(__file__)),
'Dict',
'JianCheng.json'
)
try:
with open(jiancheng_path, 'r', encoding='utf-8') as f:
data = json.load(f)
except FileNotFoundError:
print(f"错误:找不到文件 {jiancheng_path}")
return {}, {}
except json.JSONDecodeError:
print(f"错误:{jiancheng_path} 文件格式不正确")
return {}, {}
# 创建简称和全称映射字典
abbrev_map = {}
fullname_map = {}
for item in data:
abbrev = item.get('abbreviation')
fullname = item.get('full_name')
code = item.get('area_code')
if abbrev and fullname and code:
abbrev_map[abbrev] = {'full_name': fullname, 'area_code': code}
fullname_map[fullname] = {'full_name': fullname, 'area_code': code}
return abbrev_map, fullname_map
def load_yunnan_area_data():
"""加载云南省行政区划完整数据"""
area_path = os.path.join(
os.path.dirname(os.path.dirname(__file__)),
'Dict',
'云南省行政区划数据.json'
)
try:
with open(area_path, 'r', encoding='utf-8') as f:
data = json.load(f)
except FileNotFoundError:
print(f"错误:找不到文件 {area_path}")
return {}
except json.JSONDecodeError:
print(f"错误:{area_path} 文件格式不正确")
return {}
# 递归遍历所有行政区划节点
area_map = {}
def traverse_nodes(nodes):
if isinstance(nodes, list):
for node in nodes:
traverse_nodes(node)
elif isinstance(nodes, dict):
# 提取名称和代码
name = nodes.get('name')
code = nodes.get('code') or nodes.get('area_code')
if name and code:
area_map[name] = {'full_name': name, 'area_code': code}
# 处理子节点
children = nodes.get('children')
if children:
traverse_nodes(children)
traverse_nodes(data)
return area_map
def query_area_info(query_str):
"""
查询行政区划信息(优化版)
:param query_str: 简称或全称
:return: 包含full_name和area_code的字典未找到返回None
"""
# 1. 先查简称映射表
if query_str in abbrev_map:
return abbrev_map[query_str]
# 2. 直接查询完整行政区划数据(新增)
if query_str in yunnan_area_map:
return yunnan_area_map[query_str]
# 3. 最后查全称映射表
if query_str in fullname_map:
return fullname_map[query_str]
# 4. 尝试模糊匹配(新增)
for name, info in yunnan_area_map.items():
if query_str in name or name in query_str:
return info
return None