logo

𝝅번째 알파카의 개발 낙서장

OpenLayers를 여행하는 개발자를 위한 안내서 - 3. 좌표계

프로젝트
⏰ 2022-03-03 16:47:29

D O W N

https://user-images.githubusercontent.com/50317129/156607880-c5abad92-1991-4c01-b85f-7153bf89cb64.png
OpenLayers를 여행하는 개발자를 위한 안내서
이 게시글은 OpenLayers를 여행하는 개발자를 위한 안내서 시리즈의 26개 중 3번 째 게시글입니다.
https://user-images.githubusercontent.com/50317129/260317030-e4b8575b-f09e-47f4-ab70-168a817268c6.png

Table of Contents

https://user-images.githubusercontent.com/50317129/260317030-e4b8575b-f09e-47f4-ab70-168a817268c6.png

다 같은 좌표가 아니야!

1986년, NASA에서 우주왕복선 챌린저호를 발사했으나, 발사한 지 약 73초만에 폭발한 안타까운 사고가 있었다.

원인은 어이없게도 단위 실수. 국제적인 표준은 미터법임에도 불구하고, 미국을 포함한 몇몇 국가는 인치법을 표준으로 사용하고 있었다. 이러한 상황에서 우주선의 설계도 중 미터법으로 표기된 부품 O Ring을 인치법으로 제작했기 때문에 일어난 사고였다.


공간정보 또한 이와 비슷하게 좌표계라는 일종의 단위를 가지고 있다. 통상 공간정보의 좌표라고 하면 대부분 동경 127, 북위 37을 떠올린다.

동경 127, 북위 37은 GPS에서 주로 사용하는 세계측지 중 하나인 WGS-84 좌표계다. 이와 같이 좌표계의 특성에 따라 표현되는 값도 다르며, 이를 구분하기 위해 EPSG:0000과 같이 EPSG 코드로 관리한다.

방금 언급한 WGS-84의 코드는 EPSG:4326이다.

EPSG 코드proj 인자
EPSG:4326+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs

이러한 체계를 좌표계라고 부르며, 공식적으론 프로젝션(Projection)이라 명칭한다. 프로젝션은 EPSG 코드와 proj 인자로 이루어진다.

EPSG 코드는 좌표계의 명칭이며, proj 인자는 좌표계를 표현하는 수식으로 +proj=로 시작한다. 이 proj 인자는 좌표계의 표현 및 좌표계 변환에 사용된다.

SHP의 prj 파일은 이 프로젝션에 대한 정보를 담고 있다.

대부분의 데이터 제공자는 자신이 제공하는 공간정보 데이터에 대한 좌표계를 제공하니, 사용하기전에 이를 반드시 확인해야한다. 간혹 좌표계를 명시하지 않거나, 오기입하는 경우도 있으니 주의.



타원체

좌표는 현재 위치를 특정 값으로 표시하는 것이다. 지구는 구(Sphere) 형태를 띄고 있으므로, 좌표를 정확하게 표시하기 위해선 이 구의 모양을 정의할 필요가 있다.

지구는 구 형태지만, 실제로 엄밀한 구는 아니다. 아, 그렇다고 평평하다는 뜻은 더더욱 아니다.

아름다운 구 형태였다면 좋았겠지만, 아쉽게도 지구의 모양은 문제가 좀 많다. 구라고 부르기 애매한 수준. 혹자는 감자라고도 칭하기도 한다.

어쨌든 완벽한 구 형태가 아니다보니, 좌표를 계산함에 있어서 구(Sphere) 수식을 그대로 적용할 순 없고, 여러 보정이 필요하다.


