Files
YunNanProject/Util/AreaUtil.py
2025-09-10 10:22:06 +08:00

110 lines
3.4 KiB
Python
Raw Permalink 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 = {}
# 1. 添加省级数据
province_name = data.get('name')
province_code = data.get('code')
if province_name and province_code:
area_map[province_name] = {'full_name': province_name, 'area_code': province_code}
# 2. 遍历城市和区县(非递归实现)
citys = data.get('citys', [])
for city in citys:
# 添加城市数据
city_name = city.get('name')
city_code = city.get('code')
if city_name and city_code:
area_map[city_name] = {'full_name': city_name, 'area_code': city_code}
# 添加区县数据
areas = city.get('areas', [])
for area in areas:
area_name = area.get('name')
area_code = area.get('code')
if area_name and area_code:
area_map[area_name] = {'full_name': area_name, 'area_code': area_code}
return area_map
def query_area_info(query_str):
"""
查询行政区划信息
:param query_str: 简称或全称
:return: 包含full_name和area_code的字典未找到返回None
"""
abbrev_map, fullname_map = load_jiancheng_data()
yunnan_area_map = load_yunnan_area_data()
# 1. 优先查询完整行政区划数据(最重要修正)
if query_str in yunnan_area_map:
return yunnan_area_map[query_str]
# 2. 再查简称映射表(处理特殊名称)
if query_str in abbrev_map:
return abbrev_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