Dataset을 만드는 과정 중에 지도로 표기할 일이 발생하여 공공데이터 포털에서 다운 받은 엑셀 내에 있는 좌표정보(X), 좌표정보(Y) 값을 구글맵 검색을 위한 좌표값으로 변환시키려 한다.
로컬데이터포탈에서 제공하는 데이터를 활용하려고 하는데, 해당 데이터는 중부원점TM(EPSG:2097)을 활용한다고 안내되어 있다.
안내된 바에 따라 EPSG:2097 데이터를 구글맵에서 활용하기 위해 EPSG4326으로 변환을 하여 사용하려 하였으나 결국 구글맵에 검색하기 위해서는 EPSG:3857로 변경해야 사용할 수 있었다.
즉, EPSG:2097 -> EPSG:3857 -> WSG84(EPSG:4326)으로 변환을 시도하였다.
위의 정보에 따라 변환하였을 때 좌표값이 완전히 다르게 나오기 시작했다.
아래 링크에 있는 정보에 따르면 실제로 변환하기 위해서는 EPSG:2097이 아닌 EPSG:5174를 활용해야하는 것이었다.
즉, EPSG:5174 -> EPSG:3857 -> WSG84(EPSG:4326) 으로 변환을 해야한다.
만약 그렇게 하지 않을 시 좌표값이 비슷하긴 하나 실제 정보와 완전히 다르게 된다.
https://groups.google.com/g/osgeo-kr/c/TY_xUdF0-Hk
번거로울 수는 있으나 2번의 과정을 거치지 않으면 좌표값이 어긋나기 때문에 자동화 과정을 통해 파일을 합쳐서 빌드하길 바람.
import pandas as pd
import numpy as np
import pyproj
df = pd.read_csv("[내가 읽어들일 파일위치]", encoding='utf-8')
df['좌표정보(X)'] = pd.to_numeric(df['좌표정보(X)'], errors="coerce")
df['좌표정보(Y)'] = pd.to_numeric(df['좌표정보(Y)'], errors="coerce")
df.dropna(subset=['좌표정보(X)', '좌표정보(Y)'], inplace=True)
df.index = range(len(df))
def project_array(coord, p1_type, p2_type):
"""
좌표계 변환 함수
- coord: x, y 좌표 정보가 담긴 NumPy Array
- p1_type: 입력 좌표계 정보 ex) epsg:5174
- p2_type: 출력 좌표계 정보 ex) epsg:3857
"""
p1 = pyproj.Proj(init=p1_type)
p2 = pyproj.Proj(init=p2_type)
fx, fy = pyproj.transform(p1, p2, coord[:, 0], coord[:, 1])
return np.dstack([fx, fy])[0]
coord = np.array(df[['좌표정보(X)', '좌표정보(Y)']])
print(coord)
# 컬럼 좌표(X) 또는 좌표(Y) 중의 값이 하나라도 없으면 변환이 안 되는 조건 추가
if len(coord) == 0:
print("No valid coordinates found. Transformation cannot be performed.")
else:
# 좌표계 정보 설정
p1_type = "epsg:5174"
p2_type = "epsg:3857"
# project_array() 함수 실행
result = project_array(coord, p1_type, p2_type)
print(result)
df['경도X'] = result[:, 0]
df['위도Y'] = result[:, 1]
df.tail()
output_file = "[새로운 파일을 생성할 위치]"
df.to_csv(output_file, index=False, encoding='utf-8')
import pandas as pd
import numpy as np
import pyproj
df = pd.read_csv("[읽을 파일 위치]", encoding='utf-8')
df['경도X'] = pd.to_numeric(df['경도X'], errors="coerce")
df['위도Y'] = pd.to_numeric(df['위도Y'], errors="coerce")
df.dropna(subset=['경도X', '위도Y'], inplace=True)
df.index = range(len(df))
def project_array(coord, p1_type, p2_type):
"""
좌표계 변환 함수
- coord: x, y 좌표 정보가 담긴 NumPy Array
- p1_type: 입력 좌표계 정보 ex) epsg:4326
- p2_type: 출력 좌표계 정보 ex) epsg:3857
"""
p1 = pyproj.Proj(init=p1_type)
p2 = pyproj.Proj(init=p2_type)
fx, fy = pyproj.transform(p1, p2, coord[:, 0], coord[:, 1])
return np.dstack([fx, fy])[0]
coord = np.array(df[['경도X', '위도Y']])
print(coord)
# 컬럼 좌표(X) 또는 좌표(Y) 중의 값이 하나라도 없으면 변환이 안 되는 조건 추가
if len(coord) == 0:
print("No valid coordinates found. Transformation cannot be performed.")
else:
# 좌표계 정보 설정
p1_type = "EPSG:3857"
p2_type = "EPSG:4326"
# project_array() 함수 실행
result = project_array(coord, p1_type, p2_type)
print(result)
df['경도'] = result[:, 0]
df['위도'] = result[:, 1]
df.tail()
output_file = "[생성할 파일 위치]"
df.to_csv(output_file, index=False, encoding='utf-8')
이외에도 구글맵이 아닌 다른 맵에서 활용하고 싶다면 해당 EPSG를 찾아서 활용해야할 것 같다.
로컬데이터 포털 : https://www.localdata.go.kr/portal/portalDataGuide.do?menuNo=30002
EPSG 5174: https://groups.google.com/g/osgeo-kr/c/TY_xUdF0-Hk
파이썬 코드 : https://wooiljeong.github.io/python/transform_coord/
각종 맵에 관한 EPSG 정보 : https://bogyum-uncle.tistory.com/175