이런 지구의 현실을 반영하여 지구의 형태를 정의한 것을 타원체라고 한다. 이런 개념이 으레 그렇듯이, 좌표계마다 사용하는 타원체는 제각각이며, 어떤 타원체를 사용하냐에 따라 그 특성이 달라진다.

  • GRS80: 세계 타원체 표준. 국제측지학회, 지구물리학연합에서 채택함
  • WGS84: 미국에서 군사용 GPS를 개발하는 과정에서 사용하기 위해 정의한 타원체.
    • GRS80과 WGS84는 거의 동일하며, 단반경 0.01mm 정도의 매우 근소한 차이를 가진다.
  • BESSEL: 특정 구역을 기준으로 정의한 타원체. 특정 구역까지는 매우 정확하나, 그 만큼 구역에서 멀어질수록 오차가 심해진다. 특정 지역 내에서만 주로 사용할 데이터들에 주로 쓰인다.
    • 대한민국은 일제강점기의 영향으로 이전까진 도쿄를 기준으로 정의된 BESSEL 타원체를 사용했다.

타원체와 관련된 정보를 찾다보면 ITRF-2000이라는 키워드가 보일텐데, ITRF-2000은 하나로 정의된 타원체가 아니라, 세계 공통 타원체를 ITRF-2000이라 부른다. 즉, 현재 기준으로 GRS80과 동일하다.


GPS라는 걸출한 기술이 개발되기 전까지는 각 구역을 중심으로 타원체를 정의하는 BESSEL 타원체를 많이 사용했다. GPS 기술 이전에는 전 세계의 타원체를 정의할 수단이나 기술이 전무했기 때문.

그 중 우리나라는 위에서 언급했다시피, 일제강점기의 영향으로 인해 일본에서 진행한 국토조사 사업을 통해 BESSEL 동경 타원체를 사용하게 됐다.

EPSG:2096(동부), EPSG:2097(중부), EPSG:2096(서부) 등이 이에 해당되며, 오래된 공간 정보 데이터를 찾다 보면 이 좌표계들을 사용하는 걸 볼 수도 있다.

다행히 현재는 국제 표준을 위해 GRS80 타원체를 사용하는 좌표계로 변경했다. 아래 후술할 EPSG:5180(서부), EPSG:5181(중부), EPSG:5183(동부) 등이 이에 해당한다.



투영법

여러분 머릿속에 지도를 떠올려보자. 종이든, 앱이든 상관없다. 생각해보면, 지구는 구지만, 지도는 평면이다. 물론 지구의 형태를 충실히 이행한 지구본이 있지만, 요즘의 지구본은 위치보다는 인테리어의 범주에 들어섰다. 단언컨데 여기서 그 누구도 위치를 찾기 위해 지구본을 들여다보지 않을 것이다.

그말인즉슨, 우리에게 익숙한 지도를 만들기 위해선, 구를 평면화하는 작업이 필요하다. 어렸을 때 수학시간에 전개라는 개념을 배운 적이 있는가? 우유팩을 완전히 펼치는 과정을 생각하면 얼추 비슷하다.

이처럼 좌표계에서 구를 평면화하는 것을 투영법이라 부른다.

  • TM(Transverse Mercator): BESSEL 타원체를 기준으로 투영한 평면좌표계
  • UTM(Universal TM): GRS80(혹은 WGS84) 타원체를 기준으로 투영한 평면좌표계
  • UTM-K: 일반적인 UTM은 적도를 기준으로 하므로, 한국과 약간의 오차가 발생한다. 이를 보정하여 한국에 맞게 정의한 것이 UTM-K다.
    • UTM 투영체는 GRS80 타원체를 기준으로 하는데, UTM-K 중 몇몇 좌표계는 BESSEL 타원체를 사용한다. 자세한 이유는 불명.

좌표계를 보면 중부, 동부 등으로 나눠져있는데, 이는 오차를 최소화하기 위해 기준점을 나눈 것이다.

타원체를 정의하고, 이를 평면화하는 과정에서 발생하는 오차를 최대한 줄이기 위해 투영 기준점을 잡고, 해당 위치를 기준으로 투영하는 것이다. 대한민국은 동부, 중부, 서부, 제주원점이 존재(더 있을 수 있음)하며, 각 구역의 측위기준점을 기준으로 좌표계를 투영한다.

국가급이 아닌 시군구, 지자체 단위에서 제공하는 공간 정보는 각 위치에 가장 최적화된 좌표계를 기준으로 제공한다. 예를들면 제주 관련 데이터는 제주원점, 강원도청에서 제공하는 데이터는 동부원점을 적용한다던가.


