20'C 흐림
서울 강남구
거리계산은 보통 이동시간을 예상 하기 위해서 이용되지만
만약 100여개의 모든 예시를 이동이 예상되는 모든 사례의 거리 소요 시간을
네비의 추천 경로를 기준으로 한다면 엄청난 시간이 소요 되게 된다.
이때 직선 거리로 가계산을 돌려주어 변수를 줄여 나가는것이 합리적 일 것이다.
이때 사용 가능한 두지점간의 GPS(decimal)값을 이용한
직선 거리 계산법을 검색하다.
아래의 자료를 알아내었다.
1. PHP
<?php
function Distance($lat1, $lon1, $lat2, $lon2, $unit) {
$radius = 6378.137; // earth mean radius defined by WGS84
$dlon = $lon1 - $lon2;
$distance = acos( sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($dlon))) * $radius;
if ($unit == "K") {
return ($distance);
} else if ($unit == "M") {
return ($distance * 0.621371192);
} else if ($unit == "N") {
return ($distance * 0.539956803);
} else {
return 0;
}
}
$lat1 = 41.3879169;
$lon1 = 2.1699187;
$lat2 = 40.4167413;
$lon2 = -3.7032498;
echo Distance($lat1, $lon1, $lat2, $lon2, "K") . " kilometers<br>";
echo Distance($lat1, $lon1, $lat2, $lon2, "M") . " miles<br>";
echo Distance($lat1, $lon1, $lat2, $lon2, "N") . " nautical miles<br>";
?>
2. Mysql - 함수
CREATE FUNCTION distance_between (from_lat DECIMAL(6, 3), from_lng DECIMAL(6, 3), to_lat DECIMAL(6, 3), to_lng DECIMAL(6, 3)) RETURNS DECIMAL(11, 3)
RETURN 6371 * 2 * ATAN2(SQRT(POW(SIN(RADIANS(to_lat - from_lat)/2), 2) + POW(SIN(RADIANS(to_lng - from_lng)/2), 2) * COS(RADIANS(from_lat)) * COS(RADIANS(to_lat))), SQRT(1 - POW(SIN(RADIANS(to_lat - from_lat)/2), 2) + POW(SIN(RADIANS(to_lng - from_lng)/2), 2) * COS(RADIANS(from_lat)) * COS(RADIANS(to_lat))));
3. JavaScript
<script type="text/javascript">
var lat1 = 41.3879169;
var lon1 = 2.1699187;
var lat2 = 40.4167413;
var lon2 = -3.7032498;
Distancia = Dist(lat1, lon1, lat2, lon2); //Return Kilometers
function Dist(lat1, lon1, lat2, lon2)
{
rad = function(x) {return x*Math.PI/180;}
var R = 6378.137; //Earth radius in km (WGS84)
var dLat = rad( lat2 - lat1 );
var dLong = rad( lon2 - lon1 );
var a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(rad(lat1)) * Math.cos(rad(lat2)) * Math.sin(dLong/2) * Math.sin(dLong/2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d = R * c;
return d.toFixed(3); //Return 3 decimals
}
</script>