0

I tried to calculate the distance between two coordinates in javascript.
More specifically the distance between one set of static coordinates and my current position taken from the geolocation cordova plugin.

Here's my code:

document.addEventListener('deviceready', onDeviceReady, false);

function onDeviceReady() {
    navigator.geolocation.getCurrentPosition(onSuccess, onError);
};

var onSuccess = function(position) {
    document.getElementById("content").innerHTML = 'Success, attempting calculation...';
    var lla = position.coords.latitude;
    var llo = position.coords.longitude;

    document.getElementById("content").innerHTML =
'GPS Position: ' + calcTheDistance(lla, llo).d + 'Metres';


};

var onError = function(error) {
    document.getElementById("content").innerHTML =
    'code: ' + error.code + '\n' +
    'message: ' + error.message + '\n';
};

function refrGps() {
    document.getElementById("content").innerHTML = 'Loading...';
    navigator.geolocation.getCurrentPosition(onSuccess, onError);
};

function calcTheDistance(lati1, long1) {
    var r = 6371000; //Meters
    var joschLat = 50.1109221;
    var joschLon = 8.6821267;
    var la1 = lati1;
    var la2 = joschLat;
    var lat1 = lati1.toRadians();
    var lat2 = joschLat.toRadians();
    var lo1 = long1;
    var lo2 = joschLon;
    var la2minla1 = (la2-la1).toRadians();
    var lo2minlo1 = (lo2-lo1).toRadians();

    var cal = Math.sin(la2minla1 / 2) * Math.sin(la2minla1 / 2) +
            Math.cos(lat1) * Math.cos(lat2) *
            Math.sin(lo2minlo1/2) * Math.sin(lo2minlo1/2);
    var c = 2* Math.atan2(Math.sqrt(cal), Math.sqrt(1-cal));

    d = r * c;
};

I tried to rewrite it several times with no luck.

For the calculation I referred to this: http://www.movable-type.co.uk/scripts/latlong.html

J. Hens.
  • 3
  • 1
  • 3

2 Answers2

0

The page you referenced contains a library of functions already implemented in Javascript. If you include these in your app, the calculation becomes trivial:

document.addEventListener('deviceready', onDeviceReady, false);

function onDeviceReady() {
    navigator.geolocation.getCurrentPosition(onSuccess, onError);
};

var onSuccess = function(position) {
    document.getElementById("content").innerHTML = 'Success, attempting calculation...';
    var sourceLl = new LatLon(position.coords.latitude, position.coords.longitude);

    document.getElementById("content").innerHTML =
'GPS Position: ' + calcTheDistance(sourceLl) + 'Metres';
};

var onError = function(error) {
    document.getElementById("content").innerHTML =
    'code: ' + error.code + '\n' +
    'message: ' + error.message + '\n';
};

function refrGps() {
    document.getElementById("content").innerHTML = 'Loading...';
    navigator.geolocation.getCurrentPosition(onSuccess, onError);
};

function calcTheDistance(sourceLl) {
    var joschLat = 50.1109221;
    var joschLon = 8.6821267;
    var joschLl = new LatLon(joschLat, joschLon);
    return joschLl.distanceTo(sourceLl);
};
DaveAlden
  • 30,083
  • 11
  • 93
  • 155
0

So I figured it out after reading @DaveAlden 's Answer, thanks by the way!

toRadians(); is not a standard Javascript function, so after I added this and rewrote my code a bit, it worked fine.

Here's the working code document.addEventListener('deviceready', onDeviceReady, false);

function onDeviceReady() {


navigator.geolocation.getCurrentPosition(onSuccess, onError);
};

var onSuccess = function(position) {
    document.getElementById("content").innerHTML = 'Success, attempting calculation...';
    var lla = position.coords.latitude;
    var llo = position.coords.longitude;
    var dst = 'Distance: ' + calcTheDistance(lla, llo) + ' Metres';
    document.getElementById("content").innerHTML = dst;


};

var onError = function(error) {
    document.getElementById("content").innerHTML =
    'code: ' + error.code + '\n' +
    'message: ' + error.message + '\n';
};

function refrGps() {
    document.getElementById("content").innerHTML = 'Loading...';
    navigator.geolocation.getCurrentPosition(onSuccess, onError);
};

    function toRadians(num) {
        return num * Math.PI / 180; 
};

function calcTheDistance(lati1, long1) {
    var r = 6371000; //metres
    var joschLat = 50.1109221;
    var joschLon = 8.6821267;
    var la1 = lati1;
    var la2 = joschLat;
    var lat1 = toRadians(lati1);
    var lat2 = toRadians(joschLat);
    var lo1 = long1;
    var lo2 = joschLon;
    var la2minla1 = toRadians(la2-la1);
    var lo2minlo1 = toRadians(lo2-lo1);

    var cal = Math.sin(la2minla1 / 2) * Math.sin(la2minla1 / 2) +
            Math.cos(lat1) * Math.cos(lat2) *
            Math.sin(lo2minlo1/2) * Math.sin(lo2minlo1/2);
    var c = 2* Math.atan2(Math.sqrt(cal), Math.sqrt(1-cal));

    var d = r * c;
    return Math.round(d);
};
J. Hens.
  • 3
  • 1
  • 3