啊?北京确诊病例曾距离我650米!
大家好,我是小五
北京,今天新增一例本地人员新冠肺炎确诊病例。
您瞧我这个乌鸦嘴。。。
根据新华社的推文,北京新增确诊为奥密克戎,轨迹涉及多个购物中心。
那么在京的小伙伴,估计都想查询一下这些途经点距离自己有多远?自己的行程卡会不会出现星号?今天我就分享一下自己是如何用数据查询的吧!
获取数据
首先从官方公布的信息中,可以提取到其在京主要的活动轨迹点,并将这些途径地点信息存储到北京疫情.csv
的文件中。
想要查询距离,就要先获取各个坐标点的经纬度。
我们可以使用Python编程,调用百度地图API得到各个地点的经纬度信息。
import requests
def get_ll(x):
url = f"http://api.map.baidu.com/geocoding/v3/?address={x}&output=json&ak=自己的key值&callback=showLocation"
Post_data = {'address': x}
se = requests.session()
Text = se.post(url, data=Post_data).text.replace("'", '"').replace('/ ', '/')[27:-1]
jsonValue = json.loads(Text)
if('result' in jsonValue):
return [jsonValue['result']['location']['lng'], jsonValue['result']['location']['lat']]
else:
return ' '
其中,自己的key值需要到百度地图开放平台去申请才能使用。
接下来,在北京地图上随便选一个地点,分别用【Python调用百度地图API】和【手动】的办法,验证一下。
事实证明,坐标经纬度基本一致,我们的程序没有问题。
有了坐标点就可以计算距离,将地球简化为一个球体(平均半径为6371公里),那么就可以使用数学公式计算了。
同样,我们也可以使用Python自定义函数去计算两个坐标点之间的距离。那么,这里同样在北京地图上随便选两个地点,分别用【Python自定义函数】和【手动】的办法,验证一下。
事实证明,两点之间直线距离基本一致,我们的程序没有问题。
接着,就可以应用该自定义函数去计算每一个途经点距离我的距离了!
df['距离(公里)'] = df['经纬度'].apply(get_address_distance)
最后,倒序即可看到距离我最近的途经点。
df.sort_values(by=["距离(公里)"]).head()
啊这???
某个途经点距离我650米?
不过仔细一想也不太可怕,毕竟途经点有那么多,除了看空间还要看时间嘛,大概率不会与病例曾“同时空”存在。
如果社区需要做核酸,积极配合就完事了。
可视化
正好我们已经获取了经纬度坐标点,干脆就一鼓作气直接把这些途经点可视化了吧!
同时为了简单方便,直接使用使用Pyecharts进行地理可视化!
data_pair = [(df.iloc[i]['途径地点名称'], df.iloc[i]['距离(公里)']) for i in range(len(df))]
json_str = json.dumps(json_data, ensure_ascii=False, indent=4)
with open('test_data.json', 'w', encoding='utf-8') as json_file:
json_file.write(json_str)
c = (
Geo()
.add_schema(maptype="北京")
.add_coordinate_json(json_file='test_data.json')
.add("", data_pair, symbol_size=30, large_threshold=2000, symbol="pin")
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(visualmap_opts=opts.VisualMapOpts(max_=30), title_opts=opts.TitleOpts(title="北京海淀确诊病例-途经点分布图"))
.set_global_opts(visualmap_opts=opts.VisualMapOpts(max_=2000,
is_piecewise=True,
pieces=[
{"max": 200, "min": 20,
"label": ">20", "color": "#54D7BA"},
{"max": 20, "min": 9,
"label": "9-20", "color": "#BAAB4C"},
{"max": 8, "min": 4, "label": "4-8",
"color": "#FF8605"},
{"max": 3, "min": 0, "label": "0-3",
"color": "#FF4E38"},
]
))
.render("北京海淀确诊病例-途经点分布图.html"))
打开生成的北京海淀确诊病例-途经点分布图.html
文件,具体效果如下图所示:
简单解释一下上图,我按照距离远近对这些途经点标记了颜色,其中红色是距离我 3公里以内。Pyecharts生成的可视化文件支持交互,鼠标移至每个途经点时,都会出现该点的名称和距离我多远!
PS:代码中我使用的是Geo,觉得百度地图作为底图更好看的小伙伴,可以尝试使用BAMP。
最后,希望北京加油,尽快阻断疫情!
一天介绍一本书
R语言数据可视化之美:主要介绍使用R 中的ggplot2 包及其拓展包绘制专业图表的方法。本书先介绍了R 语言编程基础知识,以及使用dplyr、tidyr、reshape2 等包的数据操作方法;再对比了base、lattice 和ggplot2 包的图形语法。另外,本书也首次介绍了论文中学术图表的图表配色、规范格式等相关技能与知识。
希望各位小伙伴能 点赞+分享+留言 一键三连,我会在其中抽取2位幸运同学送出本书!
点击这里,阅读更多数据文章!