2013-04-20 5 views
0

이 점에 대한 최단 경로를 표시하는 것보다 시작점과 여러 점 사이의 거리를 계산하고 싶지만 항상 마지막 점을 표시합니다. 이 잘 작동 내 distanceCal 기능입니다 :여러 점 사이의 최단 거리

function getDistanceFromLatLonInKm(lat1, lon1, lat2, lon2) { 
var R = 6371; // Radius of the earth in km 
var dLat = deg2rad(lat2 - lat1); // deg2rad below 
var dLon = deg2rad(lon2 - lon1); 
var a = 
    Math.sin(dLat/2) * Math.sin(dLat/2) + 
    Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * 
    Math.sin(dLon/2) * Math.sin(dLon/2) 
; 
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); 
var d = R * c; // Distance in km 
return d; 
} 

function deg2rad(deg) { 
return deg * (Math.PI/180) 
} 

을이 오래/내 포인트 라트입니다 :

var dist = [ 
    [35.733972, -5.881999], 
    [ 35.734077, -5.881033], 
    [ 35.736898, -5.877771], 
    [35.738396, -5.875154] 
    ]; 

다음 내 스크립트를 표시하는 방향 :

function calcRoute() { 
var start = new google.maps.LatLng(35.728329, -5.882750); 
for (var i = 0; i < dist.length; i++) 
{ 
    var dis = dist[i]; 
    //here i need something to choose the shortest route 
    var min = Math.min(getDistanceFromLatLonInKm(35.728329, -5.882750, dis[0], dis[1])); 
    var end = new google.maps.LatLng(dis[0], dis[1]); 
} 
    var request = { 
     origin: start, 
     destination: end, 
     optimizeWaypoints: true, 
     travelMode: google.maps.DirectionsTravelMode.DRIVING 
    }; 

directionsService.route(request, function (response, status) { 
    if (status == google.maps.DirectionsStatus.OK) { 
     directionsDisplay.setDirections(response); 
    } 
}); 

} 
google.maps.event.addDomListener(window, 'load', getMap); 

그렇게하십시오 경우 누군가 어떤 아이디어 나 해결책을 가지고 있으면 매우 감사 할 것입니다.

+0

예, 모든 루프를 돌릴 때마다 'end'를 선택하고 쓰는 것을 잊었습니다. 그리고 하나의 값에서'Math.min'을 얻는다면? – Bergi

+0

본질적으로 [여행 세일즈맨 문제] (http://en.wikipedia.org/wiki/Travelling_salesman_problem)를 해결해 달라는 요청입니까? – deceze

+0

@deceze 아니오 내 루프에서 실수가 없다. – Mohammadov

답변

1

다음 코드는 Googles geometry 라이브러리를 사용하여 점 사이의 거리를 계산합니다. 거리는 배열에 저장되고 최소 거리를 찾기 위해 구문 분석됩니다.

거리 dist []를 유지하기위한 배열이 필요하므로 배열을 dist []에서 coords []로 변경했습니다.

<script type="text/javascript" src="//maps.googleapis.com/maps/api/js?libraries=geometry&sensor=false"></script> 
<script type="text/javascript"> 
var coords = [ 
    [35.733972, -5.881999], 
    [35.734077, -5.881033], 
    [35.736898, -5.877771], 
    [35.738396, -5.875154] 
    ]; 
    var dist = [];//Array to hold distances 
    function calcRoute() { { 
     var start = new google.maps.LatLng(35.728329, -5.882750); 
     for (var i = 0; i < coords.length; i++){ 
     var point = new google.maps.LatLng(coords[i][0],coords[i][1]); 
     var distance = google.maps.geometry.spherical.computeDistanceBetween(start, point); 
     dist.push(distance); 
     } 
     var test = dist[0]; 
    var index = 0; 
    for (var i = 1; i < dist.length; i++){ 
     if(dist[i] < test){ 
      test = dist[i]; 
      index = i; 
     } 
    } 
    var end = new google.maps.LatLng(coords[index][0],coords[index][1]); 

     // Apply the rest of your code here 
+0

데이빗 코드가 우수하지만이 라인이 잘못되었다. ** var end = 새로운 google .make.LatLng (sortArray [0] [0], sortArray [0] [1]); ** sortArray [0], sortArray [1]로 변경하면 거리의 배열을 얻습니다. – Mohammadov

+0

마지막 줄을 변경합니다. 내가 마지막 라인을 제외한 모든 것을 테스트했습니다. –

+0

@ 모하마 도프 솔루션을 제공하기 위해 응답을 수정했습니다. –

0

당신이에서 optimizeWaypoints 사용할 것 소리 : 당신의 DirectionsServiceRequest에 사실을 :

에서 optimizeWaypoints | 부울 | true로 설정하면 DirectionService는 제공된 중간 웨이 포인트를 재정렬하여 경로의 전체 비용을 최소화합니다. 경유지가 최적화 된 경우 응답에서 DirectionsRoute.waypoint_order를 검사하여 새 주문을 결정합니다.

leg of each route 반환 된 DirectionsResult

거리와 시간 정보를 포함한다.