'commit'
This commit is contained in:
102
Util/AreaUtil.py
Normal file
102
Util/AreaUtil.py
Normal file
@@ -0,0 +1,102 @@
|
||||
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
|
||||
"""
|
||||
# 加载数据
|
||||
abbrev_map, fullname_map = load_jiancheng_data()
|
||||
yunnan_area_map = load_yunnan_area_data()
|
||||
|
||||
# 1. 先查简称映射表
|
||||
if query_str in abbrev_map:
|
||||
return abbrev_map[query_str]
|
||||
|
||||
# 2. 再查全称映射表
|
||||
if query_str in fullname_map:
|
||||
return fullname_map[query_str]
|
||||
|
||||
# 3. 最后查完整行政区划数据
|
||||
if query_str in yunnan_area_map:
|
||||
return yunnan_area_map[query_str]
|
||||
|
||||
# 未找到
|
||||
return None
|
Reference in New Issue
Block a user