2014년 8월 29일 금요일

구글 api 사용자 위치와 해당지점 거리및 소요시간 계산

https://developers.google.com/maps/documentation/javascript/distancematrix?hl=ko


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;
        }






http://uglytree.tistory.com/107


거리 구하는 함수가 분명 있을것 같은데 찾지를 못해서 직접 계산했었습니다.
그런데 드디어 함수를 찾았네요.    


이전 포스트 에서 직접 계산한 것과 오차는 거의 없는 것 같습니다.


    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로 프로그램처리하면 아래와 같습니다./20140829 대겸

<?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); 

?>
저작자 표시

댓글 없음:

댓글 쓰기