Chapter 21 Map using leaflet

데이터는 저번시간에 사용한 자료를 이용하겠습니다.

json 파일로 되어 있으므로 이를 받아서 읽고 visualizaton을 해보도록 하겠습니다. 필요한 package를 다운로드 받아 보겠습니다.

if(!require(jsonlite)) install.packages('jsonlite')
if(!require(ggmap))    install.packages('ggmap')
if(!require(ggplot2))  install.packages('ggplot2')
library(jsonlite)
library(ggmap)
library(ggplot2)
library(tidyverse)

간혹 leaflet 페키지가 설치 않되는 분이 있습니다. 이때는 png 나 raster 같은 그림과 지형을 출력하는 페키지가 미리설치되지 않아서 입니다. 윈도우는 대부분 저절로 되는 경우가 많은데, linux 쓰시는 분에서 그런 문제점이 발견되는 것 같습니다. 이럴때 해결되는 방안 하나를 기록해 두겠습니다. 이미 설치된 분은 하지 않아도 됩니다.
  리눅스 터미널에서 아래의 항목들을 설치해 줍니다.

# step 1 in ubuntus terminal 
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install gdal-bin proj-bin libgdal-dev libproj-dev 
sudo apt-get install -y r-cran-png -y
sudo apt-get install -y r-cran-raster -y 
sudo apt-get install libpng16-16 

  두번째는 R consol 에서 필요한 페키지를 설치해 줍니다. 시간이 오래 걸리는 페키지는 기다려 봅니다. 이후 되부분 잘 되는데, 않되는 경우 질문 바랍니다 .

# step2 in R consol 
if(!require('rgdal')) install.packages('rgdal') 
if(!require('png')) install.packages('png') 
if(!require('raster')) install.packages('raster') 
if(!require('leaflet')) install.packages('leaflet') 

다운로드 경로가 아래와 같이 되었네요. 여기서 location을 가져와서 위도와 경도를 설정하고 그 위치에 맞게 점을 표시하려고 합니다.

#map_data = fromJSON("data/Takeout/Location History/Location History.json")

위도와 경도를 생성해 주는 data step을 진행하고, 50000건의 정보만 남기겠습니다.

#map_data$locations

locations = map_data$locations
loc_dat1 =  locations %>%
  mutate(lat = latitudeE7/1e7, 
         lng = longitudeE7/1e7) %>%
  mutate(year = str_sub(timestampMs, 1, 2), 
         month= str_sub(timestampMs, 3, 4))

loc_dat_sample = loc_dat1 %>%
  slice(1:50000)

21.1 leaflet

leaflet 지도 자료를 사용하겠습니다. 무료이고 시각화를 위해서는 충분한 자료입니다. 한국 데이터에 위에서 만들었던 위도와 경도를 사용하겠습니다.

library(leaflet)
popu = c("korea")
lng  = loc_dat_sample$lng
lat  = loc_dat_sample$lat

한국 지도 불러오기

연구실 근처를 불러오겠습니다.

leaflet() %>%
  setView(lng = 126.91, 
          lat = 37.56, 
          zoom = 13) %>%
  addTiles()

돌아 다녔던 위도와 경도를 그려보겠습니다.

leaflet(loc_dat_sample) %>%
  setView(lng = 126.91, 
          lat = 37.56, 
          zoom = 13) %>%
  addTiles() %>%
  #addMarkers(lng = lng, lat = lat)
  addCircleMarkers(lng = lng, lat = lat, 
                   radius = 2, 
                   color  = "red", 
                   stroke = FALSE, 
                   fillOpacity = 0.5)

21.2 위치와 시간표시

google drive_auth이후 과정입니다. 상기 부분이 않되는 경우는 앞 쳅터를 공부하고 오시기 바랍니다.

if(!require('googledrive')) install.packages('googledrive')
library(googledrive)
drive_auth()
ls <- drive_ls(path = '/Takeout/', 
               pattern = "*.*")
ls
ls$name[1]
ls$id[1]

temp <- tempfile(fileext =".zip")
data1 <- drive_download(as_id(ls$id[1]), 
                        path = temp, 
                        overwrite = TRUE)
out <- unzip(temp, exdir =paste0(getwd(), "/data"))
# library ---------------
if(!require(jsonlite)) install.packages('jsonlite')
if(!require(ggmap)) install.packages('ggmap')
if(!require(ggplot2)) install.packages('ggplot2')
if(!require(tidyverse)) install.packages('tidyverse')
if(!require(leaflet)) install.packages('leaflet')
library(jsonlite)
library(ggmap)
library(ggplot2)
library(tidyverse)
library(leaflet)

map_data = fromJSON("data/Takeout/Location History/Semantic Location History/2021/2021_APRIL.json")

# lon, lat, activity, time
# activity and its' time
dat = cbind(map_data$timelineObjects$activitySegment$activityType, 
      map_data$timelineObjects$activitySegment$duration)
# location time
LoStTime = map_data$timelineObjects$placeVisit$duration$startTimestampMs
LoEnTime = map_data$timelineObjects$placeVisit$duration$endTimestampMs
# time stamp function (google epoch to R time)
ft = function(x){
 as.POSIXct(as.numeric(x)/1000, origin = "1970-01-01")
}
# data step
dat1 = dat %>% tibble() %>%
  mutate(StTime = ft(startTimestampMs), 
         EnTime = ft(endTimestampMs)) %>%
  select(-startTimestampMs, -endTimestampMs) %>%
  mutate(
    lat = map_data$timelineObjects$placeVisit$location$latitudeE7/1e7,
    lng = map_data$timelineObjects$placeVisit$location$longitudeE7/1e7, 
    place = map_data$timelineObjects$placeVisit$location$name
  ) %>% 
  mutate(LoStTime = ft(LoStTime), 
         LoEnTime = ft(LoEnTime))
  leaflet() %>%
  setView(lng = 126.91, 
          lat = 37.56, 
          zoom = 13) %>%
  addTiles() %>%
  addCircleMarkers(lng = dat1$lng, 
                   lat = dat1$lat, 
                   radius = 10, 
                   color ="red", 
                   stroke = FALSE, 
                   fillOpacity = 0.5)
## Warning in validateCoords(lng, lat, funcName): Data contains 140 rows with
## either missing or invalid lat/lon values and will be ignored
  leaflet() %>%
    setView(lng = 126.91, 
            lat = 37.56, 
            zoom = 13) %>%
    addTiles() %>%
    addMarkers(lng = dat1$lng, 
               lat = dat1$lat, 
               clusterOptions = markerClusterOptions(), 
               popup = paste(dat1$place,"<br>" ,dat1$LoStTime)
               ) 
## Warning in validateCoords(lng, lat, funcName): Data contains 140 rows with
## either missing or invalid lat/lon values and will be ignored