지도 화면을 확인하다가 조금 이상한 부분을 발견했다.
지도를 한 단계 확대했는데 화면에 표시되는 축척 막대의 값이 이전 레벨과 똑같이 500m로 표시되고 있었다.
처음에는 당연히 잘못된 줄 알았다.
Zoom Level 10 → 500m
Zoom Level 11 → 500m
줌 레벨이 바뀌었으면 지도 축척도 달라졌을 텐데, 왜 축척 막대의 숫자는 그대로일까?
혹시 지도 설정에 문제가 있는 건 아닌지 확인해보기 시작했다.

처음에는 줌 레벨마다 값이 달라야 한다고 생각했다
내가 처음 생각했던 건 단순했다.
지도를 확대하면 같은 화면 크기가 나타내는 실제 거리가 줄어든다.
그러니까 축척 막대도 자연스럽게
1km → 500m → 200m → 100m
같이 줌 레벨마다 하나씩 바뀌어야 한다고 생각했다.
그런데 찾아보니 축척 막대는 그렇게 동작하는 게 아니었다.
내가 보고 있던 건 OpenLayers의 ScaleLine이었다.
new ol.control.ScaleLine({
units: 'metric'
});
ScaleLine은 현재 지도의 해상도에 따라 축척 막대를 그려준다.
여기까지는 예상했던 내용이었다.
그런데 중요한 건 표시되는 거리값을 정하는 방식이었다.
ScaleLine은 축척값을 그대로 보여주는 게 아니었다
ScaleLine의 목적은 현재 지도의 축척을 숫자로 정확하게 그대로 보여주는 것보다는, 화면에서 거리를 가늠하기 좋은 축척 막대를 만들어주는 것에 가깝다.
예를 들어 계산 결과에 따라 축척 막대에 표시할 거리가 애매하게
437m
같이 나온다고 해서 실제 화면에 그대로 437m를 보여주는 방식은 아니다.
사람이 보기 편한 값으로 선택해서 표시한다.
대략 이런 식의 값이다.
1
2
5
10
20
50
100
200
500
1000
...
흔히 말하는 1-2-5 계열의 보기 좋은 단위가 사용된다.
그래서 현재 지도 해상도는 달라졌더라도, 두 레벨에서 적당한 축척 막대의 거리값으로 같은 500m가 선택될 수 있다.
이걸 알고 나니까 왜 같은 값이 연속해서 나오는지 이해가 됐다.
같은 500m라도 막대 길이는 다를 수 있다
여기서 한 가지 더 봐야 했다.
화면에 적힌 숫자가 둘 다 500m라고 해서 두 지도 레벨의 축척이 같다는 뜻은 아니다.
예를 들어:
Zoom A
500m
├──────────────┤
Zoom B
500m
├──────────────────────┤
처럼 같은 500m를 나타내더라도 화면에서 막대가 차지하는 길이는 달라질 수 있다.
줌을 확대하면 지도 한 픽셀이 나타내는 실제 거리가 달라지기 때문이다.
결국 축척 막대에 적혀 있는 500m라는 숫자만 보고
두 레벨의 축척이 같은데?
라고 판단하면 안 되는 것이었다.

실제로 다른 지도도 확인해봤다
그래도 혹시 현재 사용 중인 지도에서만 나타나는 현상인지 궁금해서 다른 지도 서비스도 확인해봤다.
국토지리정보원의 국토정보맵에서 줌 레벨을 한 단계씩 변경하면서 축척 막대를 확인해보니,
서로 다른 지도 레벨에서도 5km가 연속해서 표시되는 구간을 확인할 수 있었다.
줌 레벨이 변경됨
↓
Resolution 변경
↓
축척 막대 다시 계산
↓
표시하기 적당한 거리값 선택
↓
이전 레벨과 같은 값이 선택될 수도 있음
즉,
줌 레벨이 다르면 반드시 축척 막대의 숫자도 달라져야 하는 것은 아니었다.


두 화면을 비교하면 지도에 표시되는 범위는 분명히 달라졌지만, 왼쪽 아래의 축척 막대는 모두 5km로 표시된다.
결국 특정 지도에서만 발생하는 이상 현상이 아니라, 현재 지도 해상도에 맞춰 보기 좋은 거리값을 선택해서 표시하는 축척 막대의 특성상 충분히 나타날 수 있는 현상이라는 걸 확인할 수 있었다.
그럼 실제 지도 축척은 어떻게 확인할까?
여기서 축척 막대와 지도 자체의 축척은 구분할 필요가 있었다.
지도에는 줌 레벨별로 resolution이 있고, 이 값은 한 픽셀이 지도 좌표계상 어느 정도의 거리를 나타내는지와 관련이 있다.
예를 들어 OpenLayers에서는 현재 resolution을 확인할 수 있다.
const resolution = map.getView().getResolution();
console.log(resolution);
줌 레벨을 변경하면서 실행해보면 resolution 값이 달라진다.
즉,
Zoom Level 변경
↓
Resolution 변경
↓
실제 지도 축척도 변경
되고 있는 것이다.
ScaleLine에 같은 500m가 표시된다고 해서 resolution까지 같은 것은 아니다.
이 부분을 구분하니까 처음에 이상하다고 생각했던 현상이 정리됐다.
모니터에 자를 대보면 정말 맞을까?
축척 막대를 보다 보면 이런 생각도 든다.
그럼 모니터에 자를 대고 500m 막대 길이를 재면 실제 축척이 정확하게 나오는 건가?
이건 조금 조심해서 봐야 한다.
화면에서 실제 몇 cm로 표시되는지는 모니터 크기뿐만 아니라 해상도, 브라우저 배율, 운영체제의 디스플레이 배율 같은 환경에도 영향을 받을 수 있다.
그래서 웹 지도에서 표시되는 ScaleLine은 화면상의 거리를 직관적으로 가늠하기 위한 도구로 보는 게 좋다.
정확한 축척 자체를 확인해야 한다면 축척 막대 숫자 하나만 보는 것보다 지도에서 사용하는 resolution과 좌표계, 축척 계산 방식을 함께 확인해야 한다.
처음에는 오류인 줄 알았는데 아니었다
처음에는 두 줌 레벨에서 500m가 연속해서 표시되는 걸 보고 지도 설정이 잘못된 줄 알았다.
그런데 확인해보니 지도는 정상적으로 확대되고 있었고 resolution도 달라지고 있었다.
달라지지 않은 건 ScaleLine이 선택한 표시용 거리값이었다.
줌 레벨이 달라졌다
≠
ScaleLine 숫자도 반드시 달라져야 한다
이렇게 생각하면 간단했다.
지도에서 당연히 축척을 보여주는 기능이라고 생각해서 별생각 없이 보고 있었는데, 막상 어떻게 값을 정해서 표시하는지 확인해보니 생각했던 방식과는 조금 달랐다.
다음에 축척 막대가 같은 값으로 연속해서 나오더라도 일단 오류부터 의심하기보다는 줌 레벨별 resolution이 실제로 바뀌고 있는지부터 확인해봐야겠다.