티스토리 뷰
먼저 위 사이트에서 많은 도움을 받았음을 밝힙니다. 지리 데이터를 처음 접하시는 분은 한 번 정독하시는 걸 추천드립니다.
목적
아래 테이블과 같이 우편번호 별로 권역코드가 매핑되어 있는 데이터를 지도 위에 표현하고자 합니다.
지도 위에 표시! |
권역코드 별로 색상을 다르게하여 권역 구분을 한 눈에 알아 볼 수 있는 지도를 만들어 보겠습니다.
목차
- 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 파일을 불러옵니다.
아래와 같이 필요 라이브러리(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를 위해
- 권역코드-우편번호 매핑 데이터의 컬럼명을 바꾸고('우편번호*'->'BAS_ID')
- 지리 데이터(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을 사용하였습니다.
'지리데이터시각화(geo)' 카테고리의 다른 글
지리 데이터 시각화 (6) folium을 이용한 경유지&경유 순서 시각화, marker의 icon 안에 숫자 (0) | 2022.03.06 |
---|---|
지리 데이터 시각화(5)- folium의 Choropleth지도 오류 (shape file) (0) | 2022.03.05 |
지리 데이터 시각화(4) - folium으로 명목형 choropleth 지도 그리기, tool tip 사용 (0) | 2022.03.05 |
지리 데이터 시각화(3) - plotly로 choropleth 지도 그리기 (Geo JSON, Geo Data Frame) (0) | 2022.03.05 |
지리 데이터 시각화(2) - 좌표계 변경 (UTM-K -> WGS84), GeoJSON (0) | 2022.03.05 |
- Total
- Today
- Yesterday