-
R과 Google MapR 이모저모 2020. 6. 13. 16:53
이번에 다뤄볼 주제는 작년부터 일하면서 주로 쓰게 된 R의 구글맵 api인 ggmap 패키지입니다. 근 4개월만에 글을 쓰게 되서 좀 더 색다른 것으로 찾아오고 싶었으나, 그간 공부를 게을리해서 그런지 재미있는게 보이질 않네요...
ggmap은 위경도 좌표를 가지고 구글 지도를 직접 사진으로 다운받아 불러오는 형식으로 이뤄져있으며, ggplot과 연동하기도 편하고 지도의 퀄리티 또한 상세하여 분석한 내용을 지도 위에 얹어서 간단히 표현하고자 할 때 매우 유용한 패키지입니다. 이번 글을 이용해서 일하는 중 지도를 그릴때 활용하시면 좋을 것 같네요.
1. 지도 다운로드 받기
ggmap은 작년에 구글 맵 api 키가 없으면 작동하지 않는 식으로 바뀌어서 먼저 프로젝트를 만들고 해야하는 등 불편해졌으나, 이번에 사용해보니 점 형식이 아닌 bbox(bounding box, {x최소, y최소, x최대, y최대})로 부를 경우 별도의 키를 요구하지 않는 것으로 확인되었습니다. 만약 더 많은 geocoding 기능을 동시에 활용하고 싶다면, register_google함수에 본인의 구글지도 api key를 넣어 사용하시면 됩니다. 이번 글의 경우 단순 지도 활용이 목적이기 때문에 bounding box를 통한 활용에만 집중하겠습니다.
먼저 지도를 받기 위해서는 get_map이라는 함수를 활용할겁니다. 여기에 입력값으로는 앞서 설명한 bounding box를 넣을것이며, x는 위도, y는 경도로 넣을것입니다. 예를 들어 서울 강남인근의 좌표를 잡아보기 위해 127, 37.4, 127.2, 37.52라는 좌표를 넣으면 아래와 같이 해당 지역 지도를 다운로드를 받기 시작합니다. 단, 너무 작은 범위를 요청할 경우 해당 지역을 표현하지 못해서 다운로드가 되지 않을 수도 있습니다.
2. 지도 표현과 ggplot
이제 지도를 받았으면 표현하면 됩니다. ggmap은 ggmap이라는 함수에 아까 다운받은 지도 객체를 넣으면 나오게 되며, ggplot과 동일한 유형으로 나오게 됩니다.
반대로, 다운로드에 실패한 지역은 빈 값으로 나오게 되며, 이는 두번째 객체를 넣어봄으로 확인할 수 있습니다
지도 위에 데이터를 추가하려면, ggplot에서 사용하듯 +를 활용해서 추가해주시면 됩니다. 단, 뒤에 sf객체를 활용해서 geom_sf를 쓰려한다면 inherit.aes = F를 꼭 해주셔야 합니다. 이유는 ggmap의 aesthetic이 lon/lat 체제를 강요하기 때문에 sf객체의 geometry 부분이 인식되지 않기 때문입니다.
3. 실무 활용을 위해 함수 정의 후 sourcing
이런 지도 만들기는 편리하지만, 아무래도 매번 bounding box를 계산하는 일은 귀찮을 수 밖에 없습니다. 물론 저번 sf패키지 관련 포스팅에서 나오듯 st_bbox를 통해서 간단히 계산하는 방법이 있으나, 이 또한 sf 객체가 아니면 활용하기 어려울 뿐 더러 get_map이 받는 bbox 벡터 네이밍이 다르기 때문에 unname(named 벡터의 이름을 지우기)시켜줘야 한다는 것이 번거롭습니다. 따라서 전 미리 몇가지 세팅을 해놓고 쓰고 있으며, 이는 제 git repository에 ggmap_rsc.R 이라는 이름으로 올라가있습니다.(gist에도 있습니다.)
devtools 패키지의 source_gist를 활용하여 해당 스크립트를 불러주시면 아래와 같이 출력이 되며 create_gmap, tr_to_4326, .katec, .fixed_theme라는 객체가 생기게 됩니다. 이는 각각 ggmap 생성, 다른 좌표계로 된 데이터프레임을 4326(위경도) 좌표계로 변환하여 데이터프레임 반환, 카텍 좌표계 crs, ggplot2 테마(legend등 삭제하고 그림만 남기기)를 나타냅니다.
3.1 create_gmap
create_gmap함수는 x,y, google_map_color, google_map_color를 받습니다. x와 y에 좌표 벡터를 넣어서 지도를 만들 수 있으며, x에 데이터프레임/매트릭스를 넣으면 첫번째와 두번째 칼럼을 이용해 지도를 가져옵니다. google_map_color는 기본이 'bw'로 되어있으며, color로 넣으면 컬러 지도, bw는 흑백지도를 로딩합니다.(color의 경우 잘 작동하는 경우가 있고 아닌 경우가 있는데 이 부분은 왜 그런지 확인하지 못했습니다)
3.2 tr_to_4326
tr_to_4326은 좌표를 변환하는 함수로, df, x_name,y_name, drop_cols를 받으며 x_name이 x좌표명, y_name이 y좌표명이며 만약 제공이 안된다면 첫번째와 두번째를 쓰게됩니다. drop_cols의 경우 False면 변환된 좌표값만 반환하며, True면 변환된 좌표값을 칼럼으로 붙여서 반환합니다.
4. 마치며
이번 글은 비교적 쉬운 글이자 일하면서 쓰던 간단한 팁으로 써봤습니다. 다음 글은 다시 공부하면서 좀 더 재밌고 흥미로운 주제로 써볼수 있도록 해봐야겠네요
예제 코드 : https://github.com/JunmoNam/applebox_blog/blob/master/R/19)%20ggmap.R
'R 이모저모' 카테고리의 다른 글
R과 Leaflet (1) (1) 2020.11.14 R과 Few shot learning : 샴 네트워크 (0) 2020.02.15 sf : R과 지도(2) (0) 2020.01.03 sf : R과 지도 (1) (0) 2019.12.06 R과 Data Wrangling (0) 2019.08.19