제주 탈출 일지

빅데이터 분석 - ggmap으로 단양군 명소 표시하기 본문

빅데이터 분석

빅데이터 분석 - ggmap으로 단양군 명소 표시하기

귀건 2020. 10. 7. 14:12
728x90
반응형

이 포스팅에서는 googlemap을 이용해서 다음과 같은 결과물을 얻도록 하겠다. 표시되어 있는 위치들은 단양군의 명소들이라고 한다...

#install.packages("ggplot2")
#install.packages("ggmap")
#install.packages("stringi")

setwd("C:\\Rwd")
library(ggplot2)
library(ggmap)

register_google(key="이곳에 당신의 API 키를 넣어주세요!")

names <- c("도담삼봉/석문", "구담/옥순봉", "사인암", "하선암", "중선암", "상선암")

addr <- c("충청북도 단양군 매포읍 삼봉로 611-33",
          "충청북도 단양군 단성면 월악로 3827",
          "충청북도 단양군 대강면 사인암2길 42",
          "충청북도 단양군 단성면 선암계곡로 1337",
          "충청북도 단양군 단성면 선암계곡로 868-2",
          "충청북도 단양군 단성면 선암계곡로 790")

gc <- geocode(enc2utf8(addr))

df <- data.frame(name=names, lon=gc$lon, lat=gc$lat)

cen <- c((max(df$lon) + min(df$lon))/2,
         (max(df$lat) + min(df$lat))/2)

map <- get_googlemap(center=cen, maptype="roadmap", zoom=12, marker=gc)

ggmap(map)

 

소스코드는 굉장히 간단하다.

ggplot2, ggmap, stringi 패키지가 설치되어 있지 않았다면 install.packages()를 이용해 설치해주자.

 

그 후에는 api 키를 등록해야 하는데, 다음 포스팅을 참고해서 나는 진행했다. 크게 어려운 점은 없으나, 카드를 등록해둬야 한다...(돈 나갈일은 거의 없긴 하다.)

https://m.blog.naver.com/PostView.nhn?blogId=skswod95&logNo=221567035277&proxyReferer=https:%2F%2Fwww.google.com%2F

 

ggmap 오류해결 / 구글맵 api획득 [2탄]

멧돼지 기사 크롤링하고 출현위치를 워드클라우드와 ggmap으로 나타내기! / ggmap 오류해결 / 구글맵 api획...

blog.naver.com

내 api 키를 발급 받았다면, register_google(key=" ")이곳에 내 api 키를 등록해주자. 이후에야 ggmap 관련 데이터를 불러올 수 있게 된다. 

 

names <- c("도담삼봉/석문", "구담/옥순봉", "사인암", "하선암", "중선암", "상선암")

addr <- c("충청북도 단양군 매포읍 삼봉로 611-33",
          "충청북도 단양군 단성면 월악로 3827",
          "충청북도 단양군 대강면 사인암2길 42",
          "충청북도 단양군 단성면 선암계곡로 1337",
          "충청북도 단양군 단성면 선암계곡로 868-2",
          "충청북도 단양군 단성면 선암계곡로 790")

그 후에는 이제 우리가 표시하고 싶은 데이터를 넣어주는 것인데, names와 addr로 나누는 이유는 dataframe 형태로 저장할 것이기 때문. 또한 addr을 위도와 경도로 바꿔주는 geocode를 사용하기 위해 따로 주소만 모아서 저장하는 것이기도 하다.(장황하게 이야기 했지만, 보통 같은 데이터를 모아서 한 벡터에 저장하는 게 습관이 되는 것이 가장 좋다고 생각된다. 사용자가 알아보기가 편하기 때문)

 

gc <- geocode(enc2utf8(addr))
is.data.frame(gc)
gc

enc2utf8은 직관적으로 보았을 때, enc에서 utf8로 변환시켜준다는 것을 확인할 수 있다. 정확히 enc가 어떤 형식인지는 모르겠으나 한국어를 utf8포맷으로 바꾸기 위해, enc2utf8 포맷을 사용한다고 한다. geocode가 utf8포맷을 사용하기 때문.

https://statkclee.github.io/spatial/geo-info-lonlat.html

 

공간통계를 위한 데이터 사이언스

 

statkclee.github.io

그 후에 is.data.frame(gc)를 확인해보면 gc가 데이터프레임 형태인 것을 확인 할 수 있다. 또한 gc는 위도 경도로 이루어진 데이터를 포함하는 데이터 프레임이다. 한번 열어보자.

 

 

그 후에는 명소명, 위도, 경도 3가지 값을 합친 데이터 프레임을 만들것이다.

df <- data.frame(name=names, lon=gc$lon, lat=gc$lat)

이전 names를 name이라는 곳에 넣고, gc에서의 lon(경도, longitude) 값은 lon, gc의 lat(위도, latitude) 값을 lat에 넣어주게 된다. $이 연산은 데이터 프레임에서 해당 변수명을 가진 데이터만 뽑아오라는 동작을 의미한다.

 

 

cen <- c((max(df$lon) + min(df$lon))/2,
         (max(df$lat) + min(df$lat))/2)

이제 ggmap을 이용하여 원하는 지도를 그릴 준비가 다 되었다. 지도의 가운데를 어디로 표시할 지에 대한 데이터 cen을 설정한다. 이것은 (최대 경도 + 최소 경도/2 , (최대 위도 + 최소 위도 )/2 라는 것을 알 수 있다.

 

map <- get_googlemap(center=cen, maptype="roadmap", zoom=12, marker=gc)
ggmap(map)

 

 

get_googlemap으로 우리가 그릴 지도 데이터의 정보들을 넣어 놓는데, cen(중심 좌표), maptype(지도모양의 타입), zoom(확대 정도), marker(마크 찍을 정보(geocode))들을 넣어줄 것이다. 그러면 이렇게 그림이 나오게 된다.

 

이 예제로 모든 것을 다 알고, 숙달하기는 어렵다. 다른 예제를 많이 해볼 필요가 있는데, 다음 블로그의 포스팅을 참고하기 바란다. 많은 예제가 있고, 설명도 잘 나와 있으니 예제들을 비교해보면서 해보는 것이 많은 도움이 될 것이라 생각한다.

wrkbr.tistory.com/602

 

최대한 친절하게 쓴 R로 지도에 점 찍고, 선 긋고, 색 칠하기

"낡은 지도로는 새로운 세상을 탐험할 수 없다." - 알베트르 아인슈타인 두말할 것 없이 사회과부도였습니다. 학창시절 해마다 새 교과서를 받으면 제일 먼저 펼쳐보던 책 말입니다. 평범한 지도

wrkbr.tistory.com

 

728x90
반응형
Comments