R의Leaflet히트 맵

이 코드 예제에서는 datascienceplus에서 찾은 지오 코딩 기능을 사용하여 Google 트렌드 검색 강도 데이터를 지오 코딩하고 독일의 “Burger”와 “Pizza”에 대한 도시 이름별로 검색 트렌드를 비교합니다. 그런 다음 R의 Leaflet 패키지로 생성 된 히트 맵으로 결과를 시각화합니다.

Open Street Map API를 사용한 입력 데이터 지오 코딩

아래 코딩 예제에서는 “datascienceplus”의 지오 코딩 기능을 구현하고 Google Trends 데이터와 함께 두 개의 DataFrame을 사용하여 적용합니다. DataFrames에는 검색어 “Burger”및 “Pizza”에 대한 독일어 도시 이름 별 검색 강도 점수로 구성된 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 onmap.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.)

# 먼저 햄버거 도시를 지오 코딩합니다.
for(i in 1:nrow(input_burger_map)){
  # 지오 코더를 사용하여 도시 이름을 지오 코딩
  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]}
  # OSM API에 의해 금지되는 것을 피하기 위해 1 초 잠자기
  Sys.sleep(1)
}

# 둘째, 피자 도시 지오 코딩
for(i in 1:nrow(input_pizza_map)){
  # 지오 코더를 사용하여 도시 이름을 지오 코딩
  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]}
  # OSM API에 의해 금지되는 것을 피하기 위해 1 초 잠자기
  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")

Leaflet을 사용하여 지오 코딩 된 데이터 히트 매핑

독일 최고의 도시별로 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)

R의 공간 데이터 시각화는 deckgl, ggmap, ggplot2 및 webglobe와 같은 다른 패키지로도 수행 할 수 있습니다. 내 블로그에서 이러한 패키지에 대한 코딩 예제를 찾을 수 있습니다.

You May Also Like

Leave a Reply

Leave a Reply

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.