호기심 많은 분석가
[GeoPandas, Folium] Cannot render objects with any missing geometries 본문
Coding/시각화
[GeoPandas, Folium] Cannot render objects with any missing geometries
DA Hun 2022. 4. 16. 15:48목차
- GeoJson 사용 중에 ValueError: Cannot render objects with any missing geometries: 0 에러 만나신 적이 있나요?
저는 folium을 이용하여 지도 시각화 중에 저 Error를 만났는데요, 결론적으로는 maximum recursion error 때문입니다.
POLYGON 유형이 있는 Pandas DataFrame 유형에 .to_json() 메소드를 실행하면 maximum recursion error(최대 재귀 오류)가 발생하기 때문입니다.
따라서 DataFrame을 GeoPandas 유형으로 바꾸어주면 에러를 해결할 수 있습니다.
조금 더 에러 상황을 자세히 알아보겠습니다.
데이터 확인
- 대한민국 읍면동별 경계를 지도시각화하기 위해 그 데이터가 담긴 shp 파일을 불러옵니다. 읍면동 코드와 영문명, 국문명, 경계 좌표가 담겨있습니다.
import folium
import geopandas as gpd
import pandas as pd
kor = gpd.read_file('./emd_20220324/emd.shp', encoding='cp949')
- 이 데이터와 folium 라이브러리를 이용해 간단하게 지도 시각화를 진행해줍니다. 아무 문제 없이 정상적으로 실행된 것을 확인할 수 있습니다.
m = folium.Map(location=[37.4782037, 126.9493158], # 기준좌표: 관악구청
zoom_start=10)
# 미니맵 추가하기
minimap = MiniMap()
m.add_child(minimap)
# 맵에 경계 데이터 추가
folium.GeoJson(
kor['geometry'],
name='읍면동'
).add_to(m)
m
- 저는 그중에서도 현존하는 서울특별시의 데이터만 확인하고 싶습니다. join을 통해 잘 실행된 것을 확인할 수 있습니다. :)
df_code = pd.read_csv('./법정동코드 전체자료.txt', sep='\t', encoding='cp949')
df_code = df_code[(df_code['폐지여부']=='존재')&(df_code['법정동명'].map(lambda x: x.split(' ')[0]=='서울특별시'))]
df_code['EMD_CD'] = df_code['법정동코드'].map(lambda x: str(x)[:8])
df = df_code.merge(kor, on='EMD_CD', how='inner')
Error 해결
- 하지만 이게 무슨 일이죠? 아까와 다른 게 아무것도 없어보이는 데 갑자기 실행이 되지 않습니다!? 조금 더 자세히 파고들어볼까요?
ValueError: Cannot render objects with any missing geometries
- 에러를 확인해보니 folium.GeoJson 파트에서 문제가 발생했네요.
- 그중에서도json.loads(json.dumps(data.__geo_interface__))가 말썽인 것으로 보입니다.
- 저 부분을 한 번 직접 확인해볼게요! 갑자기 생뚱맞은 Maximum recursion level reached라는 OverflowError가 발생했네요? 재귀 횟수 제한을 늘릴 순 있겠지만 그 방법으로 해결될 것 같진 않습니다.
Maximum recursion level reached
이 에러는 갑자기 왜 발생했을까요? 최초의 상황과 뭐가 달라 문제가 발생한 걸까요?
데이터를 추가했기 때문에 용량이 커져서 문제였던 걸까, 아니면 merge과정에서 POLYGON이 훼손된 것인가 등의 가설을 세워봤지만 결과는 DataFrame 유형 문제였습니다.
- 역시 구글링! OverflowError는 stackoverflow를 사용해서 해결해야죠😎
- 처음에 말씀드렸던 것처럼 POLYGON 유형이 있는 Pandas DataFrame 유형에 .to_json() 메소드를 실행할 때 Maximum recursion level reached Error가 발생하기 때문입니다. merge를 하는 과정에서 Pandas DataFrame에 GeoPandas DataFrame을 join 하면서 Pandas DataFrame이 된 거죠.
- 간단하게 merge 방향을 바꿔주는 것만으로 해결했습니다!
굉장히 간단한 문젠데 이걸 몰라서 저는 꽤 오래 고통받았습니다. 제가 저 stackoverflow를 덕분에 해결할 수 있었던 만큼 이 방법이 도움이 되시길 바랍니다 :)
여담이지만 구글링 중에 저 에러 표시에 대한 대화를 발견했는데 흥미로워 공유드립니다. ㅎㅎ
'Coding > 시각화' 카테고리의 다른 글
우리나라 행정구역 중 가장 넓은 곳 (0) | 2022.04.21 |
---|---|
전국 행정구역별 지도 시각화 - 법정동코드 체계의 이해 (0) | 2022.04.16 |
[Python] 전국 행정구역별(법정동) 개수와 경계/중심 좌표 데이터 - GeoPandas (0) | 2022.04.14 |
[Python] 전국 행정구역별 지도 시각화 (Folium, 일부-경기도/인천) (0) | 2022.03.30 |
[Data Visualization] 시각화에서 데이터 유실될 때 😱 (0) | 2021.08.21 |