파이썬으로 지오코딩을 해서 QGIS 에서 시각화 할 일이 많은데 파이썬으로는 안해본것 같다.
그러고 분석 공모전을 가끔 보면 파이썬만 사용해야 하는 경우가 있다. 그래서 정리하는 geopandas 사용방법
정확히는,,
geopandas를 이용해서 csv파일에 존재하는 위경도의 좌표계를 변환하고 geojson 위에(shp데이터 역할) csv로 받은 데이터를 나타내는 방법(위경도 존재해야 함!)
-> csv파일에 위경도가 없을 경우, 카카오 api나 구글 api를 써서 geocoding으로 위경도를 얻어야 한다.
사용 데이터셋
1. 전국 시군구 경계 geojson 파일
https://github.com/vuski/admdongkor
2. 서울시 마포구 (안심이) CCTV 설치 현황
http://data.seoul.go.kr/dataList/OA-20937/S/1/datasetView.do
라이브러리 불러오기
import pandas as pd
import geopandas as gpd
import fiona #공간데이터를 딕셔너리 등 형태로 접근가능
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings(action='ignore') #경고 메시지 무시
# 좌표계 정의/변환용 라이브러리
import pyproj
from fiona.crs import from_epsg
csv파일 불러오기
df_cctv = pd.read_csv('D:/geopandas기초/마포구cctv_안심이.csv',encoding='cp949')
df_cctv.head()
- 열과 행 확인하기
df_cctv.shape #2450 rows, 8 columns
- null 값이 있는지 체크하기
df_cctv.isnull().sum() # null값 체크
# 좌표값 없는 데이터 제거
#df_cctv[['위도','경도']].dropna()
geojson 파일 불러오기
geo = gpd.read_file('D:/geopandas기초/HangJeongDong_ver20220701.geojson')
geo.head()
시군구 코드를 보고 필요한 부분만 뽑아내서 사용하면 된다.
여기서는 마포구 cctv 정보를 알아보고 싶은 거니까 시군구 이름으로 마포구만 뽑아낸다.
mapogu = geo[geo['sggnm']=='마포구']
mapo_geo = mapogu['geometry']
mapo_geo.plot()
- plot 옵션
mapo_geo.plot(color='white', edgecolor='blue', linewidth=5,figsize=(14,18))
plt.show()
# color 배경색
# edgecolor 선 색
# linewidth 선 굵기
# figsize 크기
위경도를 Point 좌표로 변환하기
불러온 csv파일의 위도와 경도를 geopandas에서 시각화 하기 위해서는 point객체 처리를 해주어야 한다.
- points_from_xy() 함수를 사용해서 Point 객체로 변환해준다. 동시에 from_epsg 로 4326 좌표계로 좌표계를 설정해준다.
#속성정보 붙임
gdf_cctv = gpd.GeoDataFrame(df_cctv, geometry=gpd.points_from_xy(df_cctv['경도'],df_cctv['위도']), crs=from_epsg(4326))
gdf_cctv.head()
변환된 것을 확인 가능함!
- crs 확인
gdf_cctv.crs # crs 확인
좌표계를 설정하지 않으면 epsg부분이 뜨지 않는다.
geojson 위에 cctv 객체 그리기
- 지도 위에 표시할 cctv 샘플 데이터 10개 뽑기
plt.rcParams['font.family']='Malgun Gothic' #한글 폰트
ax = mapo_geo.plot(color='white',edgecolor='black',figsize=(7,7)) #지도 불러오기
out.plot(ax = ax,color='red') #점 불러오기
plt.show()
- 마포구 전체 cctv
ax = mapo_geo.plot(color='white',edgecolor='black',figsize=(7,7)) #지도 불러오기
gdf_cctv.plot(ax = ax,color='red') #점 불러오기
plt.show()
ㅊcctv가 주로 마포구의 어느 지역에 몰려있는지 확인이 가능하다.
추가사항
- QGIS에서 시각화하는 것처럼 동마다 라벨을 넣는 법을 찾아봐야겠다.
참고자료
https://thlee33.medium.com/geopandas-%EA%B8%B0%EC%B4%88-fe1feecd2ab4
https://geopandas.org/en/stable/gallery/create_geopandas_from_pandas.html
'Python' 카테고리의 다른 글
공공데이터포털 Open API를 JSON으로 불러오기 (0) | 2022.12.21 |
---|---|
OSMnx 설치하기 (0) | 2022.12.15 |
[Python] tqdm (0) | 2022.11.28 |
[Python] Groupby로 묶은 df 다시 되돌리기 (0) | 2022.11.22 |
Pandas 기초 EDA (0) | 2022.11.14 |