호기심 많은 분석가

[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 에러 만나신 적이 있나요?

    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')

    Geopandas로 호출한 데이터프레임 예시
    대한민국 읍면동별 경계좌표

    • 이 데이터와 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

    folium 라이브러리를 이용해 간단하게 지도 시각화 진행

    • 저는 그중에서도 현존하는 서울특별시의 데이터만 확인하고 싶습니다. 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')

    Pandas를 통해 데이터프레임 전처리


    Error 해결

    • 하지만 이게 무슨 일이죠? 아까와 다른 게 아무것도 없어보이는 데 갑자기 실행이 되지 않습니다!? 조금 더 자세히 파고들어볼까요?

    Error 발생 화면

    ValueError: Cannot render objects with any missing geometries

    • 에러를 확인해보니 folium.GeoJson 파트에서 문제가 발생했네요.
    • 그중에서도json.loads(json.dumps(data.__geo_interface__))가 말썽인 것으로 보입니다.

    Error 발생 부분 상세히 확인

    • 저 부분을 한 번 직접 확인해볼게요! 갑자기 생뚱맞은 Maximum recursion level reached라는 OverflowError가 발생했네요? 재귀 횟수 제한을 늘릴 순 있겠지만 그 방법으로 해결될 것 같진 않습니다. 

    Error 타입 확인 : Maximum recursion level reached

    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이 된 거죠.
     

    Is there a way to fix maximum recursion level in python 3?

    I'm trying to build a state map for data across a decade, with a slider to select the year displayed on the map. The sort of display where a user can pick 2014 and the map will show the data for 20...

    stackoverflow.com

    • 간단하게 merge 방향을 바꿔주는 것만으로 해결했습니다!

    Error 해결 후 folium을 이용한 서울특별시 데이터에 대해 지도 시각화 완성


     굉장히 간단한 문젠데 이걸 몰라서 저는 꽤 오래 고통받았습니다. 제가 저 stackoverflow를 덕분에 해결할 수 있었던 만큼 이 방법이 도움이 되시길 바랍니다 :) 

     여담이지만 구글링 중에 저 에러 표시에 대한 대화를 발견했는데 흥미로워 공유드립니다. ㅎㅎ

     

    folium.features.GeoJson could give a more descriptive error when passing GeoDataFrames with missing geometries · Issue #1037 ·

    I frequently pass GeoDataFrames to folium.features.GeoJson. When GeoDataFrames with missing geometries are passed, it gives ValueError: Unhandled object and then prints the table. It might be bette...

    github.com