좌표와 배치

건물이 미세하게 틀어지는 원인: 자오선 수차

한 줄 요약

좌표 변환도 정확했고, 지오이드고 보정도 했다. 그런데 건물 끝단이 실제 위치와 수 미터 어긋나 있었다. 원인은 Grid North(도북)와 True North(진북)의 차이였다. 한국 중부 좌표계(EPSG:5186)의 중앙 자오선은 127°E인데, 부산(129°E)에서는 이 차이가 0.5~1도의 회전 오차를 만든다. 수백 미터짜리 건물에서 0.5도는 끝단에서 수 미터의 위치 차이다.

좌표는 맞는데 방향이 틀렸다

coordinate-transform 노드에서 좌표 변환을 완료하고, geoid-correction 노드에서 높이 보정까지 적용했다. 모델의 위치와 높이는 정확했다. 그런데 건물 끝단이 실제 위치와 수 미터 어긋나 있었다.

이걸 발견하기까지 좌표 변환 코드를 세 번 다시 검토했다. 좌표 변환 자체에는 문제가 없었기 때문에 원인 파악이 더 어려웠다.

Grid North ≠ True North

로컬 평면 좌표계(EPSG 5186)는 특정 경도선(중앙 자오선, 127°E)을 기준으로 평면에 투영한 것이다. 이 투영에서 "위쪽"은 Grid North(도북)이다. 중앙 자오선 위에서만 실제 북쪽(True North, 진북)과 일치한다.

중앙 자오선에서 벗어날수록 회전 오차가 발생한다. 이 오차가 자오선 수차(Meridian Convergence, γ)다:

γ = arctan(tan(Δλ) × sin(φ))
Δλ = 해당 지점 경도 - 중앙 자오선 경도 (127°)
φ = 해당 지점 위도

서울(약 127°)은 중앙 자오선과 거의 일치하므로 자오선 수차가 거의 0이다. 부산(약 129°)이나 인천(약 126.5°)에서는 0.5~1도 이상이 된다.

0.5도가 왜 문제인가

1도의 회전 오차는 작아 보인다. 그러나 수백 미터 규모의 구조물에서는 끝단에서 수 미터의 위치 차이로 나타난다. 교량의 경우 양 끝이 도로와 어긋나 보이고, 파이프라인의 경우 연결부가 맞지 않아 보인다.

이 문제가 특히 까다로운 이유는 오차가 미세해서 원인을 특정하기 어렵다는 것이다. 90도 돌아가 있다면 바로 알아차리겠지만, 0.5~1도의 회전은 "뭔가 살짝 이상한데 왜 그런지 모르겠다"는 수준이다.

보정 방법

ENU(East-North-Up) 좌표계에서 ECEF 좌표계로 변환하는 회전 행렬에 자오선 수차를 반영한다. 각 타일의 좌표를 ECEF로 변환할 때 자오선 수차를 함께 반영하여, 모델이 지구본 위에서 정확한 방향으로 배치되도록 한다.

이 보정은 ifc-3dtiles-pipeline 노드의 좌표 정합 단계에서 자동으로 적용되며, model-matrix 노드에서 최종 행렬로 합성된다.

좌표 변환의 세 가지 보정

coordinate-transform 노드의 수평 좌표 변환 위에, 두 가지 추가 보정이 필요하다:

보정방향내용
지오이드고수직(높이)정표고 → 타원체고 (20~30m)
자오선 수차수평(회전)Grid North → True North (0~1°)

두 보정은 독립적이다. 모두 적용해야 모델이 정확한 위치와 방향으로 배치된다.

이 경험에서 추출한 원칙

  1. "미세한 오차"가 가장 찾기 어렵다. 극적인 오류는 바로 추적할 수 있지만, 0.5~1도의 회전 오차는 원인에 도달하기까지 상당한 시간이 걸린다.

  2. 좌표 변환은 "위치 + 높이 + 방향" 세 가지를 모두 다뤄야 완전하다. 수평 좌표를 완벽하게 변환해도, 수직(지오이드고)과 회전(자오선 수차)을 빠뜨리면 모델이 가라앉거나 틀어진다.

좌표 변환을 완료했는데 모델이 "살짝" 틀어져 보인다면, 자오선 수차를 확인하라. 중앙 자오선에서 1도 이상 벗어난 지역이라면 보정이 필요하다.