본문 바로가기

Previous (20-22)/Development

R Programming - (2) Google Map

이번 글은 R 프로그래밍을 활용하여 구글 맵(Google Map)을 연동한 위치 표시 기능을 소개해 드립니다.


산재해 있는 위치정보 데이터를 바탕으로 구글맵에 표시한다면 가독성이 쉬워지겠죠?


이번에 나타낼 예제로는 서울시 공공 Wi-fi 설치 위치 정보입니다.






일단 데이터를 먼저 받아야겠죠?

서울시 관련 공공데이터는 서울시 데이터센터에서 누구에게나 무료로 제공을 하고 있습니다.



http://data.seoul.go.kr ← 서울시 데이터센터







거기서 원하는 정보를 찾고 Excel로 다운로드받으면 다음과 같은 정보가 친절하게 다 있습니다.

저는 상기 언급했다시피 서울시 공공 Wi-fi 정보를 나타낸다 하였으므로 검색해서 다운로드받았습니다.


localname type company xaxis yaxis provider
강남구 공공기관 (재)서울산업통상진흥원 127.0717546 37.4955815 LGU+
강남구 공공기관 (재)서울산업통상진흥원서울신기술창업센타 127.0380541 37.4976121 LGU+
강남구 공공기관 U강남도시관제센터 127.040992 37.5084025 강남구
강남구 공공기관 강남구의회 127.0642026 37.4939383 강남구
강남구 공공기관 강남구청 127.047502 37.517305 강남구
강남구 공공기관 강남수도사업소 127.0471233 37.4833851 상수도사업본부
강남구 공공기관 강남운전면허시험장(대치) 127.0672394 37.5084197 KT
강남구 공공기관 강남인터넷방송국 127.0384706 37.4909267 강남구

...



※ 주의점: 여기 숫자는 전부다 텍스트형 숫자입니다. 반드시! 숫자유형으로 변환 후 저장해야 합니다.



이제 이 데이터를 가지고 R에서 활용하면 되겠죠?


1
2
3
4
5
6
7
8
9
10
library(RgoogleMaps)
library(readxl)
seoulwifi <- read_excel("~/rdata/seoulwifi.xlsx")
View(seoulwifi)
map.center.loc <- c(37.5639154,127.0094153)
input.zoom <- 11
map_data <- seoulwifi
win.graph()
mymap <- GetMap(center=map.center.loc, zoom=input.zoom, maptype="road", format="roadmap", destfile="mymap.png")
PlotOnStaticMap(mymap,lat=map_data$yaxis,lon=map_data$xaxis, destfile="mymap_point.png",cex=1,pch=10,col="red")
cs


1. RgoogleMaps: 이 부분이 구글맵 사용을 위한 R 패키지입니다.

2~4. 엑셀파일 적용

5. 지도 가운데 위치 잡는 부분입니다.

6. 지도 Zoom을 나타내는 부분입니다.

8. 그래프 표시 창을 띄워주는 화면입니다. (필수는 아님)

9. 사용할 지도의 값을 mymap 변수에 저장하는 부분

10. 사용할 데이터를 mymap 지도 상에서 표시해서 뿌려주는 부분




여기서 몇 가지 사항.


1) 지도 가운데 위치와 Zoom은 어떻게 잡을까요?



웹 상의 구글 맵으로 가신 다음에, 원하는 부분 드래그 & 휠 돌리다보면 위 표시된 부분과 같이 주소가 나옵니다.


주소 상에서 37.5639154,127.0094153,11z  라고 되어있는 부분이 있는데

37.5639154가 y축이고

127.0094153이 x축이고

11이 Zoom 크기입니다.


※ 주의사항: Zoom 크기에 11.5 등의 소수점 안됩니다. 물론 Google Map에선 되지만, R Programming에서는 안됩니다.




2. GetMap() 함수

이 부분이 구글에 뿌려준 지도를 이미지 값으로 저장하는 함수라고 보시면 됩니다.

파라미터는 아래와 같고요. (출처: https://cran.r-project.org/web/packages/RgoogleMaps)



center optional center (lat first,lon second ) 


size desired size of the map tile image. defaults to maximum size returned by the Gogle server, which is 640x640 pixels 

(전 여기서 이거 지정 안했습니다. Default는 위와 같이 640x640)


destfile File to load the map image from or save to, depending on NEWMAP. 


zoom Google maps zoom level.


maptype defines the type of map to construct. There are several possible maptype values, including satellite, terrain, hybrid, and mobile. 


format (optional) defines the format of the resulting image. By default, the Static Maps API creates GIF images. There are several possible formats including GIF, JPEG and PNG types. Which format you use depends on how you intend to present the image. JPEG typically provides greater compression, while GIF and PNG provide greater detail. This version supports only PNG.

(그냥 PNG 쓰시면 됩니다)



위 예제와 같이 destfile 입력하시면 해당 이름으로 이미지가 생성되니, 먼저 미리보기하셔도 됩니다.





3. PlotOnStaticMap() 함수


이 함수가 먼저 지정된 Map Data를 바탕으로 실제 데이터를 화면상에 뿌려주는 부분입니다.

파라미터 설명은 다음과 같습니다. (출처: https://cran.r-project.org/web/packages/RgoogleMaps)



MyMap optional map object 


lat latitude values to be overlaid


lon longitude values to be overlaid 


destfile File to load the map image from or save to, depending on whether MyMap was passed. 


cex 표시될 표식의 크기입니다.


pch 표시될 표식의 모양 번호입니다.


col 색상입니다.





위의 내용을 참고하여 작성하면 다른 응용 데이터도 나타낼 수 있겠죠?





자, 이제 응용을 해봅시다.


1
2
3
4
5
6
7
sktmap <- subset(map_data, provider=="SKT")
ktmap <- subset(map_data, provider=="KT")
lgumap <- subset(map_data, provider=="LGU+")
win.graph()
PlotOnStaticMap(mymap,lat=sktmap$yaxis,lon=sktmap$xaxis, destfile="skt_point.png",cex=1,pch=20,col="red")
PlotOnStaticMap(mymap,lat=ktmap$yaxis,lon=ktmap$xaxis, destfile="kt_point.png",cex=1,pch=20,col="black")
PlotOnStaticMap(mymap,lat=lgumap$yaxis,lon=lgumap$xaxis, destfile="lgu_point.png",cex=1,pch=20,col="purple")
cs


위 데이터를 바탕으로, 특정 통신사업자의 값만 추려서 뽑을 수도 있겠죠?


subset() 함수를 사용해서 필터링된 데이터셋을 따로 만들고,

따로 만든 데이터를 각각의 지도 위치로 표시를 하면 됩니다.



SKT



KT


LGU+




통계 데이터를 지도와 연동해서 가독성이 좋은 이미지로 표시한다는 것이 역시 매력적이겠죠?

이번 글은 여기서 마치겠습니다.





11/18 추가 내용


사실 이 Google Map 부분은 이미지파일을 Google 지도로부터 생성하고, 이미지 위에 Point를 얹어놓는 수준이군요.

그리 크게 대단한 기술은 아닙니다만, 편리하게 이용할 수는 있을 것입니다.


ggplot2 를 사용해서 뿌려줬을 때의 결과는 아래와 같습니다. 이 부분은 덤으로 색깔도 같이 넣어봤습니다.