본문 바로가기
  • "You can't manage what you can't measure" Peter Drucker
데이터 분석 (with Rstudio)

[Rstudio] 대한민국 지도 그리기 (전국 지도, 지역별 지도)

by Vitaminymc 2024. 4. 18.
반응형

[ 대한민국 지도 : 전국 🌏 ]

[ 대한민국 행정구역(SHP 파일) 다운로드 ]

다운로드 링크 주소 (2023년 7월 업데이트 종료)

지도 작성 수준 (시도, 시군구, 읍면동)에 따라, 해당 SHP 파일을 다운로드 받아서 사용

http://www.gisdeveloper.co.kr/?p=2332

2023년 12월 이후의 최신 행정구역(SHP) 데이터는 지오서비스웹(GEOSERVICE-WEB)의 아카이브를 통해서 다운로드 받을 수 있도록 변경

https://www.geoservice.co.kr/

[ sf 패키지 사용 ]

# 필요한 패키지 로드
library(sf)
library(tidyverse)

# SHP 파일 읽기
map_sf <- st_read('sig.shp')

summary(map_sf)
> summary(map_sf)
    SIG_CD           SIG_ENG_NM         SIG_KOR_NM                geometry  
 Length:250         Length:250         Length:250         MULTIPOLYGON:250  
 Class :character   Class :character   Class :character   epsg:NA     :  0  
 Mode  :character   Mode  :character   Mode  :character     

 

#데이터 확인 (Dataframe으로 변환하여 확인)
map_sf_df <- fortify(map_sf)
map_sf_df |> head (10)
> map_sf_df |> head (10)
Simple feature collection with 10 features and 3 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 950928.8 ymin: 1945376 xmax: 966325.5 ymax: 1966987
CRS:           NA
   SIG_CD    SIG_ENG_NM               SIG_KOR_NM                       geometry
