위도와 경도, 그리고 도분초 — 숫자 두 개로 지구의 한 점을 찍기까지

숫자 두 개면 지구의 어디든 찍는다
내가 지금 서 있는 이 자리도, 지구 반대편 누군가가 선 자리도, 숫자 딱 두 개면 콕 집어낼 수 있습니다. 위도와 경도. 그런데 이 두 숫자, 순서만 바꿔도 서울이 바다 한가운데로 사라집니다. 가장 기본인데 가장 많이 틀리는 이야기를 시작합니다.
37.5, 127. 이게 서울입니다. 그런데 어떤 개발자가 이걸 127, 37.5로 적는 순간, 지도 위의 핀은 서울이 아니라 지구 어디에도 없는 곳으로 날아갑니다. 위도 127도라는 건 존재하지 않으니까요.
황당하게 들리지만, 이건 GIS를 다루는 사람이라면 거의 누구나 한 번쯤 밟는 지뢰입니다. 그 지뢰의 정체를 이해하려면, 먼저 이 두 숫자가 정확히 무엇인지부터 봐야 합니다.
지구를 격자로 — 위도와 경도
둥근 지구 위에서 "여기"를 말하려면 기준선이 필요합니다. 그래서 우리는 지구에 눈금을 그었습니다.
- 위도(latitude) — 적도와 나란한 가로줄입니다. 적도가 0°, 북극이 +90°, 남극이 −90°. "내가 적도에서 얼마나 북쪽/남쪽이냐"를 말합니다.
- 경도(longitude) — 북극과 남극을 잇는 세로줄입니다. 영국 그리니치가 0°, 거기서 동쪽으로 +180°, 서쪽으로 −180°. "내가 그리니치에서 얼마나 동쪽/서쪽이냐"를 말합니다.
헷갈릴 땐 이렇게 외우면 됩니다. 위도는 가로, 경도는 세로. 위도(緯度)의 '위(緯)'가 베틀의 가로실(씨실)이고, 경도(經度)의 '경(經)'이 세로실(날실)입니다. 한자가 이미 답을 알려주고 있죠.
이 격자 위에서 서울은 대략 북위 37.5665°, 동경 126.9780° 에 있습니다. 부호로 쓰면 북(N)·동(E)은 +, 남(S)·서(W)는 −입니다.
🔗 GIS란 무엇인가 편에서 강남역 스타벅스를
POINT(127.027 37.498)로 적었던 것, 기억하나요? 그 숫자 쌍이 바로 경도·위도였습니다. 이번 글은 그 두 숫자를 현미경으로 들여다보는 이야기입니다.
위도는 쉬웠지만, 경도는 사람을 죽였다
위도와 경도는 짝처럼 보이지만, 인류에게 둘의 난이도는 하늘과 땅 차이였습니다.
위도는 쉬웠습니다. 한낮에 태양이 얼마나 높이 떴는지, 혹은 밤에 북극성이 수평선에서 몇 도 위에 있는지만 재면 됐거든요. 각도기 하나로 "내가 적도에서 얼마나 떨어졌나"를 알 수 있었습니다. 고대 뱃사람도 했던 일입니다.
경도는 악몽이었습니다. 동서 위치를 알려면 시간을 알아야 했습니다. 지구는 24시간에 360° 도니까, 출발항의 시각과 현재 위치의 정오(태양이 가장 높은 순간) 사이의 시간차가 곧 경도차입니다. 문제는, 흔들리는 배 위에서 몇 달 동안 정확한 시간을 유지하는 시계가 그 시절엔 없었다는 것이죠.
이 무지는 사람을 죽였습니다. 1707년, 영국 함대가 자기 위치를 잘못 계산해 실리 제도의 암초에 그대로 들이박았습니다. 군함 4척이 침몰하고 최대 2,000명의 수병이 목숨을 잃었습니다. 영국 해군 역사상 최악의 참사 중 하나였죠.
충격을 받은 영국 의회는 1714년 경도법(Longitude Act) 을 통과시키며 당시로선 어마어마한 상금 2만 파운드(지금 가치로 수십억 원)를 내겁니다. "바다에서 경도를 정확히 알아내는 방법을 가져오라."
이 문제를 푼 건 뉴턴 같은 천문학자가 아니라, 정규 교육도 못 받은 시골 목수 출신 시계공 존 해리슨(John Harrison) 이었습니다. 그는 평생을 바쳐 흔들리는 배 위에서도 정확한 시계 H4 를 만들어냈습니다. 1762년 자메이카까지 항해하는 동안 이 시계의 오차는 47일에 단 5.1초. "경도 = 시간"이라는 직관을 한 손바닥만 한 시계로 증명한 겁니다.
💡 그래서 GPS도 본질은 '시계'입니다. 위성이 보내는 정밀한 시각을 받아 거리를 역산하니까요. 해리슨이 풀던 "시간을 알면 위치가 나온다"는 문제를, 지금은 위성 시계가 풀고 있는 셈입니다.
0°는 왜 하필 런던에 있나 — 그리니치의 정치
여기서 자연스러운 질문 하나. 위도 0°는 적도라서 자연이 정해줬다 쳐도, 경도 0°는 왜 하필 런던 그리니치일까요?
답은 허무합니다. 그냥 회의에서 정했기 때문입니다. 1884년 워싱턴에서 열린 국제자오선회의에서, 당시 전 세계 배의 다수가 이미 그리니치를 기준으로 쓰고 있다는 현실적인 이유로 그리니치가 0°로 '선출'됐습니다. 자연법칙이 아니라 투표였던 거죠.
모두가 박수친 건 아니었습니다. 자존심 상한 프랑스는 기권했고, 그 뒤로도 수십 년간 자기네 파리 자오선을 0°로 고집했습니다.
🔗 지도의 역사 편에서 "투영법은 곧 선택이고, 선택은 곧 정치"라고 했던 것, 기억하나요? 알고 보니 지도를 어떻게 펼치느냐뿐 아니라, 좌표의 기준선을 어디에 긋느냐까지도 정치였습니다. 경도의 출발선 하나에도 국가의 자존심이 걸려 있었던 거죠.
도·분·초 — 당신의 시계와 같은 핏줄
이제 표기법을 봅시다. 좌표를 보면 가끔 이렇게 적힌 걸 만납니다.
37°33′59″N 126°58′40″E
이 °, ′, ″가 도(degree)·분(minute)·초(second), 줄여서 DMS입니다. 규칙은 시계와 똑같습니다.
1도(°) = 60분(′) = 3600초(″)
분과 초는 표기를 위한 장식이 아니라, 위치를 점점 좁혀 들어가는 도구입니다. 도 하나가 너무 크거든요. 위도 1°는 약 111km — 도시가 통째로 들어가는 띠라서 "북위 37도"만으론 어디인지 짚었다고 하기 어렵죠. 그래서 1도를 60조각 낸 게 분(약 1.85km, 동네만 한 크기), 1분을 다시 60조각 낸 게 초(약 31m, 건물만 한 크기)입니다. 결국 37°33′59″를 읽는 건 주소를 읽는 것과 같아요 — 도로 지역을, 분으로 동네를, 초로 번지를 짚어가는 셈이죠. 위도와 경도를 각각 이렇게 좁히면, 가로줄과 세로줄이 만나는 딱 한 칸이 곧 그 위치가 됩니다.
그런데 왜 하필 60씩일까요? "어디서 많이 본 숫자인데" 싶다면 정확합니다. 1시간이 60분, 1분이 60초인 그 60진법과 완전히 같은 뿌리거든요. 둘 다 약 4,000년 전 바빌로니아가 쓰던 60진법에서 내려왔습니다.
🔗 지도의 역사 편 맨 처음에 나온 그 바빌론 점토판 지도, 기억하나요? 가장 오래된 세계지도를 남긴 그 문명이, 당신 손목시계의 '분·초'와 GPS 좌표의 '분·초'에 4,000년 뒤까지 흔적을 남긴 겁니다. 시간과 각도가 같은 60진법을 쓰는 건 우연이 아니었습니다.
중요한 건, DMS와 십진도(decimal degree)는 같은 위치의 두 가지 표기일 뿐이라는 점입니다. 37°33′59″N이나 37.5664°나 가리키는 곳은 똑같습니다. 옛날 종이 지도·항해 세계는 도분초를, 컴퓨터·웹지도 세계는 십진도를 즐겨 쓸 뿐이죠. 그래서 둘 사이를 변환할 일이 자주 생깁니다.
도분초 ↔ 십진도, 직접 바꿔보기
변환 공식은 의외로 단순합니다. 분은 60으로, 초는 3600으로 나눠 더하면 끝입니다.
십진도 = 도 + 분 ÷ 60 + 초 ÷ 3600
37°33′59″를 넣어보면 37 + 33/60 + 59/3600 ≈ 37.5664°. 코드로 옮기면 이렇습니다.
// 도분초(DMS) → 십진도(DD)
function dmsToDecimal(deg, min, sec, dir = 'N') {
const decimal = deg + min / 60 + sec / 3600;
// 남위(S)·서경(W)은 음수
return dir === 'S' || dir === 'W' ? -decimal : decimal;
}
dmsToDecimal(37, 33, 59); // 37.56639
// 십진도(DD) → 도분초(DMS)
function decimalToDms(decimal) {
const sign = decimal < 0 ? -1 : 1;
const abs = Math.abs(decimal);
const deg = Math.floor(abs);
const minFloat = (abs - deg) * 60;
const min = Math.floor(minFloat);
const sec = Math.round((minFloat - min) * 60);
return { deg: deg * sign, min, sec };
}
decimalToDms(37.5664); // { deg: 37, min: 33, sec: 59 }
핵심은 부호입니다. 남위(S)와 서경(W)은 십진도로 적을 때 음수가 됩니다. 이걸 빠뜨리면 지구 반대편으로 점이 날아가죠.
소수점 몇 자리까지 찍어야 할까
십진도를 쓰다 보면 고민이 생깁니다. 37.5664면 될까, 37.56639827까지 적어야 하나?
답은 소수점 한 자리가 거리로 얼마인지를 보면 나옵니다. 위도 기준 대략 이렇습니다.
| 소수 자릿수 | 거리(위도 기준) | 이 정도면 |
|---|---|---|
| 0 (정수) | 약 111 km | 도시 하나 |
| 1 | 약 11 km | 동네 |
| 2 | 약 1.1 km | 큰 건물 단지 |
| 3 | 약 110 m | 골목 |
| 4 | 약 11 m | 건물 |
| 5 | 약 1.1 m | 집 현관 |
| 6 | 약 11 cm | 사람 한 명 |
| 7 | 약 1.1 cm | 손가락 |
즉 소수점 5자리면 이미 당신 집 현관을 짚어냅니다. 웬만한 GPS·지도 서비스는 5~6자리면 충분하다는 뜻이죠. (경도는 위도에 따라 좁아져서, 한국 위도에선 같은 자릿수가 약 0.8배 거리입니다. 극지방으로 갈수록 더 좁아지고요.)
💡 그래서 좌표를 소수점 13자리까지 복사해 DB에 넣는 건, 만화 xkcd 2170 "Coordinate Precision"의 농담처럼 "길 하나의 위치를 원자 단위로 적는" 격입니다. 의미 없는 자릿수는 저장 공간만 먹고, 비교할 때 미묘한 반올림 오차의 함정이 되기도 합니다.
진짜 함정 — (위도, 경도)냐 (경도, 위도)냐
자, 이제 이 글을 시작한 그 지뢰입니다. 서울을 바다에 빠뜨린 범인.
문제의 뿌리는 세상이 좌표 순서를 두고 두 진영으로 갈라져 있다는 데 있습니다.
사람과 대부분의 지도 라이브러리는 (위도, 경도) 순서를 씁니다. 우리가 "북위 37.5도, 동경 127도"라고 위도부터 말하는 것처럼요.
new google.maps.LatLng(37.5, 127); // (위도, 경도)
new kakao.maps.LatLng(37.5, 127); // (위도, 경도)
new naver.maps.LatLng(37.5, 127); // (위도, 경도)
L.latLng(37.5, 127); // (위도, 경도) — Leaflet
그런데 데이터 포맷들은 정반대로 (경도, 위도) 순서를 씁니다. 수학의 (x, y) 관습을 따르기 때문이죠. x축이 가로(경도), y축이 세로(위도)니까요.
// GeoJSON (RFC 7946) — [경도, 위도]
{ "type": "Point", "coordinates": [127, 37.5] }
// WKT / PostGIS — POINT(경도 위도)
POINT(127 37.5)
이 둘을 무심코 섞으면, 지도 라이브러리에서 꺼낸 (37.5, 127)을 GeoJSON에 그대로 [37.5, 127]로 넣게 됩니다. 그 순간 좌표는 위도 37.5°가 아니라 경도 37.5°, 경도 127°가 아니라 위도 127° 로 해석되죠. 위도 127°는 지구에 존재하지 않으니 에러가 나거나, 운 나쁘면 엉뚱한 바다 한가운데에 조용히 점이 찍힙니다.
여기에 한국 개발자를 가장 자주 울리는 킬러 디테일이 하나 있습니다. 카카오는 같은 SDK 안에서도 순서가 엇갈립니다.
| 카카오 API | 좌표 순서 |
|---|---|
kakao.maps.LatLng(...) | (위도, 경도) |
| 로컬 REST API 파라미터 | x = 경도, y = 위도 |
지오코더 coord2Address(...) | (경도, 위도) |
지도에 마커 찍을 땐 위도부터, 주소 검색 REST를 호출할 땐 경도부터. 한 서비스 안에서 둘을 오가다 보면 어느새 좌표가 뒤집혀 있습니다. 구글에 "카카오 좌표 안 맞음"을 검색하면 같은 함정에 빠진 사람들이 줄줄이 나오는 이유죠.
외우는 법은 한 줄로 정리됩니다.
데이터는 수학처럼 (x, y) = (경도, 위도). 지도 라이브러리는 사람처럼 (위도, 경도).
이 순서 문제는 좌표계를 코드로 변환할 때 더 교묘해집니다. 그 이야기는 시리즈 뒤편의 좌표 변환(proj4) 편에서 본격적으로 다룰게요.
정리 — 한 문장으로
위도와 경도는 지구 위 한 점을 가리키는 숫자 두 개다. 다만 그 두 숫자를 어떤 표기로, 어떤 순서로 쓰느냐가 늘 사고를 부른다.
| 개념 | 한 줄 정의 | 기억할 점 |
|---|---|---|
| 위도 / 경도 | 가로줄(적도 0°) / 세로줄(그리니치 0°) | 위도=가로, 경도=세로 |
| 도분초(DMS) | 1° = 60′ = 3600″ | 시계와 같은 바빌론 60진법 |
| 십진도(DD) | 같은 각도의 소수 표기 | 5자리면 ≈1.1m(집 현관) |
| 좌표 순서 | 지도 라이브러리 (위도,경도) ↔ 데이터 (경도,위도) | 섞으면 서울이 바다로 |
숫자 두 개로 지구의 한 점을 찍는 일은, 알고 보면 4,000년 전 바빌론의 60진법과 1707년의 난파, 1884년의 외교 투표가 겹겹이 쌓인 결과였습니다. 그리고 그 위에서 우리는 여전히 순서 하나로 점을 바다에 빠뜨리고 있죠.
다음 글에서는 한 걸음 더 들어갑니다. 우리는 지금까지 위경도로 점을 찍었지만, 정작 그 점이 올라앉은 지구 자체가 사실 완벽한 구가 아니라는 불편한 진실이 있습니다. "지구의 진짜 모양 — 지오이드와 타원체", 측지가 왜 그렇게 어려운지의 출발점입니다.
참고
- https://en.wikipedia.org/wiki/Geographic_coordinate_system
- https://en.wikipedia.org/wiki/Longitude
- https://www.rmg.co.uk/stories/time/harrisons-clocks-longitude-problem
- https://en.wikipedia.org/wiki/Scilly_naval_disaster_of_1707
- https://en.wikipedia.org/wiki/Prime_meridian
- https://datatracker.ietf.org/doc/html/rfc7946
- https://xkcd.com/2170/
- https://apis.map.kakao.com/web/documentation/