有时候我们绘制如下地图时,要框出某一个城市,或者县城的区域:
这时在编码绘图时,我们需要相应型行政区的json格式的边界坐标集合。
我的上一篇文章写了, 使用python,利用request工具,从高德地图公开API获取中国各个行政区域边界经纬度坐标集。
批量获取中国所有行政区域经边界纬度坐标(到县区级别)_卖香油的少掌柜的博客-CSDN博客本文使用python,利用request工具,从高德地图公开API获取中国各个行政区域边界经纬度坐标集。行政区最细分到县和区的级别。https://blog.csdn.net/qq_58832911/article/details/125617715但是有些同一级同名的地区,会使用相同的边界。这是一个小bug。
本文是,使用了公开坐标数据集转换Json格式,实现获取json格式的边界坐标集合。
csv数据源是可以免费获取的:
你也可以下载我的网盘:
链接:https://pan.baidu.com/s/1AU7sFHoBQBtWT3lMBZAZHg
提取码:ucv9
csv数据的样子:
目的:转化为这个格式的json格式
import pandas as pd
import json
import re
# 读 ok_geo.csv csv文件
def read_csv(file_name):
df = pd.read_csv(file_name, encoding='utf-8')
# 创建国家字典
country_dict = {"name": "China", "border": None, "area": []}
# 实验用的n控制循环次数
n = 0
for index, row in df.iterrows():
# 判断是否是一级地址
if row["deep"] == 0:
# 创建省字典
province_dict = {"name": None, "center": None, "border": None, "area": []}
# 赋值省份字典
province_dict["name"] = row["name"]
# 获取省份坐标中心
province_dict["center"] = [float(i) for i in row["geo"].split(" ")]
# print(province_dict["center"])
province_border = row["polygon"]
# 按","分割,再按照空格分割,转换浮点类型
province_border = [[float(i) for i in re.split(" |;", j)] for j in province_border.split(",")]
province_dict["border"] = province_border
# 将省份字典添加到国家字典的area中
country_dict["area"].append(province_dict)
elif row["deep"] == 1:
# 创建市字典
city_dict = {"name": None, "center": None, "border": None, "countyArea": []}
# 赋值市字典
city_dict["name"] = row["name"]
try:
# 获取市坐标中心
city_dict["center"] = [float(i) for i in row["geo"].split(" ")]
except:
city_dict["center"] = None
# 获取市边界
try:
city_border = row["polygon"]
# 按","分割,再按照空格分割,转换浮点类型
city_border = [[float(i) for i in re.split(' |;', j)] for j in city_border.split(",")]
except:
city_border = None
city_dict["border"] = city_border
# 判断属于哪个省
belong_to_p = row["ext_path"].split(" ")[0]
# print(belong_to_p)
# 查找国家字典中省份列表中的省份字典那个name属性值与belong_to_p相同的那个省份字典所在列表的索引
for i, x in enumerate(country_dict["area"]):
if x["name"] == belong_to_p:
# 将市字典添加到省份字典的area中
p_index = i
break
# print(p_index)
country_dict["area"][p_index]["area"].append(city_dict)
else:
# 创建县区字典
district_dict = {"name": None, "center": None, "border": None}
# 赋值县区字典
district_dict["name"] = row["name"]
# 获取县坐标中心
try:
district_dict["center"] = [float(i) for i in row["geo"].split(" ")]
except:
district_dict["center"] = []
# 获取边界坐标
try:
district_border = row["polygon"]
# 按","分割,再按照空格分割,转换浮点类型
district_border = [[float(i) for i in re.split(' |;', j)] for j in district_border.split(",")]
except:
district_border = []
district_dict["border"] = district_border
# 判断属于哪个省
belong_to_p, belong_to_c= row["ext_path"].split(" ")[0], row["ext_path"].split(" ")[1]
# print(belong_to_p)
# 查找国家字典中省份列表中的省份字典那个name属性值与belong_to_p相同的那个省份字典所在列表的索引
for i, x in enumerate(country_dict["area"]):
if x["name"] == belong_to_p:
# 将县区字典添加到市字典的countyArea中
p_index = i
break
# print(p_index)
# 判断属于那个市
for i, x in enumerate(country_dict["area"][p_index]["area"]):
if x["name"] == belong_to_c:
c_index = i
break
# print(c_index)
country_dict["area"][p_index]["area"][c_index]["countyArea"].append(district_dict)
# print(country_dict)
print("正在进行第" + str(n) + "次循环," + "处理的地址为:" + row["ext_path"])
n += 1
if n==3:
break
# print(country_dict)
# 写入json文件
with open('demo.json', 'w', encoding='utf-8') as f:
json.dump(country_dict, f, ensure_ascii=False)
if __name__ == "__main__":
read_csv('ok_geo.csv')
pass
结果:
json文件的下载地址。(不过也希望你可以自己跑代码试一试)
链接:https://pan.baidu.com/s/13RDBSmI0RSQHXllRr3Ke3Q
提取码:homc
仅供交流探讨。不用于商业目的。