1   11110     Jongno-gu       \xc1\xbe\xb7α\xb8 MULTIPOLYGON (((956615.5 19...
2   11140       Jung-gu                 \xc1߱\xb8 MULTIPOLYGON (((957890.4 19...
3   11170    Yongsan-gu           \xbf\xeb\xbb걸 MULTIPOLYGON (((953115.8 19...
4   11200  Seongdong-gu \xbc\xba\xb5\xbf\xb1\xb8 MULTIPOLYGON (((959681.1 19...
5   11215   Gwangjin-gu \xb1\xa4\xc1\xf8\xb1\xb8 MULTIPOLYGON (((964825.1 19...
6   11230 Dongdaemun-gu   \xb5\xbf\xb4빮\xb1\xb8 MULTIPOLYGON (((962141.9 19...
7   11260   Jungnang-gu        \xc1߶\xfb\xb1\xb8 MULTIPOLYGON (((965698.5 19...
8   11290   Seongbuk-gu        \xbc\xba\xbaϱ\xb8 MULTIPOLYGON (((956787.3 19...
9   11305    Gangbuk-gu        \xb0\xad\xbaϱ\xb8 MULTIPOLYGON (((956316.8 19...
10  11320     Dobong-gu \xb5\xb5\xba\xc0\xb1\xb8 MULTIPOLYGON (((957223.8 19...

 

#KOR_NM 변환
map_sf_df$SIG_KOR_NM <- iconv(map_sf_df$SIG_KOR_NM, from='CP949', to='UTF-8', sub= NA, 
                              mark = TRUE, toRaw = FALSE)

map_sf_df |> head (10)
> map_sf_df |> head (10)
Simple feature collection with 10 features and 3 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 950928.8 ymin: 1945376 xmax: 966325.5 ymax: 1966987
CRS:           NA
   SIG_CD    SIG_ENG_NM SIG_KOR_NM                       geometry
1   11110     Jongno-gu     종로구 MULTIPOLYGON (((956615.5 19...
2   11140       Jung-gu       중구 MULTIPOLYGON (((957890.4 19...
3   11170    Yongsan-gu     용산구 MULTIPOLYGON (((953115.8 19...
4   11200  Seongdong-gu     성동구 MULTIPOLYGON (((959681.1 19...
5   11215   Gwangjin-gu     광진구 MULTIPOLYGON (((964825.1 19...
6   11230 Dongdaemun-gu   동대문구 MULTIPOLYGON (((962141.9 19...
7   11260   Jungnang-gu     중랑구 MULTIPOLYGON (((965698.5 19...
8   11290   Seongbuk-gu     성북구 MULTIPOLYGON (((956787.3 19...
9   11305    Gangbuk-gu     강북구 MULTIPOLYGON (((956316.8 19...
10  11320     Dobong-gu     도봉구 MULTIPOLYGON (((957223.8 19...

 

# 좌표값 확인
coords <- st_coordinates(map_sf)

head(coords)
> head(coords)
            X       Y L1 L2 L3
[1,] 956615.5 1953567  1  1  1
[2,] 956621.6 1953565  1  1  1
[3,] 956626.2 1953564  1  1  1
[4,] 956638.8 1953562  1  1  1
[5,] 956659.1 1953559  1  1  1
[6,] 956661.5 1953558  1  1  1

 

#지도 그리기
map_sf |> 
  ggplot() + geom_sf()

 

 

map_sf |>
  ggplot() +
  geom_sf(aes(fill = SIG_CD), show.legend =FALSE) +
  ggtitle("Seoul Map") +
  theme_void()


[ 대한민국 지도 : 지역별 🌏 ]

[ 지역 (시도, 시군구, 읍면동) 코드 ]

대한민국 행정구역 SHP 파일의 지역 구분 코드

CTPRVN_CD CTP_KOR_NM CTPRVN_CD CTP_KOR_NM CTPRVN_CD CTP_KOR_NM
11 서울특별시 41 경기도 50 제주특별자치도
26 부산광역시 43 충청북도 51 강원특별자치도
27 대구광역시 44 충청남도    
28 인천광역시 45 전라북도    
29 광주광역시 46 전라남도    
30 대전광역시 47 경상북도    
31 울산광역시 48 경상남도    
36 세종특별자치시        
CTPRVN_CD CTP_KOR_NM SIG_CD SIG_KOR_NM EMD_CD EMD_KOR_NM
11 서울특별시 11110 종로구 11110101 청운동
11 서울특별시 11110 종로구 11110102 신교동
11 서울특별시 11110 종로구 11110103 궁정동
11 서울특별시 11110 종로구 11110104 효자동
11 서울특별시 11110 종로구 11110105 창성동
... ... ... ... ... ...

 

상세 코드는 아래 파일 참조

SHP_CD_NM.xlsx
0.17MB

[ 서울 지도 ]

서울 시도코드(CTPRVN_CD) : 11 (종로구 : 11010, 중구 11040, 용산구 11070, ...)

#SHP 파일에서 서울지역만 선택
map_sf_seoul <- map_sf |> 
  filter (str_detect(SIG_CD, "^11"))
  
#서울 지도 그리기
map_sf_seoul |>
  ggplot() +
  geom_sf(aes(fill = SIG_CD), show.legend =FALSE) +
  ggtitle("Seoul Map") +
  theme_void()

 

[ 부산, 울산, 경남 지도 ]

부산 시도코드 : 26 (중구 26110, 서구 26140, ...)

울산 시도코드 : 31 (중구 31110, 남구 31140, ...)

경상남도 시도코드 : 48 (창원시 의창구 48121, 창원시 성산구 48123, ...)

#부산, 울산, 경남 지역 선택
map_sf_puk <- map_sf |> 
  filter (str_detect(SIG_CD, "^26") | str_detect(SIG_CD, "^31") | str_detect(SIG_CD, "^48"))

#시도 코드 확인
unique(map_sf_puk$SIG_CD)

#부산, 울산, 지역 지도 그리기
map_sf_puk |>
  ggplot() +
  geom_sf(aes(fill = SIG_CD), show.legend =FALSE) +
  ggtitle("부산/울산/경남 지도") +
  theme_void()
> unique(map_sf_puk$SIG_CD)
 [1] "26110" "26140" "26170" "26200" "26230" "26260" "26290" "26320" "26350" "26380"
[11] "26410" "26440" "26470" "26500" "26530" "26710" "31110" "31140" "31170" "31200"
[21] "31710" "48121" "48123" "48125" "48127" "48129" "48170" "48220" "48240" "48250"
[31] "48270" "48310" "48330" "48720" "48730" "48740" "48820" "48840" "48850" "48860"
[41] "48870" "48880" "48890"

[ 광주, 전남 지도 ]

광주 시도코드 : 29 (동구 29110, 서구 29140, ...)
전라남도 시도코드 : 46 (목포시 46110, 여수시 46130, ...)

map_sf_kj <- map_sf |> 
  filter (str_detect(SIG_CD, "^29")  | str_detect(SIG_CD, "^46"))

map_sf_kj_df <- fortify(map_sf_kj)

map_sf_kj_df$CTPRVN_CD <- substr(map_sf_kj_df$SIG_CD, 1, 2)

map_sf_kj_df |> head(10)
> map_sf_kj_df |> head(10)
Simple feature collection with 10 features and 4 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 889258.2 ymin: 1556888 xmax: 1037275 ymax: 1696169
CRS:           NA
   SIG_CD   SIG_ENG_NM               SIG_KOR_NM                       geometry CTPRVN_CD
1   29110      Dong-gu         \xb5\xbf\xb1\xb8 MULTIPOLYGON (((948104.5 16...        29
2   29140       Seo-gu         \xbc\xad\xb1\xb8 MULTIPOLYGON (((944073.6 16...        29
3   29155       Nam-gu         \xb3\xb2\xb1\xb8 MULTIPOLYGON (((945448.1 16...        29
4   29170       Buk-gu                \xbaϱ\xb8 MULTIPOLYGON (((946750.1 16...        29
5   29200  Gwangsan-gu           \xb1\xa4\xbb걸 MULTIPOLYGON (((922091.2 16...        29
6   46110     Mokpo-si \xb8\xf1\xc6\xf7\xbd\xc3 MULTIPOLYGON (((896529.2 16...        46
7   46130     Yeosu-si \xbf\xa9\xbc\xf6\xbd\xc3 MULTIPOLYGON (((983188.9 15...        46
8   46150  Suncheon-si        \xbc\xf8õ\xbd\xc3 MULTIPOLYGON (((994368.8 16...        46
9   46170      Naju-si         \xb3\xaa\xc1ֽ\xc3 MULTIPOLYGON (((923188.6 16...        46
10  46230 Gwangyang-si \xb1\xa4\xbe\xe7\xbd\xc3 MULTIPOLYGON (((1008722 165...        46

 

map_sf_kj_df |>
  ggplot() +
  geom_sf(aes(fill = CTPRVN_CD), show.legend =FALSE) +
  scale_fill_manual(values = c("29" = "darkblue", "46" = "skyblue")) +  # 색상 지정
  ggtitle("광주/전남 지도") +
  theme_void()

 

[ 대전, 세종, 충남 지도 ]

대전 시도코드 : 30 (동구 30110, 중구 30140, ...)

세종 시도코드 : 36 

충청남도 시도코드 : 44 (천안시 동남구 44131, 천안시 서북구 44133, ...)

map_sf_dsc <- map_sf |> 
  filter (str_detect(SIG_CD, "^30") | str_detect(SIG_CD, "^36") | str_detect(SIG_CD, "^44"))

map_sf_dsc |>
  ggplot() +
  geom_sf(aes(fill = SIG_KOR_NM)) +
  ggtitle("대전/세종/충남 지도") +
  theme_void()


 

728x90