2025-09-10 10:09:31 +08:00
|
|
|
|
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():
|
2025-09-10 10:22:06 +08:00
|
|
|
|
"""加载云南省行政区划完整数据(非递归实现)"""
|
2025-09-10 10:09:31 +08:00
|
|
|
|
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 = {}
|
2025-09-10 10:22:06 +08:00
|
|
|
|
# 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}
|
2025-09-10 10:09:31 +08:00
|
|
|
|
|
2025-09-10 10:22:06 +08:00
|
|
|
|
# 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}
|
2025-09-10 10:09:31 +08:00
|
|
|
|
|
2025-09-10 10:22:06 +08:00
|
|
|
|
# 添加区县数据
|
|
|
|
|
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}
|
2025-09-10 10:09:31 +08:00
|
|
|
|
|
|
|
|
|
return area_map
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def query_area_info(query_str):
|
|
|
|
|
"""
|
2025-09-10 10:13:38 +08:00
|
|
|
|
查询行政区划信息
|
2025-09-10 10:09:31 +08:00
|
|
|
|
:param query_str: 简称或全称
|
|
|
|
|
:return: 包含full_name和area_code的字典,未找到返回None
|
|
|
|
|
"""
|
2025-09-10 10:13:38 +08:00
|
|
|
|
abbrev_map, fullname_map = load_jiancheng_data()
|
|
|
|
|
yunnan_area_map = load_yunnan_area_data()
|
|
|
|
|
|
2025-09-10 10:22:06 +08:00
|
|
|
|
# 1. 优先查询完整行政区划数据(最重要修正)
|
2025-09-10 10:09:31 +08:00
|
|
|
|
if query_str in yunnan_area_map:
|
|
|
|
|
return yunnan_area_map[query_str]
|
2025-09-10 10:12:26 +08:00
|
|
|
|
|
2025-09-10 10:22:06 +08:00
|
|
|
|
# 2. 再查简称映射表(处理特殊名称)
|
|
|
|
|
if query_str in abbrev_map:
|
|
|
|
|
return abbrev_map[query_str]
|
|
|
|
|
|
|
|
|
|
# 3. 最后查全称映射表+模糊匹配
|
2025-09-10 10:12:26 +08:00
|
|
|
|
if query_str in fullname_map:
|
|
|
|
|
return fullname_map[query_str]
|
|
|
|
|
|
2025-09-10 10:22:06 +08:00
|
|
|
|
# 4. 模糊匹配保持不变
|
2025-09-10 10:12:26 +08:00
|
|
|
|
for name, info in yunnan_area_map.items():
|
|
|
|
|
if query_str in name or name in query_str:
|
|
|
|
|
return info
|
|
|
|
|
|
2025-09-10 10:09:31 +08:00
|
|
|
|
return None
|