使用R使用LEAFLET软件包绘制热图

在此代码示例中,我使用在datascienceplus上找到的地理编码功能对Google趋势搜索强度数据进行地理编码,并按城市名称比较德国“汉堡”和“比萨”的搜索趋势。然后,我用R中的Leaflet包生成的热图可视化结果。

在下面的编码示例中,我实现了“ datascienceplus”的地理编码功能,并使用了两个带有Google Trends数据的DataFrame对其进行了地理编码。 DataFrame包含从Google趋势服务检索的表格数据,其中包括德国城市名称对搜索词“汉堡”和“比萨饼”的搜索强度得分。

#使用基于JSON的OSM-API实现地理编码功能
#install.packages("jsonlite")
library(jsonlite)

# 英文文件: http://wiki.openstreetmap.org/wiki/Nominatim
# 资源: 
# datascienceplus.com/osm-nominatim-with-r-getting-locations-geo-coordinates-by-its-address/
osm_geocoder <- function(address = NULL)
{
  if(suppressWarnings(is.null(address)))
    return(data.frame())
  
  tryCatch(
    d <- jsonlite::fromJSON( 
      gsub('\\@addr\\@', gsub('\\s+', '\\%20', address), 
           'http://nominatim.openstreetmap.org/search/@addr@?format=json&addressdetails=0&limit=1')
    ), error = function(c) return(data.frame())
  )

  if(length(d) == 0) 
    return(data.frame())
  
  return(data.frame(lon = as.numeric(d$lon), lat = as.numeric(d$lat)))
}

# 读取输入数据(带有Google趋势数据的表格CSV文件)
setwd("C:/Users/Linnart/Desktop/Supply Chain Analytics/08 R coding/01__spatial visualization/Spatial food trends analysis")

# 输入数据包含Google在德国汉堡和比萨饼的搜索强度
input_pizza_map <- read.csv(file="Pizza on map.csv",header=TRUE,sep=",",stringsAsFactors = FALSE)
input_burger_map <- read.csv(file="Burger on map.csv",header=TRUE,sep=",",stringsAsFactors = FALSE)
#input_burger_and_pizza_map <-read.csv(file="Pizza vs Burger on map.csv",header=TRUE,sep=",",stringsAsFactors = FALSE)
#input_burger_and_pizza_timeline <- read.csv(file="Pizza vs Burger.csv",header=TRUE,sep=",",stringsAsFactors = FALSE)

# 对输入数据进行地理编码,即应用地理编码功能
input_pizza_map<-data.frame(input_pizza_map$Town.City,"Lat"=rep(NA,nrow(input_pizza_map)),"Long"=rep(NA,nrow(input_pizza_map)),input_pizza_map$Pizza...2.12.17...2.12.18.)
input_burger_map<-data.frame(input_burger_map$Town.City,"Lat"=rep(NA,nrow(input_burger_map)),"Long"=rep(NA,nrow(input_burger_map)),input_burger_map$Burger...2.12.17...2.12.18.)

#首先,对“ BURGER”城市进行地理编码
for(i in 1:nrow(input_burger_map)){
  # use the geocoder to geocode city name
  geocodes <- osm_geocoder(address=paste0(input_burger_map$input_burger_map.Town.City[i],", Germany"))
  print(input_burger_map$input_burger_map.Town.City[i])
  if(nrow(geocodes)>=1){
    input_burger_map$Lat[i] <- geocodes$lat[1]
    input_burger_map$Long[i]<- geocodes$lon[1]}
  # sleep one second to avoid getting banned by OSM API
  Sys.sleep(1)
}

#秒,地理编码pizza城市
for(i in 1:nrow(input_pizza_map)){
  # use the geocoder to geocode city name
  geocodes <- osm_geocoder(address=paste0(input_pizza_map$input_pizza_map.Town.City[i],", Germany"))
  print(input_pizza_map$input_pizza_map.Town.City[i])
  if(nrow(geocodes)>=1){
    input_pizza_map$Lat[i] <- geocodes$lat[1]
    input_pizza_map$Long[i]<- geocodes$lon[1]}
  # sleep one second to avoid getting banned by OSM API
  Sys.sleep(1)
}

在对DataFrames中的城市名称进行地理编码后,我将清理数据,以避免出现空条目和空行。为此,我在R中使用dplyr包:

#清理数据帧,以便不包含任何NA值
#使用“ dplyr”包进行清洁
library(dplyr)

#应用“ dplyr”包装进行清洁
cleaned_pizza_map <- input_pizza_map %>% filter(!is.na(Lat)) 
colnames(cleaned_pizza_map)<-c("City","Lat","Long","Trend")
cleaned_burger_map <- input_burger_map %>% filter(!is.na(Lat))
colnames(cleaned_burger_map)<-c("City","Lat","Long","Trend")

在对德国顶级城市的Google趋势搜索强度得分进行地理编码和清理后,我使用R中的Leaflet包创建了一个热图。使用热图,我可视化了搜索词搜索强度的空间分布:

#导入leaflet和leaflet.extras将使我能够制作热图
library(leaflet)
library(leaflet.extras)
library(magrittr)

#定义地图中心
lat_center <- c(cleaned_burger_map$Lat,cleaned_pizza_map$Lat) %>% as.numeric() %>% mean
long_center <- mean(c(cleaned_burger_map$Long,cleaned_pizza_map$Long)) 

#为汉堡搜索强度创建热图
viz_map_burger <- cleaned_burger_map %>%
  leaflet() %>% 
  addTiles() %>% 
  addProviderTiles(providers$OpenStreetMap.DE) %>% 
  setView(long_center,lat_center,6) %>%
  addHeatmap(lng=~Long,lat=~Lat,intensity=~Trend,max=100,radius=20,blur=10)

#为比萨搜索强度创建热图
viz_map_pizza <- cleaned_pizza_map %>%
  leaflet() %>% 
  addTiles() %>% 
  addProviderTiles(providers$OpenStreetMap.DE) %>% 
  setView(long_center,lat_center,6) %>%
  addHeatmap(lng=~Long,lat=~Lat,intensity=~Trend,max=100,radius=20,blur=10)

#绘制到1x2网格中;为此,请使用R中的“ mapview”包
#install.packages("mapview")
library(mapview)
latticeview(viz_map_burger,viz_map_pizza)

Leave a Reply

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Close

功能