자주 사용하는 프로젝션

사실 타원체니, 투영법이니 크게 중요하지 않다. 그냥 본인이 가진 데이터가 어떤 좌표계를 사용하는지만 잘 알면 사용하는 데 아무런 지장이 없다. 타원체, 투영법에 관계없이 모든 좌표계는 EPSG:0000의 형태로 관리되기 때문. 그냥 본인이 원하는 좌표계의 EPSG 코드만 알고 있으면 단순 사용에 아무런 문제가 없다.

각 좌표계는 매칭되는 EPSG 코드와 proj 인자를 가진다. proj 인자는 해당 좌표계를 나타내는 일종의 수식으로, 이 인자를 통해 좌표계의 변환 연산이 가능하다. proj를 이해할 수 있다면, 이 좌표계가 어떤 특성을 가지는지 인자만 보고도 해석할 수 있다.

파라미터내용
proj투영체
a장반경 (타원에서 가장 긴 반지름)
b단반경 (타원에서 가장 짧은 반지름)
lat lon좌표계의 기준 경위도
x y좌표계의 기준 xy
k좌표계 배율
ellps타원체 종류

대략적인 파라미터는 위와 같으며, lat, lon, x, y의 경우 lat_ts, x_0와 같이 뒤에 어떤 인자가 따라오느냐에 따라 의미하는 게 조금씩 달라지기도 한다.

대충 이 정도만 알면 해당 좌표계의 인자가 뭘 의미하는 지 어렴풋이 파악할 수 있으며, 단순 좌표계를 사용하려는 개발자 선에선 이 이상 몰라도 상관없다. 아니, 이 조차 몰라도 사용에 지장은 없다.

모든 좌표계를 숙지하거나, proj 인자를 외울 필요는 더더욱 없다. 단, 주로 사용하는 좌표계 정도는 알고 있으면 데이터 파악을 좀 더 쉽게 할 수 있다.



세계 측지

EPSG 코드proj 인자비고
EPSG:3854+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defsGoogle Maps, VWorld
EPSG:4326+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defsGPS

WGS84 세계 측지인 EPSG:4326을 보자. 장, 단반경이 6378137로 동일한 완벽한 구 형태를 지향하고 있다. GPS 기준 좌표계답게 위경도 및 xy의 보정이 없다. proj=merc은 메르카토르 투영법을 사용했다는 의미다.

여담으로, EPSG:3857은 투영법이 longlat으로 흔히 사용되는 평면 투영체인 TM, UTM과 달라 거리계산이 안 된다.

즉, EPSG:3857로 표현된 두 점 사이의 거리를 계산해도, 이 값이 실제 거리를 나타내지 않는다.



국내 측지

EPSG 코드proj 인자비고
EPSG:5179+proj=tmerc +lat_0=38 +lon_0=127.5 +k=0.9996 +x_0=1000000 +y_0=2000000 +ellps=GRS80 +units=m +no_defsNAVER Map
EPSG:5181+proj=tmerc +lat_0=38 +lon_0=127 +k=1 +x_0=200000 +y_0=500000 +ellps=GRS80 +units=m +no_defsKAKAO Map
EPSG:5186+proj=tmerc +lat_0=38 +lon_0=127 +k=1 +x_0=200000 +y_0=600000 +ellps=GRS80 +units=m +no_defs중부원점

이 밖에도 여러 좌표계가 있으므로, 필요할 때마다 찾아 사용하면 된다.

🔗 EPSG.io에서 다양한 좌표계의 정보를 확인할 수 있으니 참고할 것.



※ 잘못된 정보를 정정해주신 분들에게 감사의 말씀을 드립니다.

🏷️ Related Tag

# GIS

😍 읽어주셔서 감사합니다!
도움이 되셨다면, 💝공감이나 🗨️댓글을 달아주시는 건 어떤가요?
블로그 운영에 큰 힘이 됩니다!
https://blog.itcode.dev/projects/2022/03/04/gis-guide-for-programmer-3