• ▣ Map in r
    • Packages
    • Functions
    • 지도 표시

▣ Map in r

  • ggmap
  • OpenStreetMap

Packages

### Packages
library(dplyr)
library(ggmap)
library(OpenStreetMap)

Functions

### Get a map based on lat long coordinates
fn_get_map_osm <- function(lon, lat, dist = 1, ...){
  h <- 0.0035 * dist * 3.5
  w <- 0.0035 * dist * 4.0
  print(c(lat-h, lon-w, lat+h, lon+w))
  map_osm <- openmap(c(lat-h, lon-w), c(lat+h, lon+w), ...) %>% openproj()
  map_osm
}

### 위도(latitude)와 경도(longitude) 상자 좌표 계산 함수
fn_lat_lon_box <- function(lon, lat, dist = 1){
  h <- 0.0035 * dist * 3.5
  w <- 0.0035 * dist * 4.0
  #c(lat-h, lon-w, lat+h, lon+w)
  list(upperLeft = c(lat-h, lon-w),
       lowerRight = c(lat+h, lon+w))
}

지도 표시

#### (1)
lat1 <- 36.277; lat2 <- 36.473; lon1 <- 127.273; lon2 <- 127.497
krMap <- openmap(c(lat2, lon1), c(lat1, lon2), 
                 zoom = 12, type = "osm", 
                 mergeTiles = T) %>% openproj()
autoplot(krMap)


#### (2)
boxLocation <- fn_lat_lon_box(127.385, 36.375, 8)
krMap <- openmap(boxLocation$upperLeft, boxLocation$lowerRight, 
                 zoom = 11, type = "osm-public-transport", 
                 mergeTiles = T) %>% openproj()
autoplot(krMap)


#### (3)
krMap <- fn_get_map_osm(lon = 127.385, lat = 36.375, dist = 8, 
                        zoom = 11, type = "esri-topo", 
                        mergeTiles = T)
[1]  36.277 127.273  36.473 127.497
autoplot(krMap)

### Data
store.file <- "./data/소상공인시장진흥공단_상가(상권)정보_대전_202403.csv"
data.store <- read.csv(store.file, header=T, fileEncoding = "UTF-8")
data.store %>% head()
ABCDEFGHIJ0123456789
 
 
상가업소번호
<chr>
상호명
<chr>
지점명
<chr>
상권업종대분류코드
<chr>
상권업종대분류명
<chr>
상권업종중분류코드
<chr>
상권업종중분류명
<chr>
1MA0101202210A0009580백파식당I2음식I201한식
2MA0101202210A0068117줄또웰빙G2소매G205식료품 소매
3MA010120220805431091정성약국G2소매G215의약·화장품 소매
4MA010120220805431125다비치안경원G2소매G216안경·정밀기기 소매
5MA010120220805431202베리도넛I2음식I210기타 간이
6MA010120220805431256씨유G2소매G204종합 소매
### 자료 추출 - 커피전문점
data.cafe <- data.store %>% subset(상권업종소분류명=="카페")

### 산점도 – ggplot()
ggplot() + geom_point(data=data.cafe, aes(x=경도, y=위도, colour=시군구명))

### 지도 표시
autoplot(krMap) + 
  geom_point(data=data.cafe, aes(x=경도, y=위도, colour=시군구명)) + 
  lims(x=c(127.273,127.497), y=c(36.277, 36.473)) +
  theme_minimal()
Scale for x is already present.
Adding another scale for x, which will replace the existing scale.
Scale for y is already present.
Adding another scale for y, which will replace the existing scale.
경고: Removed 38 rows containing missing values or values outside the scale range (`geom_point()`).

### 등고선
autoplot(krMap) + 
  stat_density2d(data=data.cafe, aes(x=경도, y=위도)) + 
  lims(x=c(127.273,127.497), y=c(36.277, 36.473)) +
  theme_minimal()
Scale for x is already present.
Adding another scale for x, which will replace the existing scale.
Scale for y is already present.
Adding another scale for y, which will replace the existing scale.
경고: Removed 38 rows containing non-finite outside the scale range (`stat_density2d()`).

### 밀도
autoplot(krMap) + 
  stat_density2d(data=data.cafe, aes(x=경도, y=위도), geom="polygon", alpha=0.2) + 
  lims(x=c(127.273,127.497), y=c(36.277, 36.473)) +
  theme_minimal()
Scale for x is already present.
Adding another scale for x, which will replace the existing scale.
Scale for y is already present.
Adding another scale for y, which will replace the existing scale.
경고: Removed 38 rows containing non-finite outside the scale range (`stat_density2d()`).

### 밀도 + 색상
autoplot(krMap) + 
  stat_density2d(data=data.cafe, 
                 aes(x=경도, y=위도, fill=after_stat(level)), 
                 geom="polygon", alpha=0.2) + 
  scale_fill_gradient(low="yellow", high="red") + 
  lims(x=c(127.273,127.497), y=c(36.277, 36.473)) +
  theme_minimal()
