SupaFlybaba
SupaFlybaba

Reputation: 57

Calculate distance for multiple locations google map

Assume I have 3 locations namely Kallang(A), Paya Lebar(B) and Bedok(C). I try to do a A->B + B->C but the distance always return me A->C. Why is this so ??

kallang to paya lebar(A-B) -> 2.5914199062350742 km

paya lebar to bedok(B-C) -> 4.4403012109180775 km

total (A-B-C) -> 7.03 km

kallang to bedok (A-C) -> 6.88 km

below are my codes:

var R = 6371; 
    var dLat = toRad(location3.lat()-location2.lat()) + toRad(location2.lat()-location1.lat());
    var dLon = toRad(location3.lng()-location2.lng()) + toRad(location2.lng()-location1.lng());

    var dLat1 = toRad(location1.lat());
    var dLat2 = toRad(location2.lat());

    var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
            Math.cos(dLat1) * Math.cos(dLat1) * 
            Math.sin(dLon/2) * Math.sin(dLon/2); 
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
    var d = R * c;

    document.getElementById("distance_direct").innerHTML = "<br/><br/><br/>The distance between the five points (in a straight line) is: "+d +" km.";
}

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

Is it something wrong with my adding and subtracting calculation statement ??? Thanks

Upvotes: 2

Views: 1697

Answers (2)

jlivni
jlivni

Reputation: 4779

You can just use the built in computeDistanceBetween method from the geometry library

Upvotes: 3

miguev
miguev

Reputation: 4865

Yep, the problem is with adding and substracting the same thing. Since toRad() is just a multiplication, it's associative respective to + and - and therefore

var dLat = toRad(location3.lat()-location2.lat())
         + toRad(location2.lat()-location1.lat());

is exactly the same as

var dLat = toRad(location3.lat()-location1.lat());

so you end up calculating the straight distance between the first and last point.

If you are using the Google Maps JavaScript API V3, you can just load the Geometry Library and do this:

var indirect_distance = 
    google.maps.geometry.spherical.computeDistanceBetween(location1, location2)
  + google.maps.geometry.spherical.computeDistanceBetween(location2, location3);

Upvotes: 2

Related Questions