在上一篇文章中,我演示了如何使用R中的Leaflet包生成基于地图的热图分布图。在该示例中,我实现了一个功能,该功能将位置作为字符串发送到Open Street Map API,然后接收纬度和经度坐标作为返回值JSON格式的值。
在本文中,我将演示如何使用osmdata包来实现地理编码部分,而无需实现“复杂”功能。
首先,我定义了一组用作位置的城镇。我将它们添加到具有预定义的标头名称以及行数和列数的空数据框模板中
#定义一个数据帧模板以填充整个地理编码过程
data_df = as.data.frame(matrix(nrow=20,ncol=4))
colnames(data_df) = c("location","lat","long","values")
#添加城市和城镇名称作为位置
data_df$location = c("Siegen, Germany", #1
"Kreuztal, Germany", #2
"Netphen, Germany", #3
"Olpe, Germany", #4
"Freudenberg, Germany", #5
"Hilchenbach, Germany", #6
"Wilnsdorf, Germany", #7
"Betzdorf, Germany", #8
"Dillenburg, Germany", #9
"Marburg, Germany", #10
"Biedenkopf, Germany", #11
"Koblenz, Germany", #12
"Erndtebrück, Germany", #13
"Herborn, Germany", #14
"Cölbe, Germany", #15
"Haiger, Germany", #16
"Krombach, Germany", #17
"Wenden, Germany", #18
"Betzdorf, Germany", #19
"Münchhausen, Germany" #20
)
接下来,我使用R中的osmdata软件包对位置进行地理编码。
#在R中导入osmdata软件包
library(osmdata)
#使用getbb()函数对位置进行地理编码
for(i in 1:nrow(data_df)){
coordinates = getbb(data_df$location[i])
data_df$long[i] = (coordinates[1,1] + coordinates[1,2])/2
data_df$lat[i] = (coordinates[2,1] + coordinates[2,2])/2
}
现在,数据框包含位置名称以及经过地理编码的经度和纬度坐标;另外,我在每个位置添加一些随机分布的观察值(这将定义热图图的颜色强度)。
# adding randomly distributed values by location (uniform distribution)
data_df$values = runif(n = 20, min = 0, max = 100)
在最后一步中,我使用R中的Leaflet生成了一个按位置显示观察值分布的热图。
#导入leaflet,leaflet.extras和magrittr
library(leaflet)
library(leaflet.extras)
library(magrittr)
#根据Google趋势为汉堡搜索强度创建热图
data_df %>%
leaflet() %>%
addTiles() %>%
addProviderTiles(providers$OpenStreetMap.DE) %>%
setView(mean(data_df$long),mean(data_df$lat),8) %>%
addHeatmap(lng=~long,lat=~lat,intensity=~values,max=100,radius=30,blur=20)
专业领域为优化和仿真的工业工程师(R,Python,SQL,VBA)
Leave a Reply