Scale for x is already present.
Adding another scale for x, which will replace the existing scale.
Scale for y is already present.
Adding another scale for y, which will replace the existing scale.
경고: Removed 38 rows containing non-finite outside the scale range (`stat_density2d()`).

LS0tDQp0aXRsZTogIk1hcCBpbiByIC0gT3BlblN0cmVldE1hcCINCnN1YnRpdGxlOiAi642w7J207YSw7Iuc6rCB7ZmUIg0KYXV0aG9yOiAi67CV7JiB7Zi4KHlocGFya0BobnUua3IpIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIHRvYzogdHJ1ZSAgICAgICAgICAgICAgICAgIyMg66qp7LCoIO2RnOyLnA0KICAgIHRvY19mbG9hdDogICAgICAgICAgICAgICAgIyMg66qp7J6QIOqzoOyglQ0KICAgICAgY29sbGFwc2VkOiBmYWxzZSAgICAgICAgIyMg7J6Q64+ZIOygkeq4sA0KLS0tDQoNCiMjIOKWoyBNYXAgaW4gcg0KLSBnZ21hcA0KLSBPcGVuU3RyZWV0TWFwDQoNCiMjIyBQYWNrYWdlcw0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMjIyBQYWNrYWdlcw0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZ2dtYXApDQpsaWJyYXJ5KE9wZW5TdHJlZXRNYXApDQpgYGANCg0KIyMjIEZ1bmN0aW9ucw0KYGBge3J9DQojIyMgR2V0IGEgbWFwIGJhc2VkIG9uIGxhdCBsb25nIGNvb3JkaW5hdGVzDQpmbl9nZXRfbWFwX29zbSA8LSBmdW5jdGlvbihsb24sIGxhdCwgZGlzdCA9IDEsIC4uLil7DQogIGggPC0gMC4wMDM1ICogZGlzdCAqIDMuNQ0KICB3IDwtIDAuMDAzNSAqIGRpc3QgKiA0LjANCiAgcHJpbnQoYyhsYXQtaCwgbG9uLXcsIGxhdCtoLCBsb24rdykpDQogIG1hcF9vc20gPC0gb3Blbm1hcChjKGxhdC1oLCBsb24tdyksIGMobGF0K2gsIGxvbit3KSwgLi4uKSAlPiUgb3BlbnByb2ooKQ0KICBtYXBfb3NtDQp9DQoNCiMjIyDsnITrj4QobGF0aXR1ZGUp7JmAIOqyveuPhChsb25naXR1ZGUpIOyDgeyekCDsooztkZwg6rOE7IKwIO2VqOyImA0KZm5fbGF0X2xvbl9ib3ggPC0gZnVuY3Rpb24obG9uLCBsYXQsIGRpc3QgPSAxKXsNCiAgaCA8LSAwLjAwMzUgKiBkaXN0ICogMy41DQogIHcgPC0gMC4wMDM1ICogZGlzdCAqIDQuMA0KICAjYyhsYXQtaCwgbG9uLXcsIGxhdCtoLCBsb24rdykNCiAgbGlzdCh1cHBlckxlZnQgPSBjKGxhdC1oLCBsb24tdyksDQogICAgICAgbG93ZXJSaWdodCA9IGMobGF0K2gsIGxvbit3KSkNCn0NCmBgYA0KDQojIyMg7KeA64+EIO2RnOyLnA0KDQpgYGB7cn0NCiMjIyMgKDEpDQpsYXQxIDwtIDM2LjI3NzsgbGF0MiA8LSAzNi40NzM7IGxvbjEgPC0gMTI3LjI3MzsgbG9uMiA8LSAxMjcuNDk3DQprck1hcCA8LSBvcGVubWFwKGMobGF0MiwgbG9uMSksIGMobGF0MSwgbG9uMiksIA0KICAgICAgICAgICAgICAgICB6b29tID0gMTIsIHR5cGUgPSAib3NtIiwgDQogICAgICAgICAgICAgICAgIG1lcmdlVGlsZXMgPSBUKSAlPiUgb3BlbnByb2ooKQ0KYXV0b3Bsb3Qoa3JNYXApDQoNCiMjIyMgKDIpDQpib3hMb2NhdGlvbiA8LSBmbl9sYXRfbG9uX2JveCgxMjcuMzg1LCAzNi4zNzUsIDgpDQprck1hcCA8LSBvcGVubWFwKGJveExvY2F0aW9uJHVwcGVyTGVmdCwgYm94TG9jYXRpb24kbG93ZXJSaWdodCwgDQogICAgICAgICAgICAgICAgIHpvb20gPSAxMSwgdHlwZSA9ICJvc20tcHVibGljLXRyYW5zcG9ydCIsIA0KICAgICAgICAgICAgICAgICBtZXJnZVRpbGVzID0gVCkgJT4lIG9wZW5wcm9qKCkNCmF1dG9wbG90KGtyTWFwKQ0KDQojIyMjICgzKQ0Ka3JNYXAgPC0gZm5fZ2V0X21hcF9vc20obG9uID0gMTI3LjM4NSwgbGF0ID0gMzYuMzc1LCBkaXN0ID0gOCwgDQogICAgICAgICAgICAgICAgICAgICAgICB6b29tID0gMTEsIHR5cGUgPSAiZXNyaS10b3BvIiwgDQogICAgICAgICAgICAgICAgICAgICAgICBtZXJnZVRpbGVzID0gVCkNCmF1dG9wbG90KGtyTWFwKQ0KYGBgDQoNCg0KDQpgYGB7cn0NCiMjIyBEYXRhDQpzdG9yZS5maWxlIDwtICIuL2RhdGEv7IaM7IOB6rO17J247Iuc7J6l7KeE7Z2l6rO164uoX+yDgeqwgCjsg4Hqtowp7KCV67O0X+uMgOyghF8yMDI0MDMuY3N2Ig0KZGF0YS5zdG9yZSA8LSByZWFkLmNzdihzdG9yZS5maWxlLCBoZWFkZXI9VCwgZmlsZUVuY29kaW5nID0gIlVURi04IikNCmRhdGEuc3RvcmUgJT4lIGhlYWQoKQ0KYGBgDQoNCmBgYHtyfQ0KIyMjIOyekOujjCDstpTstpwgLSDsu6TtlLzsoITrrLjsoJANCmRhdGEuY2FmZSA8LSBkYXRhLnN0b3JlICU+JSBzdWJzZXQo7IOB6raM7JeF7KKF7IaM67aE66WY66qFPT0i7Lm07Y6YIikNCg0KIyMjIOyCsOygkOuPhCDigJMgZ2dwbG90KCkNCmdncGxvdCgpICsgZ2VvbV9wb2ludChkYXRhPWRhdGEuY2FmZSwgYWVzKHg96rK964+ELCB5PeychOuPhCwgY29sb3VyPeyLnOq1sOq1rOuqhSkpDQpgYGANCg0KYGBge3J9DQojIyMg7KeA64+EIO2RnOyLnA0KYXV0b3Bsb3Qoa3JNYXApICsgDQogIGdlb21fcG9pbnQoZGF0YT1kYXRhLmNhZmUsIGFlcyh4PeqyveuPhCwgeT3snITrj4QsIGNvbG91cj3si5zqtbDqtazrqoUpKSArIA0KICBsaW1zKHg9YygxMjcuMjczLDEyNy40OTcpLCB5PWMoMzYuMjc3LCAzNi40NzMpKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCmBgYHtyfQ0KIyMjIOuTseqzoOyEoA0KYXV0b3Bsb3Qoa3JNYXApICsgDQogIHN0YXRfZGVuc2l0eTJkKGRhdGE9ZGF0YS5jYWZlLCBhZXMoeD3qsr3rj4QsIHk97JyE64+EKSkgKyANCiAgbGltcyh4PWMoMTI3LjI3MywxMjcuNDk3KSwgeT1jKDM2LjI3NywgMzYuNDczKSkgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQpgYGB7cn0NCiMjIyDrsIDrj4QNCmF1dG9wbG90KGtyTWFwKSArIA0KICBzdGF0X2RlbnNpdHkyZChkYXRhPWRhdGEuY2FmZSwgYWVzKHg96rK964+ELCB5PeychOuPhCksIGdlb209InBvbHlnb24iLCBhbHBoYT0wLjIpICsgDQogIGxpbXMoeD1jKDEyNy4yNzMsMTI3LjQ5NyksIHk9YygzNi4yNzcsIDM2LjQ3MykpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KYGBge3J9DQojIyMg67CA64+EICsg7IOJ7IOBDQphdXRvcGxvdChrck1hcCkgKyANCiAgc3RhdF9kZW5zaXR5MmQoZGF0YT1kYXRhLmNhZmUsIA0KICAgICAgICAgICAgICAgICBhZXMoeD3qsr3rj4QsIHk97JyE64+ELCBmaWxsPWFmdGVyX3N0YXQobGV2ZWwpKSwgDQogICAgICAgICAgICAgICAgIGdlb209InBvbHlnb24iLCBhbHBoYT0wLjIpICsgDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93PSJ5ZWxsb3ciLCBoaWdoPSJyZWQiKSArIA0KICBsaW1zKHg9YygxMjcuMjczLDEyNy40OTcpLCB5PWMoMzYuMjc3LCAzNi40NzMpKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCg==