티스토리 뷰

데이터 사이언스 스쿨 - 지리 정보 데이터 처리

먼저 위 사이트에서 많은 도움을 받았음을 밝힙니다. 지리 데이터를 처음 접하시는 분은 한 번 정독하시는 걸 추천드립니다. 

목적

아래 테이블과 같이 우편번호 별로 권역코드가 매핑되어 있는 데이터를 지도 위에 표현하고자 합니다. 

지도 위에 표시! 

권역코드 별로 색상을 다르게하여 권역 구분을 한 눈에 알아 볼 수 있는 지도를 만들어 보겠습니다. 

 


목차

  • 1. 한국 기초 구역도 다운로드
  • 2. GeoPandas를 이용한 시각화
  • 3. 한국 기초 구역도에서 서울과 경기도 데이터를 합치기

 

1. 한국 기초 구역도 다운로드

가장 먼저 아래 사이트에서 한국 기초 구역도를 다운 받습니다. 

https://www.juso.go.kr/addrlink/addressBuildDevNew.do?menu=bsin 

저는 2021년 5월 데이터를 받았습니다. "5월"을 누르면 다운 받을 수 있습니다. 

다운 받은 202105기초구역DB_전체분.zip 파일의 압축을 풉니다. 

서울특별시 > 11000 폴더엔 위와 같이 dbf, shp, shx 파일이 있습니다. 

shape file 이란 ?
.shp, .shx, .dbf 3개의 파일을 합쳐서 shape file 이라고 한다. shpae file은 GIS에서 사용하는 벡터 형식의 데이터이다.

- .shp : 점, 다각형 등의 지리정보를 담고 있다. 이 때 지리정보의 타입은 혼용되지 않는다. 점과 다각형이 같은 파일에 저장 될 수 없다는 뜻이다.
- .shx : 지리정보의 인덱스 정보를 담고 있다.
- .dbf : 지리정보의 속성 정보를 담고 있다.
- .shp 파일은 나머지 .dbf, .shx 파일이 없으면 불러올 수 없다. 그리고 “GRS80_UTMK.prj”는 데이터가 사용하는 좌표계 정보가 들어있다. 결과적으로 총 4가지 파일이 모두 한 곳에 있도록 한다.

(더 자세한 정보는 데이터 사이언스 스쿨에서 확인하시면 됩니다.)

 

2. GeoPandas를 이용한 시각화

데이터 준비

colab에서 작업을 하였습니다.

서울특별시 > 11000 폴더에 있던 .dbf, .shp, .shx 파일, 권역코드-우편번호 매핑 정보가 있는 csv 파일을 불러옵니다. 

code-bas_id.csv
0.01MB

 

 

아래와 같이 필요 라이브러리(geopandas, matplotlib, pandas, warnings)를 호출합니다.

import geopandas as gpd
import matplotlib.pyplot as plt
import pandas as pd
import warnings
warnings.filterwarnings('ignore')

geopandas로 지리 데이터를 읽습니다.

seoul_file = "./sample_data/TL_KODIS_BAS.shp"
seoul = gpd.read_file(seoul_file, encoding='euckr')

현재 상태에서 시각화를 하면 아래와 같이 서울 전체의 지도를 그릴 수 있습니다. (출처 - 데이터 사이언스 스쿨)



왼쪽 지도에 비해 오른쪽 지도가 덜 세세한 이유는 아래 코드와 같이 buffer를 추가했기 때문입니다.

seoul.geometry = seoul.buffer(0.001)

 

GeoPandas 와 csv 파일 Merge

하지만 제 목적은 제가 가진 권역 정보를 시각화하는 것이기 때문에 아래 과정을 진행합니다.

권역코드-우편번호 매핑 데이터를 가져옵니다.

code_bas_df = pd.read_csv("./sample_data/code-bas_id.csv")

엑셀로 관리된 우편번호의 경우 '0'으로 시작되면 제일 앞에 '0'이 사라지는 경우가 있습니다.

그래서 .zfill(5)를 이용해 사라진 '0'을 채워주고 자릿수를 맞춥니다. 

code_bas_df['우편번호*'] = code_bas_df['우편번호*'].astype('str').str.zfill(5)

 

GeoPandas로 읽은 지리 데이터와의 merge를 위해

  1. 권역코드-우편번호 매핑 데이터의 컬럼명을 바꾸고('우편번호*'->'BAS_ID')
  2. 지리 데이터(seoul)와 권역코드-우편번호 매핑 데이터 (code_bas_df)를 merge 합니다.
code_bas_df.rename(columns={'우편번호*':'BAS_ID'}, inplace=True)
my_df = pd.merge(seoul, code_bas_df, on='BAS_ID')

GeoPands 시각화

서울 특별시 기초 구역도에 있는 우편번호 중에 권역코드-우편번호 매핑 데이터에도 있는 부분만 시각화를 합니다. 

ax = my_df.plot(figsize=(11, 11), color="w", edgecolor="k")
ax.set_title("서울 특별시 기초구역도")
ax.set_axis_off()
plt.show()

권역코드 별로 색상을 다르게 하여 권역을 구분하였습니다. 

ax = my_df.plot(figsize=(15, 15), column="권역코드*", categorical=True, cmap="tab20b", edgecolor="k", legend=True, legend_kwds={'loc': 3})
ax.set_title("권역코드* 별로 묶은 서울의 기초 구역도")
ax.set_axis_off()
plt.show()

 

 

 

3. 한국 기초 구역도에서 서울과 경기도 데이터를 합치는 법

서울과 경기도 지도를 한 번에 보기 위해 서울(11000)과 경기도(41000)의 데이터를 합쳤습니다.

먼저 파일명이 겹치기 때문에 아래와 같이 경기도 > 41000 에 있는 파일들 뒤에 "2"를 붙입니다. 

이렇게 한 폴더에 올렸습니다. 

seoul 변수에 경기도 데이터를 concat를 합니다. 

# seoul_file = "./sample_data/TL_KODIS_BAS.shp"
# seoul = gpd.read_file(seoul_file, encoding='euckr')

gg_file = "./sample_data/TL_KODIS_BAS2.shp"
gg = gpd.read_file(gg_file, encoding='euckr')
seoul = gpd.GeoDataFrame( pd.concat( [seoul, gg], ignore_index=True) )

합친 상태로 전체 데이터에 대해 시각화를 하면 아래와 같습니다. 서울과 경기도 전체 지도를 한 번에 확인할 수 있습니다. 

 

전체 데이터가 아닌 권역코드-우편번호 매핑 데이터와 merge 한 dataframe으로 시각화하였습니다. 

서울과 경기도 전체 지도 중 권역코드-우편번호 매핑 데이터에도 우편번호가 있는 지역만 남아있는 것을 확인할 수 있습니다.  

 

결과적으로 제가 의도한 바는 맞았지만, 해당 부분의 우편번호를 확인할 수 없어 불편했고 실제 지도를 함께 볼 수 없다는 단점이 있었습니다. 이 문제를 해결하기 위해 Plotly와 folium을 사용하였습니다.

댓글
Total
Today
Yesterday
공지사항
최근에 올라온 글
글 보관함