現有一個需求,調用高德api獲取全國縣級以上行政區數據并保存為json文件,使用python獲取:
import requests
import json# 高德API Key
api_key = "your_api_key"# 調用行政區域查詢API
def fetch_districts():url = f"https://restapi.amap.com/v3/config/district?key={api_key}&subdistrict=3&extensions=base"response = requests.get(url)if response.status_code == 200:return response.json()else:print("請求失敗,狀態碼:", response.status_code)return None# 提取省市縣區數據
def extract_regions(districts):regions = []for district in districts:# 提取當前節點if district["level"] in ["province", "city", "district"]:regions.append({"name": district["name"],"level": district["level"],"adcode": district["adcode"],"citycode": district["citycode"],"center": district["center"]})# 遞歸提取子節點if "districts" in district:regions.extend(extract_regions(district["districts"]))return regions# 保存數據為JSON文件
def save_to_json(data, filename):with open(filename, "w", encoding="utf-8") as f:json.dump(data, f, ensure_ascii=False, indent=4)print(f"數據已保存到 {filename}")# 主函數
def main():# 獲取數據data = fetch_districts()if data:# 提取省市縣區數據regions = extract_regions(data["districts"])# 保存為JSON文件save_to_json(regions, "regions.json")if __name__ == "__main__":main()
獲得的行政區數據結構如下(部分數據):
[{"name": "河南省","level": "province","adcode": "410000","citycode": [],"center": "113.753094,34.767052"},{"name": "洛陽市","level": "city","adcode": "410300","citycode": "0379","center": "112.453895,34.619702"},{"name": "新安縣","level": "district","adcode": "410323","citycode": "0379","center": "112.13246,34.728909"}
]
在mysql中新建一張表,存儲這些數據:
CREATE TABLE administrative_regions (id INT AUTO_INCREMENT PRIMARY KEY COMMENT '主鍵ID',name VARCHAR(100) NOT NULL COMMENT '行政區名稱',level VARCHAR(50) NOT NULL COMMENT '行政區級別(province/city/district)',adcode VARCHAR(20) NOT NULL COMMENT '行政區編碼',citycode VARCHAR(20) COMMENT '城市編碼',center VARCHAR(50) COMMENT '行政區中心點坐標',parent_id INT COMMENT '上級行政區ID',first_letter_1 CHAR(1) COMMENT '行政區名稱第1個字的首字母',first_letter_2 CHAR(1) COMMENT '行政區名稱第2個字的首字母',CONSTRAINT fk_parent_id FOREIGN KEY (parent_id) REFERENCES administrative_regions(id)
) COMMENT='全國省市縣區數據表';
使用navicat將json數據導入本地數據庫,生成表中name,level,adcode,citycode,center的值。
如果想實現按行政區名稱第1個字和第2個字拼音首字母返回,可借助python的拼音庫為表中first_letter_1和first_letter_2字段賦值,下面說下具體實現步驟:
1.安裝pymysql和pypinyin庫:
pip install pymysqlpip install pypinyin
2.寫一個python腳本,連上mysql數據庫,使用pypinyin庫獲得行政區名稱第1個字和第2個字拼音首字母,然后批量修改first_letter_1和first_letter_2字段的值:
import pymysql
from pypinyin import pinyin, Style# 數據庫連接配置
db_config = {'host': 'localhost','port': 3306,'user': 'root','password': 'root','database': 'area','charset': 'utf8mb4'
}# 獲取漢字的拼音首字母
def get_first_letter(chinese_char):return pinyin(chinese_char, style=Style.FIRST_LETTER)[0][0].upper()
# 連接數據庫
connection = pymysql.connect(**db_config)
cursor = connection.cursor()# 查詢所有行政區名稱
cursor.execute("SELECT id, name FROM administrative_regions")
regions = cursor.fetchall()# 更新 first_letter_1 和 first_letter_2
for region in regions:region_id, name = regionif len(name) >= 1:first_letter_1 = get_first_letter(name[0])else:first_letter_1 = ''if len(name) >= 2:first_letter_2 = get_first_letter(name[1])else:first_letter_2 = ''# 更新數據庫cursor.execute("UPDATE administrative_regions SET first_letter_1 = %s, first_letter_2 = %s WHERE id = %s",(first_letter_1, first_letter_2, region_id))# 提交事務并關閉連接
connection.commit()
cursor.close()
connection.close()
更新后的表數據為:
最后,編寫sql語句,實現按名稱首字母分類返回,本人服務器端程序使用Java開發,下面是示例:
查詢語句:
SELECT name, first_letter_1 FROM administrative_regions ORDER BY first_letter_1, first_letter_2
?service代碼:
public Map<String, List<String>> getAreaGroupedByFirstLetter1() {List<AdministrativeRegions> regions = baseMapper.selectAllRegions();Map<String, List<String>> map = regions.stream().collect(Collectors.groupingBy(AdministrativeRegions::getFirstLetter1,Collectors.mapping(AdministrativeRegions::getName, Collectors.toList())));return map;}
最后,得到類似下面的行政區數據:
{
? ? "msg": "操作成功",
? ? "code": 200,
? ? "data": {
? ? ? ? "A": [
? ? ? ? ? ? "昂昂溪區",
? ? ? ? ? ? "阿巴嘎旗",
? ? ? ? ? ? "阿壩藏族羌族自治州",
? ? ? ? ? ? "阿壩縣",
? ? ? ? ? ? "阿城區",
? ? ? ? ? ??? ?..............
? ? ? ? ? ? ],
? ? ? ?....
? ?}