百度地图的地点检索接口可以用于检索某个坐标点周边一定距离内的兴趣点。该接口的介绍文档在这里:https://lbsyun.baidu.com/faq/api?title=webapi/guide/webservice-placeapi/circle ,虽然多边形检索看起来更高效,不过这个接口需要单独申请,所以我们还是只能使用圆形区域检索。
为了更全面的检索,我们可以先生成一个间距均匀的网格点坐标数据,这里为了方便演示,我们使用 50km 的间距(不过实际上 50km 的检索会遗漏很多结果,因为百度地图只会给出该范围的一些热门的搜索结果)。
由于检索是圆形检索,所以为了不遗漏,我们需要建立分辨率与 50√2km x 50√2km 的经纬度网格,这样以每个网格的中心为检索中心、范围是 50km 的圆形区域恰好可以覆盖这一区域,如下图所示:
![]()
生成间距均匀的网格点坐标数据
首先加载所需的 R 包:
library(tidyverse) |
合并各省份的数据得到中国范围的矢量数据:
# 生成中国范围的矢量数据 |
这个中国的范围是这样的:
url <- "http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineCommunity/MapServer/tile/{z}/{y}/{x}" |
![]()
创建一些边长为 50√2 km的格网,这样每个方格正好可以使用一个半径 50km 的圆覆盖。转换成以 m 为单位的坐标系更容易创建:
mycrs <- "+proj=aea +lat_0=0 +lon_0=105 +lat_1=25 +lat_2=47 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs" |
这个网格的效果是这样的:
# 效果是这样的 |
![]()
提取与中国相交的格点:
cngrid %>% |
![]()
计算这些格点的质心:
cngrid %>% |
这样我们就得到了检索中心坐标。另外附件中还提供了 10km 分辨率的网格中心数据(计算方法类似)。
百度地图地点检索接口
该接口的介绍文档在这里:https://lbsyun.baidu.com/faq/api?title=webapi/guide/webservice-placeapi/circle ,使用前需要先申请一个百度地图的 ak 密钥,在运行代码前大家需要把下面代码中的 a8niO5h8icau3IRNG2Wv2k5CduVyrktL 替换成自己的:
这里注意结合视频讲解学习,很多细节难以文字表述。
library(jsonlite) |
然后我们循环解析所有的坐标点。这里为了更高效,我采用的是多线程爬取:
library(parallel) |
并不是所有的文件都是有数据的,所以我们先删除那些没有数据的:
# 删除没有结果的 |
然后合并有结果的:
# 合并有结果的 |
这样我们就得到了 50km 范围内的解析结果。不过这个结果是不全的,大家有时间可以试试更细致的间距(不过也要主要自己的解析额度限制,可能要分好多天解析)。
附件中我给大家提供了一份 10km 范围内的检索结果:
- 全国医疗机构分布(10km范围检索).xlsx
全国医疗机构分布地图
下面我们使用这个数据绘制一幅地图展示:
chinacity2020mini 文件夹是我处理的一份带九段线小地图的中国市级行政区划数据。
# 使用 10km 范围内的检索结果 |
![]()
各城市医疗机构密度地图
使用 st_area() 可以轻松计算各城市的行政区划面积,不过记得不要使用上面的那个带九段线小地图的数据(被编辑过的)。
# 计算各市的面积 |
然后就可以合并数据绘图了:
dfsf %>% |
![]()
ggplot(data = citymapsim2) + |
![]()
点击这里跳转到 RStata 短书平台获取附件:使用 R 语言爬取全国医疗机构列表
评论