파이썬을 활용한 좌표 변환 - pyproj
들어가며
파이썬의 pyproj는 지리 데이터를 처리하는 데 매우 유용합니다. 이 글에서는 pyproj를 활용하여 좌표를 변환하는 방법을 소개합니다.
예제로 사용할 데이터는 각각의 ID에 대한 좌표에 대한 정보이고, 좌표계는 GRS80입니다. 예제 데이터의 GRS80 좌표를 WGS84 좌표로 변환하겠습니다. 데이터의 구조는 다음과 같습니다.
GRS80: 1980년에 정의된 지구 타원체(ellipsoid)를 기반으로 하는 좌표계로 주로 우리나라의 지리 데이터에서 사용
WGS84: 전세계적으로 가장 널리 사용되는 좌표계로 1984년에 정의된 세계 지구 좌표계
import pandas as pd
df = pd.read_csv('coordinates.csv')
df
1개의 좌표 변환
먼저, 1개의 좌표를 변환하겠습니다. 위에서 설명했듯이 예제 데이터의 GRS80 좌표계를 WGS84로 변환하겠습니다. 변환할 GRS80좌표는 (390524.2901, 296459.9426)입니다. pyporj의 Proj를 활용하여 현재 좌표계와 변환하고자 하는 좌표계를 순서대로 적습니다. 결과는 다음과 같이 WGS84로 변환한 좌표를 출력합니다.
grs80 = pyproj.Proj(init='epsg:5186')
wgs84 = pyproj.Proj(init='epsg:4326')
print('GRS80 -> WGS84: ')
print(pyproj.transform(grs80, wgs84, 390524.2901, 296459.9426))
하지만 주의할 점은, GRS80 좌표계에서는 좌표가 (y, x) 순서로 출력된다는 것입니다. 따라서 일반적으로 사용하는 (x, y) 형식으로 표현하려면, 출력된 결과의 순서를 바꿔야 합니다.
예를 들어, (129.093206769016, 35.24657831101101) 대신 (35.24657831101101, 129.093206769016)으로 표현해야 하며, 이는 구글맵에서 다음과 같이 표시됩니다.
좌표 변환 사용자 정의 함수
변환해야 할 좌표가 여러 개일 경우, 사용자 정의 함수를 활용하는 것이 더 효율적입니다. def를 사용해 좌표를 변환하는 함수를 만들 수 있으며, df에서 좌표를 나타내는 컬럼명(GRS80_X, GRS80_Y)과 변환된 좌표를 저장할 컬럼명(lat_wgs84, lon_wgs84)만 정확히 지정하면, 앞서 설명한 방식과 동일하게 적용할 수 있습니다. 출력 결과는 다음과 같습니다.
grs80 = pyproj.Proj(init='epsg:5186')
wgs84 = pyproj.Proj(init='epsg:4326')
def convert_grs80_to_wgs84(row):
lon_wgs84, lat_wgs84 = pyproj.transform(grs80, wgs84, row['GRS80_X'], row['GRS80_Y'])
return pd.Series([lon_wgs84, lat_wgs84], index=['lat_wgs84', 'lon_wgs84'])
df[['lat_wgs84', 'lon_wgs84']] = df.apply(convert_grs80_to_wgs84, axis=1)
df.head()
전체 코드
import pandas as pd
import pyproj
# 예제 데이터
df = pd.read_csv('coordinates.csv')
# 1개의 좌표 변환
grs80 = pyproj.Proj(init='epsg:5186')
wgs84 = pyproj.Proj(init='epsg:4326')
print('GRS80 -> WGS84: ')
print(pyproj.transform(grs80, wgs84, 390524.2901, 296459.9426))
# 좌표 변환 사용자 정의 함수
grs80 = pyproj.Proj(init='epsg:5186')
wgs84 = pyproj.Proj(init='epsg:4326')
def convert_grs80_to_wgs84(row):
lon_wgs84, lat_wgs84 = pyproj.transform(grs80, wgs84, row['GRS80_X'], row['GRS80_Y'])
return pd.Series([lon_wgs84, lat_wgs84], index=['lat_wgs84', 'lon_wgs84'])
df[['lat_wgs84', 'lon_wgs84']] = df.apply(convert_grs80_to_wgs84, axis=1)
df.head()
'Python' 카테고리의 다른 글
[파이썬] 토이 프로젝트 - 테니스 코트 정보 확인(날씨 예보, 주차 등) (2) | 2025.04.23 |
---|---|
[파이썬] Slack API를 활용한 슬랙 메시지 전송 (0) | 2025.04.22 |
[파이썬] 지진 데이터 지도 시각화 - 히트맵, 클러스터링, folium (6) | 2025.04.17 |
[파이썬] matplotlib을 활용한 지식 그래프 Knowledge Graph 시각화 (4) | 2025.04.15 |
[파이썬] 지도 시각화 - folium, 마커 표시 (2) | 2025.04.14 |