Summary

  • 공간 데이터를 다루다 보면 가장 흔하게 마주치는 문제가 좌표계(CRS) 불일치이다.
  • Python에서 가장 권장되는 방식인 pyproj 라이브러리의 Transformer 클래스를 활용한다.
  • always_xy=True 옵션으로 입출력 순서를 항상 (경도, 위도)로 고정하는 것을 권장한다.

들어가며

공공데이터에서 제공하는 좌표계는 일반적으로 WGS84(EPSG:4326)이다. 그러나 이를 국내 지도에 알맞게 투영하기 위해서는 국내 대표적인 투영좌표계인 UTM-K(EPSG:5179)로 변환할 필요가 있다.


Transformer 클래스

출발 좌표계(Source)와 도착 좌표계(Target) 사이의 변환 파이프라인을 생성한다.

좌표 변환 객체

Transformer.from_crs(crs_from, crs_to, always_xy)
파라미터설명예시
crs_from변환 전 현재 좌표계"EPSG:4326"
crs_to변환 후 목표 좌표계"EPSG:5179"
always_xy입출력을 항상 (경도, 위도) 순으로 고정True 권장

always_xy=True를 권장하는 이유

좌표계의 공식 정의는 (위도, 경도) 순 (Y, X)이다. 우리에게 익숙한 (경도, 위도) 순 (X, Y)으로 고정시키기 위해 always_xy=True 설정을 권장한다.

from pyproj import Transformer
 
transformer = Transformer.from_crs('EPSG:4326', 'EPSG:5179', always_xy=True)

좌표 변환

NumPy 배열로 입력하자

apply 메서드보다 NumPy 배열로 변환한 후 입력하는 것이 속도 면에서 우월하다.

x_arr = df['x'].to_numpy()
y_arr = df['y'].to_numpy()
 
x_5179, y_5179 = transformer.transform(x_arr, y_arr)

예시

WGS84 좌표계 값인 x, y를 UTM-K 좌표값으로 변환한 값을 새로운 열로 생성

import numpy as np
import pandas as pd
from pyproj import Transformer
 
transformer = Transformer.from_crs('EPSG:4326', 'EPSG:5179', always_xy=True)
 
df['x_5179'], df['y_5179'] = transformer.transform(
    df['x'].to_numpy(),
    df['y'].to_numpy()
)

Reference