http://mrkn.tistory.com/183
function calcDistance(lat1, lon1, lat2, lon2){
var EARTH_R, Rad, radLat1, radLat2, radDist;
var distance, ret;
EARTH_R = 6371000.0;
Rad = Math.PI/180;
radLat1 = Rad * lat1;
radLat2 = Rad * lat2;
radDist = Rad * (lon1 - lon2);
distance = Math.sin(radLat1) * Math.sin(radLat2);
distance = distance + Math.cos(radLat1) * Math.cos(radLat2) * Math.cos(radDist);
ret = EARTH_R * Math.acos(distance);
var rtn = Math.round(Math.round(ret) / 1000);
if(rtn <= 0)
{
rtn = Math.round(ret) + " m";
}else
{
rtn = rtn + " km";
}
return rtn;
}
거리 구하는 함수가 분명 있을것 같은데 찾지를 못해서 직접 계산했었습니다.
그런데 드디어 함수를 찾았네요.
이전 포스트 에서 직접 계산한 것과 오차는 거의 없는 것 같습니다.
var base_latlng, cur_latlng;
function GM_load() {
var map = new GMap2(document.getElementById("map"));
map.setCenter(new GLatLng(36.615527, 127.353515), 12);
map.setUIToDefault();
map.enableGoogleBar();
GEvent.addListener(map, "click", function(overlay,point) {
base_latlng = map.fromContainerPixelToLatLng(point);
var lmarker = new GMarker(point);
map.addOverlay(lmarker);
lmarker.setImage("http://maps.google.com/mapfiles/ms/icons/red-pushpin.png");
});
GEvent.addListener(map, "singlerightclick", function(point, src, overlay){
cur_latlng = map.fromContainerPixelToLatLng(point);
var rmarker = new GMarker(cur_latlng);
map.addOverlay(rmarker);
rmarker.setImage("http://maps.google.com/mapfiles/ms/icons/purple-pushpin.png");
var dist = cur_latlng.distanceFrom(base_latlng);
var myHtml = "Distance: " + dist;
map.openInfoWindow(cur_latlng, myHtml);
});
}
base_latlng, cur_latlng 를 전역으로 선언했습니다.
왼쪽 클릭한 좌표를 fromContainerPixelToLatLng 함수로 base_latlng에 넣고, 마커도 넣었습니다.
마찬가지로 오른쪽 클릭한 좌표를 cur_latlng에 넣었습니다.
그리고 distanceFrom 함수로 거리를 구한 다음 말풍선으로 거리를 표시했습니다.
distanceFrom 함수가 반환하는 거리의 단위는 미터입니다.
<?php
function _deg2rad($deg)
{
$radians = 0.0;
$radians = $deg * M_PI/180.0;
return($radians);
}
function geoDistance($lat1, $lon1, $lat2, $lon2, $unit="k")
{
$theta = $lon1 - $lon2;
$dist = sin(_deg2rad($lat1)) * sin(_deg2rad($lat2)) + cos(_deg2rad($lat1)) * cos(_deg2rad($lat2)) * cos(_deg2rad($theta));
$dist = acos($dist);
$dist = rad2deg($dist);
$miles = $dist * 60 * 1.1515;
$unit = strtolower($unit);
if ($unit == "k") {
return ($miles * 1.609344);
} else {
return $miles;
}
}
// 양재
$a1 = 37.47163412599279;
$a2 = 127.02677155082887;
// 우만동
$b1 = 37.284357977075565;
$b2 = 127.03281619405365;
// 수서
$c1 = 37.4889123433992;
$c2 = 127.10502769792124;
echo geoDistance($a1,$a2,$c1,$c2);
?>
function _deg2rad($deg)
{
$radians = 0.0;
$radians = $deg * M_PI/180.0;
return($radians);
}
function geoDistance($lat1, $lon1, $lat2, $lon2, $unit="k")
{
$theta = $lon1 - $lon2;
$dist = sin(_deg2rad($lat1)) * sin(_deg2rad($lat2)) + cos(_deg2rad($lat1)) * cos(_deg2rad($lat2)) * cos(_deg2rad($theta));
$dist = acos($dist);
$dist = rad2deg($dist);
$miles = $dist * 60 * 1.1515;
$unit = strtolower($unit);
if ($unit == "k") {
return ($miles * 1.609344);
} else {
return $miles;
}
}
// 양재
$a1 = 37.47163412599279;
$a2 = 127.02677155082887;
// 우만동
$b1 = 37.284357977075565;
$b2 = 127.03281619405365;
// 수서
$c1 = 37.4889123433992;
$c2 = 127.10502769792124;
echo geoDistance($a1,$a2,$c1,$c2);
?>
댓글 없음:
댓글 쓰기