이번 포스팅에서는 R의 leaflet 패키지Open Street Map 활용하여 RStudio 또는 Jupyter Notebook R kernel IDE 에서 Interactive Map 을 그리는데 있어,


(1) 기본 상호작용하는 지도 생성하기 (create a basic interactive map)

(2) 지도 스타일 추가하기 (add map styles)

(3) 지도 좌표에 표시 풍선 추가하기 (add marker popup at latitude/longitude coordinates)

(4) 상호작용하는 동적 지도를 웹 페이지로 저장하기 (save an interactive map as web page)


하는 방법을 소개하겠습니다.


아래의 포스팅 예시는 RStudio IDE 에서 진행하였습니다. (Jupyter Notebook R kernel 에서도 가능)



  (1) 기본 상호작용하는 지도 생성하기 (create a basic interactive map)


먼저 R의 leaflet 패키지를 설치하고 불러오기를 해보겠습니다.



# install and importing leaflet package
install.packages("leaflet")
library(leaflet)




다음으로 leaflet 패키지의 leaflet() 함수를 사용하여, 기본 OpenStreetMap 타일을 추가하고 (add default OpenStreetMap map tiles), 대한민국의 위도(latitude), 경도(longitude) 위치에 zoom = 6 의 축소/확대 비율로 설정해서 동적인 지도(interactive map)를 그려보겠습니다.


마우스 커서로 좌측 상단의 '+'를 클릭하면 지도가 'zoom in' 확대되어 더 상세하게 볼 수 있으며, 반대로 좌측 상단의 '-' 를 클릭하면 지도가 'zoom out' 축소되어 더 넓은 지역을 볼 수 있게 됩니다. (마우스 휠을 사용해서 zoom in, zoom out 할 수도 있습니다.)



# creat a basic map
leaflet() %>%
  addTiles() %>% # add default OpenStreetMap map tiles
  setView( lng=127.063, lat=37.513, zoom = 6) # korea, zoom 6





애초에 기본 지도를 생성할 때 지도의 zoom 수준을 setView(zoom = xx) 에서 숫자로 설정해줄 수도 있습니다. 바로 위에서 생성했던 지도가 zoom = 6 이었다면, 아래 지도는 zoom = 8, zoom = 16 으로 기본 지도를 생성하게 해보겠습니다. 아래에 보면, 지도가 좀더 zoom in 으로 확대되어 더 상세하게 볼 수 있습니다.

(물론 interactive map 이기 때문에 마우스를 이용해서 언제든지 자유롭게 지도를 동적으로 zoom in, zoom out 할 수 있습니다.)



# zoom = 8

leaflet() %>%
  addTiles() %>% # add default OpenStreetMap map tiles
  setView( lng=127.063, lat=37.513, zoom = 8) # korea, zoom 8




# zoom = 16  (zoom in)

leaflet() %>%
  addTiles() %>%
  setView( lng=127.063, lat=37.513, zoom = 16) # korea, COEX






  (2) 지도 스타일 추가하기 (add map styles)


addProviderTiles("Tile Name Here") 를 이용하여 외부 지도 타일을 추가할 수 있습니다.


아래는 NASA에서 제공하는 우주의 인공위성에서 바라본 2012년 밤의 지도 타일("NASAGIBS.ViirsEarthAtNight2012") 입니다. 별도의 파일을 미리 다운로드 하거나 할 필요는 없구요, 그냥 타일 이름을 addProviderTiles() 메소드 안에 큰 따옴표로 해서 적어주기만 하면 됩니다. (물론, 외부와 통신할 수 있는 인터넷망에 접속해 있어야 합니다.)


한국의 경우 남한은 밤에 환한 반면에, 북한은 평양 빼고는 어둡네요. 38선 경계도 불빛으로 환하게 구분이 되는 모습을 보노라니 약간 서글프네요.



# map style: NASA
leaflet() %>%
  addTiles() %>%
  setView( lng=127.063, lat=37.513, zoom = 6) %>%
  addProviderTiles("NASAGIBS.ViirsEarthAtNight2012")





아래는 zoom = 16 으로 zoom in 해서 삼성동 COEX 부근을 확대해본 것인데요, 여기에 addProviderTiles("Esri.WorldImagery") 타일을 추가해 보았습니다. 항공사진 모습의 타일이네요.



# map style: Esri.WorldImagery
leaflet() %>%
  addTiles() %>%
  setView( lng=127.063, lat=37.513, zoom = 16) %>%
  addProviderTiles("Esri.WorldImagery")





위의 두 예 외에 leaflet() 에 다른 외부 타일 제공자의 타일 지도를 추가하고 싶으면 아래의 url 의 Leaflet-prodivers preview 에 방문해서 원하는 형태의 지도 스타일을 찾았다면 그 이름을 addProviderTiles("Tile Name Here") 메소드 안에 타일 이름을 큰 따옴표 안에 써주기만 하면 됩니다.


https://leaflet-extras.github.io/leaflet-providers/preview/






  (3) 지도 좌표에 표시 풍선 추가하기

      (add marker popup at latitude/longitude coordinates)


addMarkers() 메소드를 사용하면 위도(latitude), 경도(longitude) 좌표 위치에 풍선 모양의 표식과 커서를 클릭했을 때 팝업으로 나타나는 설명을 추가할 수 있습니다.


아래 예제에서는 대한민국 삼성동의 COEX Mall (코엑스 몰), GBC (현대자동차 Global Business Center), Samsil-Stadium (올림픽 주 경기장) 의 3개 주요 POI (Point Of Interest) 지점에 말풍선 표식을 추가해보았습니다. 마우스 커서를 말풍선 표식에 가져가서 클릭을 해보면 popup 설명이 튀어나옵니다.

(아래 예제는 스크린 캡쳐를 한 이미지 파일이어서 interactive map 기능이 안됩니다. RStudio 나 Jupyter Notebook R kernel 에서 interactive map 기능 사용 가능합니다.)



# adding Popup
popup = c("COEX", "GBC", "JamsilStadium")

leaflet() %>%
  addTiles() %>%
  addMarkers(lng = c(127.059, 127.063, 127.073), # longitude
             lat = c(37.511, 37.512, 37.516), # latitude
             popup = popup)




  (4) 상호작용하는 동적 지도를 웹 페이지로 저장하기

       (save an interactive map as web page)


위에서 만든 Interactive Map 을 HTML 웹 페이지로 저장하여 내보내기를 할 수 있습니다.


RStudio의 우측 하단의 Viewer 화면에서

   > Export

      > Save as Web Page


메뉴를 선택한 후에




아래와 같은 'Save As Web Page' 저장하기 팝업 화면이 나오면 HTML 파일의 이름과 저장할 경로를 지정해주면 됩니다.  나중에 이 HTML 파일을 웹 페이지에 올려서 바로 Interactive Map 을 바로 웹 페이지에 올릴 수 있습니다.




2020년 마지막 포스팅이 되겠네요.

이번 포스팅이 많은 도움이 되었기를 바랍니다.


행복한 데이터 과학자 되세요.

그리고 2020년 한해 마무리 잘하시고, 2021년 새해에는 건강하시고 복 많이 받으세요.


728x90
반응형
Posted by Rfriend
,