원인은 메르카토르 도법의 특성에 있었다. 사실, 당시 나는 메르카토르 도법이 뭔지도 모르고, 당연히 내가 쓰던 지도가 메르카토르 지도인지 조차 모르고 있었다. 찾아보니, 적도에서 멀어지면 멀어질 수록 지도상의 상하길이가 길어진다는 것을 알았다.
메르카토르 도법 참조
이게 왜 문제가 됐는고..하니..
화면에 표시된 픽셀 하나당 위도, 혹은 경도의 값을 정해서 스크롤된 픽셀만큼 위도와 경도를 재계산해서 지도의 중심값을 계산했는데, 경도의 경우는 픽셀당 경도가 고정값이라 제대로 됐지만, 위도의 경우는 고정값이 아니라서 제대로 되지 않은 것이었다.....
그래서 이것저것 찾아본 결과.. (하루 종일 찾은 것 같다..) 아래와 같은 식으로 해결 할 수 있었다.
double latitudeToPixelY(double latitude) {
double sinLatitude = Math.sin(latitude * (Math.PI / 180));
return (0.5 - Math.log((1 + sinLatitude) / (1 - sinLatitude)) / (4 * Math.PI))
* 지도의 전체픽셀수);
}
double pixelYToLatitude(double pixelY, byte zoom) {
double y = 0.5 - (pixelY / (지도의 전체픽셀수));
return 90 - 360 * Math.atan(Math.exp(-y * (2 * Math.PI))) / Math.PI;
}
누군가에게 도움이 되었으면!
누군가에게 도움이 되었으면!
댓글 없음:
댓글 쓰기