지도정보를 좌표정보로 변환하기
지도 정보는 위도와 경도로 표시됩니다.
위도는 적도 중심으로 북극 혹은 남극까지
+90도, -90도의 값을 가지고,
경도는 그리니치 천문대 기준으로 동서로
+180도, -180도 값을 가집니다.
이 위도 및 경도 값을 좌표 값으로 변환하려면 구면 좌표계에 대한 이해가 필요합니다.
그 이유는 아래 그림과 같습니다.
우선 변환하고자 하는 값은 원의 "호" 에 해당하는 값이라서 반지름이 R이고, 각도가 theta라고 하면
호는 R * theta 가 됩니다.
이제 위도 값을 보자면 +-90도 이므로 그냥 각도를 계산하면 됩니다.
하지만 그림에서와 같이 위도 값은 구에서 자른 절단면에 대한 원의 반지름이 달라지기 때문에
계산법이 달라집니다. 그냥 각도값을 가지는게 아니라 R * (phi) * cos(theta) 가 되는 것이지요.
그리고 지도 정보를 코드에 적용한다고 할때, 저의 경우는
"내 위치" 기준으로 생각해서 좌표계를 재설정 하는 방식을 취했습니다.
그러므로 구할 수 있는 위도, 경도 좌표값을 내 위치로부터 차 값을 구하고
위의 그림에서와 같이 평면 좌표로 변환하는 것입니다.
예제 코드는 아래와 같습니다.
.....
lngLat = pairs[i].split(",");
lat_angle = Double.parseDouble(lngLat[1]);//*1E6;
delx = Double.parseDouble(lngLat[0]) - (geoOverlay.gslongitude / 1E6); // longitude 의 차이값을 구함
dely = Double.parseDouble(lngLat[1]) - (geoOverlay.gslatitude / 1E6); // latitude 의 차이값을 구함
var[j] = earthR * delx * (Math.PI/180) * Math.cos(lat_angle/180*Math.PI);
var[j+1] = earthR * dely * (Math.PI/180);
......
코드 상에서 "Math.PI/180" 처럼 PI값이 3.14 인 라디안 값인데, 수학적인 함수를 사용할때 라디안 값으로 변환되므로
180도를 나누어 차원을 변환해주기 위해 처리한 부분입니다.