Geojson Multipolygon Parsing

Geojson 이란 기존 json 파일의 형식을 따라가지만 feature tag 안에 geometry 라는 인자가 존재한다. 이 geometry 라는 인자 속에 Geojson 에만 존재하는 type, coordinates 라는 서브인자가 있다. Coordinates 는 위도/경도로 지도에 모양을 그리며, Type 은 해당 Coordinate 가 Polygon 인지 Multipolygon 인지 나타낸다.

위 캡쳐는 vuski 님이 정리하신 대한민국 행정동 경계(admdongkor) 의 Geojson 파일이다. 우측의 초록 글씨가 하나의 행정동의 Multipolygon 인데, 이 인자들이 하나의 행정동의 가장자리를 찍은 위도/경도 값들이다.

파이썬의 json 모듈로는 Geojson 을 불러 올 수 없기 때문에, Pandas 의 확장 라이브러리인 Geopandas 를 사용하면 된다.

pip install geopandas
import geopandas as gpd
seoul = gpd.read_file(seoul.geojson)
print(seoul['geometry'])
print(seoul['geometry'][0])
geopandas.geoseries.GeoSeries
<shapely.geometry.multipolygon.MultiPolygon at 0x7fbaa9156650>

확인해보면 칼럼은 GeoSeries 데이터타입이고, 기존 Pandas 처럼 인덱싱도 불가능하다. 그렇기때문에 함수를 통해 연속된 포인트를 갖는 리스트 값으로 변환 후 Pandas 데이터프레임에 저장해주면 된다.

def multipolygon_parser(x):
    lon, lat = x[0].exterior.xy
    return [[x, y] for x, y in zip(lon, lat)]

seoul['coordinates'] = seoul['geometry'].apply(multipolygon_parser)
del seoul['geometry']

보통 이런 GeoJson 을 이용하는 데이터파일들은 대용량이기 때문에 계속 메모리에 띄워놓을 수는 없다. 그렇기 때문에 pd.to_* 로 저장 한 뒤 필요할 때만 불러오도록 설정하고 사용이 끝나면 clear cache 하는것이 좋다.

이때 주의할 점은 .csv 나 .xlsx 같은 확장자는 GUI 프로그램용이기 때문에 datatype 이 망가질 수도 있다. 위 함수로 Multipolygon 을 parsing 한 뒤 새로운 데이터프레임에 저장하면 List type 인데, .csv 나 .xlsx 로 저장한 뒤 다시 pandas 로 불러오면 str 로 읽힌다. 사용 용도에 따라 다르겠지만 대부분의 파이썬 Multipolygon 시각화 툴은 List 를 인자로 받기 때문에 .pkl 로 저장하는 것을 추천한다 (제일 가벼운 확장자이기도 하다).