๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Programming/R

Leaflet์„ ์ด์šฉํ•œ ์ง€๋„ ์‹œ๊ฐํ™”

R์˜ Leaflet์„ ์ด์šฉํ•˜์—ฌ ์ง€๋„๋ฅผ ์‹œ๊ฐํ™” ํ•ด๋ณด์ž.

 

์šฐ๋ฆฌ๋‚˜๋ผ์˜ ํ–‰์ •๊ตฌ์—ญ์„ ์‹œ๊ฐํ™” ํ•  ๊ฒƒ์ด๋‹ค. ์—ฌ๊ธฐ(www.gisdeveloper.co.kr/?p=2332)์—์„œ ์–ป์€ 2020๋…„ 5์›”์˜ ์‹œ๊ตฐ๊ตฌ ํ–‰์ •๊ตฌ์—ญ ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•  ๊ฒƒ์ด๋‹ค.

 

In:

library(leaflet)
library(raster)
library(htmltools)

data_map = shapefile('../input/SIG.shp')

 

โ–ท leaflet์€ ์ง€๋„์˜ ์‹œ๊ฐํ™”๋ฅผ ์œ„ํ•ด, raster์€ ํ™•์žฅ์ž๊ฐ€ shp์ธ ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์œ„ํ•ด, htmltools๋Š” ์‹œ๊ฐํ™”๋œ ์ง€๋„ ์œ„์— ๋‚˜ํƒ€๋‚˜๋Š” ํ…์ŠคํŠธ๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค.

 

In:

head(data_map@data)
head(data_map@plotOrder)
# head(data_map@polygons)

 

Out:

> head(data_map@data)
  SIG_CD    SIG_ENG_NM SIG_KOR_NM
0  11110     Jongno-gu     ์ข…๋กœ๊ตฌ
1  11140       Jung-gu       ์ค‘๊ตฌ
2  11170    Yongsan-gu     ์šฉ์‚ฐ๊ตฌ
3  11200  Seongdong-gu     ์„ฑ๋™๊ตฌ
4  11215   Gwangjin-gu     ๊ด‘์ง„๊ตฌ
5  11230 Dongdaemun-gu   ๋™๋Œ€๋ฌธ๊ตฌ
> head(data_map@plotOrder)
[1] 125 133 207 128 205 211

 

โ–ท ๋ถˆ๋Ÿฌ์˜จ ํŒŒ์ผ์€ S4 ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— @๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•˜์œ„์š”์†Œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

 

โ–ท data์˜ ๊ฐ ํ–‰์€ ๊ฐ ์ง€์—ญ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค. plotOrder์€ ๊ฐ ์ง€์—ญ์— ๋Œ€ํ•œ ๋ฒˆํ˜ธ์ด๋‹ค. polygons๋Š” plotOrder์— ํ•ด๋‹นํ•˜๋Š” ์ง€์—ญ์˜ ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•œ ์ขŒํ‘œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค. ํ•˜๋‚˜์˜ ์ง€์—ญ๋‹น ์•ฝ 1,000๊ฐœ์˜ ์ขŒํ‘œ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ–‰ํ•˜์ง€๋Š” ์•Š์•˜๋‹ค.

 

In:

data_map = spTransform(data_map, CRSobj = CRS('+proj=longlat +datum=WGS84'))

data_map@data$SIG_CD = as.numeric(data_map@data$SIG_CD) 

vec_label = data_map$SIG_KOR_NM

vec_popup = paste0('<b>', '์ด๋ฆ„: ', '</b>', data_map@data$SIG_KOR_NM, '<br>', 
                   '<b>', '์ง€์—ญ๋ฒˆํ˜ธ: ', '</b>', data_map@data$SIG_CD) %>% 
  lapply(HTML)

pal_SIG_CD <- colorNumeric('YlOrRd', domain = data_map@data$SIG_CD)

 

โ–ท ํ–‰์ •๊ตฌ์—ญ ๋ฐ์ดํ„ฐ๋Š” GRS80 ์ขŒํ‘œ๊ณ„๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, leaflet์„ ์ด์šฉํ•œ ์ง€๋„ ์‹œ๊ฐํ™”๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” WGS84 ์ขŒํ‘œ๊ณ„๋กœ ๋ณ€ํ™˜ํ•ด์•ผ์ฃผ์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ spTransform()์„ ์ด์šฉํ•˜์—ฌ ๋ณ€ํ™˜ํ•˜์˜€๋‹ค.

 

โ–ท ์ง€๋„ ์œ„์— ๋‚˜ํƒ€๋‚˜๋Š” ๊ฐ ์ง€์—ญ์˜ ์ƒ‰๊น”์„ ํ•ด๋‹น ์ง€์—ญ์˜ ๋ฒˆํ˜ธ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์ˆซ์ž๋กœ ๋ณ€ํ™˜ํ•˜์˜€๋‹ค.

 

โ–ท vec_label๊ณผ vec_popup์€ ์ง€์—ญ์„ ์„ ํƒํ•  ๋•Œ, ํ•ด๋‹น ์ง€์—ญ์˜ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด ์ฃผ๊ธฐ ์œ„ํ•˜์—ฌ ๋งŒ๋“ค์—ˆ๋‹ค.

 

โ–ท pal_SIG_CD๋Š” ์ง€์—ญ๋ณ„ ์ƒ‰๊น”์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๊ฐ์ฒด์ด๋‹ค.

 

In:

leaflet(data_map) %>% 
  addTiles() %>% 
  addPolygons(color = 'black', 
              weight = 1, 
              stroke = T, 
              fillOpacity = 0.5, 
              label = vec_label, 
              popup = vec_popup,
              fillColor = ~pal_SIG_CD(SIG_CD), 
              highlight = highlightOptions(
                weight = 2.5))

 

Out:

 

โ–ท ํ•ด๋‹น ์ง€์—ญ์— ์œ„์น˜์— ์ปค์„œ๋ฅผ ์˜ฌ๋ฆฌ๋ฉด ์ง€์—ญ์˜ ์ด๋ฆ„์ด ๋œจ๊ณ , ์ง€์—ญ์„ ํด๋ฆญํ•˜๋ฉด ์ด๋ฆ„๊ณผ ์ง€์—ญ๋ฒˆํ˜ธ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋‚˜์˜ค๋„๋ก ์‹œ๊ฐํ™” ํ•˜์˜€๋‹ค.

 

โ–ท ์ง€์—ญ๋ณ„ ์ง€์—ญ๋ฒˆํ˜ธ์— ๋”ฐ๋ผ ์ƒ‰๊น”์ด ๋‹ฌ๋ผ์ง€๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ, ์ง€๋„์˜ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” S4 ๊ฐ์ฒด์˜ data์™€ ๋‹ค๋ฅธ ์ •๋ณด๋ฅผ ํ•ฉ์น˜๋ฉด ์ง€์—ญ๋ฒˆํ˜ธ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ธ๊ตฌ์ˆ˜, ๊ฐ€๊ตฌ์ˆ˜ ๋“ฑ์˜ ๋‹ค์–‘ํ•œ ์‘์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.