2019年12月以来,湖北省武汉市部分医院陆续发现了多例有华南海鲜市场暴露史的不明原因肺炎病例,现已证实为2019新型冠状病毒感染引起的急性呼吸道传染病。截至2月17日9时,全国累计报告确诊病例70635例。
疫情的爆发产生了较大影响,疫情动态也成为了绝大多数人日常关注的话题。通过地理信息科学相关方法对疫情进行可视化表达,能够让公众更加直观了解自己身边的疫情情况。百度地图开放平台提供了相关地理计算和可视化手段,可让我们更加方便的对疫情地图进行构建。
现今,媒体对于疫情情况的播报主要为省份、城市级别的,我们可以在各类平台上获知各省及各市疫情病例的新增情况。通过个别平台或当地卫健委网站,可以得知确诊病例所在小区的相关描述。然而在地理认知的层面,这些描述对于疫情的地理表达相对较弱,仅通过数字或者自然语言描述的位置信息,并不能够让公众直观感受到身边的疫情情况。由此,结合百度地图开放平台及百度MapV可视化软件对感染者所在小区进行表达,再根据自己所在的位置,可对身边的疫情情况得到定量的查看。
笔者现居住洛阳,遂开发“洛阳新冠疫情地图”,地图平台的使用效果可以通过访问https://www.cuglyf.cn/ncov/进行查看。
本文将从疫情地理信息提取、地图可视化、距离计算三个方面对基于Web的疫情热力地图的构建方案进行说明。由于开发者所熟悉的后台语言不同,同一思路利用不同语言开发所得到的结果基本无差异,所以本说明侧重前端较为统一的内容进行详细描述。
在地理信息层面,平台构建所需的技术有:百度地图开放平台地图展示、地点检索服务、批量算路服务、浏览器定位服务和MapV中的热力图。
开始之前
利用百度地图开放平台进行开发前,需要获取相应的开发者密钥(AK)。在这一疫情地图开发中,需要用到浏览器端密钥和服务端密钥。
首先,进入百度地图开放平台主页,点击右上角“登陆”,注册或使用个人百度账号登陆。完成登陆后,进入 控制台的创建应用页面,进行开发者密钥的申请。
首先申请浏览器端的密钥,按个人喜好输入应用名称。应用类型设置为浏览器端,在本项目中,启用服务仅需选取Javascript API,在Referer白名单输入“*”即可,如下图所示。
再次打开创建应用页面,申请服务器端的密钥。按个人喜好输入应用名称。应用类型设置为服务器端,在本项目中,启用服务需选取地点检索、批量算路,在IP白名单输入“0.0.0.0/0”即可,如下图所示。
完成上述配置并提交后,可在我的应用页面看到所申请得到的AK,如下图所示。
疫情地理信息提取
疫情信息的获取有多种渠道,除了主流的社交媒体外,从当地卫健委官方网站可准确且最及时能够获取得到小区级别的疫情信息。如笔者所在的河南省洛阳市为例,能够在洛阳市卫健委官方网站(http://www.lyws.gov.cn/)看到每日疫情的公布信息,如下图所示。
打开其中的一篇疫情公示信息,可以看到公示的疫情内容。下图中红框标记的内容为发病者所在的小区的位置描述。一般对于同一个城市的卫健委网站而言,每日发布的每例患者情况描述格式较为规整,可以通过爬虫并结合正则表达式将其提取。
上图所示的两则病例信息对应的患者所在小区描述分别为“瀍河区杨文街道银河小区”和“新安县惠安小区”,依次爬取每日的疫情情况通报得到位置描述的列表。然后,利用百度地图地点检索API,将这些位置描述提取为经纬度。
在使用地点检索API时,首先需要构造请求串。API的URL为:http://api.map.baidu.com/place/v2/search,所需参数主要为query、region和ak。其中,query表示上述自然描述的地址;region为所需要查找的位置范围,可以填写所在的市;ak为前文中申请得到的服务端ak。以病例26为例,在使用json格式进行输出时,构造出的请求串为:
http://api.map.baidu.com/place/v2/search?query=瀍河区杨文街道银河小区®ion=洛阳&ak=MkFIQB0nKFhZDQ6Lgz1&output=json
请求得到的结果如:
{
"status":0,
"message":"ok",
"results":[
{
"name":"瀍河区银河小区",
"location":{
"lat":34.728255,
"lng":112.527949
},
"address":"振兴南路巨龙家园旁边",
"province":"河南省",
"city":"洛阳市",
"area":"瀍河回族区",
"detail":1,
"uid":"b5ac1669c2e1cf2d250bd060"
},
{
"name"