GIS

GeoPandas: pandas.DataFrame을 Shapefile로 저장하기

유병혁 2021. 8. 17. 02:33

안녕하세요? 이번 글은 GeoPandas를 통해 pandas.DataFrame을 Shapefile로 저장하는 방법을 정리해 보겠습니다. GeoPandas 설치방법은 아래 글을 참고하시기 바랍니다.

 

GeoPandas(지오판다스) 설치하기

안녕하세요? 이번 글은 Python으로 지리공간 데이터를 보다 쉽게 다룰 수 있는 오픈소스 프로젝트, 'GeoPandas(지오판다스)' 설치방법을 정리해 보겠습니다. pandas에서 사용하는 데이터 유형(DataFrame)

blog.daum.net

이번 글은 GPX 파일을 pandas.DataFrame으로 변환했던 아래 코드를 약간 변경 실습해 보도록 하겠습니다. 자, 그럼 시작해볼까요?!

 

Python: GPX 파일을 pandas.DataFrame으로 변환하기

안녕하세요? 이번 글은 Python 'gpxpy(GPX file parser)' 라이브러리를 이용하여 GPX 파일을 pandas.DataFrame으로 변환해 보겠습니다. GPX(https://ko.wikipedia.org/wiki/GPX)는 GPS Exchange Format으로 GPS 트..

blog.daum.net

자, 일단 필요한 라이브러리를 호출합니다.

# 라이브러리 호출
import gpxpy
import pandas as pd
import os
from glob import glob
import geopandas
from datetime import datetime

아래와 같이 함수를 하나 정의해 봤습니다. GPX 파일에서 파일 이름과 포인트 경도, 위도, 시간을 DataFrame으로 정의한 후, 시간 값이 최소값을 갖는 행만을 선택해서 반환하는 것입니다. 이렇게 하면 GPX 파일에서 첫번째 좌표가 찍힌 행만 선택해서 작업할 수 있겠습니다. 

def extract_starting_point_from_gpx(gpx_file):
    data = []
    gpx = gpxpy.parse(open(gpx_file, 'r', encoding='utf-8'))
    for track_idx, track in enumerate(gpx.tracks):
        for seg_idx, segment in enumerate(track.segments):
            for point_idx, point in enumerate(segment.points):
                data.append([os.path.basename(gpx_file), # 파일 이름
                             point.longitude, # 포인트 경도
                             point.latitude, # 포인트 위도
                             point.time]) # 포인트 시간
    df = pd.DataFrame(data, columns=['f_Name', 'p_Lon', 'p_Lat', 'p_Time']).fillna(0)
    df_sp = df.loc[df['p_Time'].idxmin()]
    return df_sp

 

GPX 파일에서 시점에 해당하는 행들을 추출해 봅니다. 궁금해서 GPX 파일 1천개를 기준으로 처리시간을 계산했습니다.

gpx_files = glob(os.path.join('D:/GEODATA/', "*.gpx"))
df_sp = pd.DataFrame(columns=['f_Name', 'p_Lon', 'p_Lat', 'p_Time'])
start_time = datetime.now() # 시작시간
# GPX 파일에서 시점 추출
for file_idx, gpx_file in enumerate(gpx_files):
    df_sp = df_sp.append(extract_starting_point_from_gpx(gpx_file))
end_time = datetime.now() # 종료시간
print('처리시간: {}'.format(end_time - start_time)) # 처리시간
df_sp.head()

GPX 파일 1천개의 처리시간과 시점 DataFrame 결과입니다.

DataFrame을 GeoDataFrame으로 변환해볼까요?! 핵심은 geometry 정의에 있습니다.

gdf = geopandas.GeoDataFrame(
    df_sp[['f_Name', 'p_Lon', 'p_Lat']],
    geometry=geopandas.points_from_xy(df_sp.p_Lon, df_sp.p_Lat))
gdf.head()

자, 이제 코드 두 줄이면 GeoDataFrame이 Shapefile로 저장됩니다! 

# GeoDataFrame을 Shapefile로 저장
gdf.crs= "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"
gdf.to_file('D:/GEODATA/df_sp.shp', driver='ESRI Shapefile')

GPX 파일 1천개 용량은 116MB지만, 시점만 추출한 Shapefile 파일의 용량은 161KB에 불과합니다. 이 파일을 QGIS에서 한번 열어볼까요?!

Shapefile을 열어본 결과는 아래와 같습니다.

열 지도로 보니 특정 구간에 시점이 집중되는 것을 확인할 수 있죠?! 이상으로 GeoPandas를 통해 pandas.DataFrame을 Shapefile로 저장하는 방법을 정리해 봤습니다.