GPS정보(경도, 위도)와 지도이미지 상의 위치 매핑하기

PHP & etc./Windows Live 2008.01.24 20:37

카페에 어떤 분의 질문에 답변 글로 올린 글인데 블로그로 옮겨왔습니다.

경도, 위도 (GPS 정보 따위)를 알고 있을 때, 그것을 지도 이미지 상의 어떤 위치에
매핑을 하기 위해서는

일단
1) 사용하시려고하는 소스, 즉 맵타일 이미지가 어떤 기준을 가지고 만들어졌느냐?
2) 그리고 어떤 도법에 의해서 그려진 지도인가?
를 아셔야 합니다.

버추얼 어스(이하 VE)를 예로 들어 설명해 보겠습니다.


- VE 맵타일 하나는 256 pixel x 256 pixel로 이루어져 있습니다.

- VE 맵 중심점은 위도 0도, 경도 0도입니다.


현재 화면의 지도상태를 ZoomStep 2단계라고 가정하면, 지도이미지는 4x4의 타일로 구성되어 있습니다.

(VE의 ZoomStep 1단계는 세계지도를 2x2의 타일로 표현한 것입니다. VE는 19단계의 ZoomStep을 지원합니다.)

이때 전체 맵 크기는 가로, 세로 256 pixel * 4 = 1024 pixel 입니다.

간단히 생각해 보면.

가로 1024pixel을 경도 360도( -180(=서경180) ~ 180(=동경180)로 나눠쓰고 있고,

세로 1024pixel을 위도 180도(90 (북반구) ~ -90 (남반구))로 나눠쓰고 있다고 생각할 수 있습니다.


이 지도 위에 인천 공항의 위치를 점으로 찍으려면 어떻게 하면 될까요?

먼저, 인천 공항의 경도와 위도를 알아야 합니다.

경도는 126도 36분 30초 입니다.
(편의를 위해 '도' 단위로 나타내겠습니다. 126 + 36 * 1/60 + 30 * 1/3600 =  126.6083도)

위도는 37도 28분 20초 입니다.
(편의를 위해 '도' 단위로 나타내겠습니다. 37 + 28 * 1/60 + 20 * 1/3600 =  37.4722도)


또, 지도의 중심이 경도 0, 위도 0 이고,
지도의 왼쪽이 경도 -180, 오른쪽이 180
지도의 위쪽이 위도 90, 아래쪽이 -90이라는 조건에 의해,
변환식은 아래와 같을 것입니다.

X = W *  (180 + 경도) / 360
Y = H *  (90 - 위도) / 180


X : 지도 이미지 상의 X좌표
Y : 지도 이미지 상의 Y좌표
W : 지도 이미지의 전체 폭
H : 지도 이미지의 전체 높이

위 공식에 따라서 계산을 해보면,

X = 872.130275555556 pixel = 872 (소수점 이하 반올림)

Y = 298.824817777778 pixel = 299 (소수점 이하 반올림)


하지만 간과하면 안 되는 점이 하나 있습니다.

아까도 말씀드렸듯이 어떤 도법으로 그려진 것인지가 중요합니다.


- VE는 메르카토르 도법으로 그려진 지도 입니다.


여기서 새로 고려해야만 하는 사실은 지도이미지가 실제로는 위도 85.05도 ~ -85.05도까지의 범위를 그려놓은 것이라는 점입니다.

즉, 지도이미지 상의 좌표(512, 0)는 경도 0도 위도 85.05도 입니다.
게다가 Y방향으로는 선형관계(Linear)를 갖지 않습니다.

변환식의 수정이 필요하겠죠?
변환식을 수정하고 재계산 해보시면 다른 값이 나올 것입니다.

변환식이 어떻게 바뀌어야 하는지는,
자세한 내용은 http://gilverlight.net/2693를 참조하십시오.


이 정도 생각해 보시면,

어떤 타일이 얼마만큼의 경도, 위도 범위를 표현하는지, 

    LeftTop(경도1, 위도1), RightBottom(경도2, 위도2)

어떤 지점(경도, 위도)이 어떤 타일 위에 존재하는지 계산하는 것은 쉬울 것입니다.

지도이미지 상 좌표가 X = 872, Y = 299라고 가정하면

왼쪽 맨위의 맵타일이 (0, 0)의 인덱스를 갖는 2차원 배열로 가정해서 생각해보면,

아래와 같이 인덱스를 구할 수 있을 겁니다.

XIndex = Math.Floor( X / 단위 맵타일 폭 )

YIndex = Math.Floor( Y / 단위 맵타일 높이 )

Math.Floor(872 / 256) = 3

Math.Floor(299 / 256) = 1

(3, 1)에 해당하는 맵타일 위가 되겠군요.


설정

트랙백

댓글

  • BlogIcon 신용불량자 2009.07.14 23:22 신고 ADDR 수정/삭제 답글

    안녕하십니까.
    구글 타일맵 구현 때문에 검색하다가 여기까지 오게 되었습니다.
    gps좌표와 일치하는 구글 타일맵 불러오기 개념이 님의 글로 인해 쪼금 이해가 되는거 같습니다...그렇습니다만....그래도, 안개속을 헤메는 기분이네요....제가 지금 당장 헷갈리는건요. 같은 타일맵을 가져오는 주소라도 주소의 형태가 약간씩 다르다는 점입니다. 휴~~ 언제쯤 pda용 네비게이션을 구현해 볼지 참 난감합니다.