모빌리티 데이터를 분석하다보니 좌표데이터 계산할 일이 생기고 있다.

위치 데이터는 특정 행정동(Hcode)이나 H3 코드를 기준으로 집계해 볼 수도 있고, 개별 지점의 좌표를 가지고 계산해 볼 수도 있는데, 지점과 지점간 거리를 계산할 경우에는 좌표간 거리를 구하는 것이 필요하다.

좌표데이터는 WGS84 좌표나 WTM 좌표로 기록하고 있는데, 둘간에 상호 전환이 가능하다.

WGS84는 세계 지구 좌표 시스템(World Geodetic System, WGS)으로 1984년에 제정되었다. 지구를 타원체로 가정하고 위치를 특정한다. > 주로 GPS 좌표에서 이용하는 것으로 구글맵에서 사용한다. 타원상의 좌표간 거리를 계산하는 것이라 거리를 잴 때 조금 계산식이 복잡하다. WTM 좌표는 WGS84처럼 타원체를 사용하되, 이를 평면 좌표계로 투영한 좌표이다. 일반적인 종이책 지도처럼 실제 위치를 평면에 투영한 좌표라고 > 보면 된다. 평면으로 투영된 좌표이기 때문에 지점간 거리를 구할 때 단순한 피타고라스 정리(a^2+b^2=c^2)으로 구하면 된다.

좌표간의 거리는 로컬의 파이썬에서도 구현해되지만, 데이터가 많을 경우 로컬 머신으로는 시간이 많이 걸린다. 그럴땐 서버에서 계산하는 것이 빠르므로 SQL로 바로 거리를 계산하는 것이 좋다. SQL에서 이를 구현하면 아래와 같다. 파이썬에서 SQL 코드를 실행하는 것을 가정한다.

변수는 기준점이 x, y, 테이블의 각 지점 좌표가 P_wgs84x, P_wgs84y이다. SQL 코드를 실행시키면, distance라는 칼럼에서 기준점과의 거리를 계산해서 보여준다.

여기서 종종 실수하는 것이, x,y와 위도,경도를 잘못 넣는 것. x는 가로 상의 지점이니 경도(Longitude)를 넣어야 하고, y는 세로 상의 지점이니 위도(Latitude)를 넣어야 한다. 순서가 엇갈려 있어서 휴먼 에러가 발생하기 쉬우니 x,y대신에 위도는 lon, 경도는 lat으로 변수명을 바꾸어 놓는 것이 편할 수 있다.

WGS84 좌표 거리 구하기 코드

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// WGW84 좌표의 거리 구하기

x = 126.964321
y = 37.529523

query="""
SELECT _,
(6371_acos(cos(radians({center_y}))*cos(radians(P_wgs84y))*cos(radians(P_wgs84x)
\-radians({center_x}))+sin(radians({center_y}))*sin(radians(P_wgs84y))))
AS distance
FROM MAB_WGS84

WTM 좌표 거리 구하기 코드

좌표가 WTM일 경우엔, 변수는 기준점이 x, y, 테이블의 각 지점 좌표가 coord_x_wtm, coord_y_wtm이다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// WTM 좌표의 거리 구하기

x = 126.964321
y = 37.529523

query="""
SELECT *,
sqrt(({center_x} - coord_x_wtm) * ({center_x} - coord_x_wtm)
\+ ({center_y} - coord_y_wtm) * ({center_y} - coord_y_wtm))
AS distance
FROM MAP_WTM