新知一下
海量新知
6 2 9 9 4 3 8

吓死宝宝了!确诊病例曾距离我仅仅650米!

大数据架构师 | 2022/01/19 10:09

新知达人, 吓死宝宝了!确诊病例曾距离我仅仅650米!

获取数据

首先从官方公布的信息中,可以提取到其在京主要的活动轨迹点,并将这些途径地点信息存储到

北京疫情.csv

的文件中。

新知达人, 吓死宝宝了!确诊病例曾距离我仅仅650米!

想要查询距离,就要先获取各个坐标点的经纬度。

我们可以使用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】和【手动】的办法,验证一下。

新知达人, 吓死宝宝了!确诊病例曾距离我仅仅650米!

事实证明,坐标经纬度基本一致,我们的程序没有问题。

有了坐标点就可以计算距离,将地球简化为一个球体(平均半径为6371公里),那么就可以使用数学公式计算了。

新知达人, 吓死宝宝了!确诊病例曾距离我仅仅650米!

同样,我们也可以使用Python自定义函数去计算两个坐标点之间的距离。那么,这里同样在北京地图上随便选两个地点,分别用【Python自定义函数】和【手动】的办法,验证一下。

新知达人, 吓死宝宝了!确诊病例曾距离我仅仅650米!

事实证明,两点之间直线距离基本一致,我们的程序没有问题。

接着,就可以应用该自定义函数去计算每一个途经点距离我的距离了!

df['距离(公里)'] = df['经纬度'].apply(get_address_distance)

最后,倒序即可看到距离我最近的途经点。

df.sort_values(by=["距离(公里)"]).head()

新知达人, 吓死宝宝了!确诊病例曾距离我仅仅650米!

啊这???

某个途经点距离我650米?

不过仔细一想也不太可怕,毕竟途经点有那么多,除了看空间还要看时间嘛,大概率不会与病例曾“同时空”存在。

如果社区需要做核酸,积极配合就完事了。

新知达人, 吓死宝宝了!确诊病例曾距离我仅仅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

文件,具体效果如下图所示:

新知达人, 吓死宝宝了!确诊病例曾距离我仅仅650米!

简单解释一下上图,我按照距离远近对这些途经点标记了颜色,其中红色是距离我 3公里以内。Pyecharts生成的可视化文件支持交互,鼠标移至每个途经点时,都会出现该点的名称和距离我多远!

PS:代码中我使用的是Geo,觉得百度地图作为底图更好看的小伙伴,可以尝试使用BAMP。


更多“算法”相关内容

更多“算法”相关内容

新知精选

更多新知精选