60 votes

La fonction javascript toRad() jette une erreur

J'essaie de trouver la distance entre deux points (dont j'ai les latitudes et les longitudes) en utilisant la technique décrite à l'adresse suivante Comment calculer la distance entre deux points de latitude et de longitude ?

Les codes sont les suivants avascript :

var R = 6371; // Radius of the earth in km
var dLat = (lat2-lat1).toRad();  // Javascript functions in radians
var dLon = (lon2-lon1).toRad(); 
var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
        Math.cos(lat1.toRad()) * Math.cos(lat2.toRad()) * 
        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

Mais lorsque j'essaie de l'implémenter, une erreur s'affiche, disant que Uncaught TypeError: Object 20 has no Method 'toRad' .

Ai-je besoin d'une bibliothèque spéciale ou autre pour faire fonctionner .toRad() ? se planter sur la deuxième ligne.

111voto

Caspar Kleijne Points 11850

Il vous manque une déclaration de fonction.

En ce cas toRad() doit d'abord être défini comme :

/** Converts numeric degrees to radians */
if (typeof(Number.prototype.toRad) === "undefined") {
  Number.prototype.toRad = function() {
    return this * Math.PI / 180;
  }
}

selon le segment de code tout au bas de la page

25voto

c2theg Points 304

Ou dans mon cas, cela n'a pas fonctionné. C'est peut-être parce que j'avais besoin d'appeler toRad() dans jquery. Je ne suis pas sûr à 100%, alors j'ai fait ceci :

function CalcDistanceBetween(lat1, lon1, lat2, lon2) {
    //Radius of the earth in:  1.609344 miles,  6371 km  | var R = (6371 / 1.609344);
    var R = 3958.7558657440545; // Radius of earth in Miles 
    var dLat = toRad(lat2-lat1);
    var dLon = toRad(lon2-lon1); 
    var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
            Math.cos(toRad(lat1)) * Math.cos(toRad(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;
    return d;
}

function toRad(Value) {
    /** Converts numeric degrees to radians */
    return Value * Math.PI / 180;
}

23voto

Salvador Dali Points 11667

J'avais besoin de calculer beaucoup de distances entre les points pour mon projet, alors j'ai pris les devants et essayé d'optimiser le code, que j'ai trouvé ici. En moyenne, dans différents navigateurs, ma nouvelle implémentation fonctionne presque 3 fois plus vite alors mentionné ici.

function distance(lat1, lon1, lat2, lon2) {
  var R = 6371; // Radius of the earth in km
  var dLat = (lat2 - lat1) * Math.PI / 180;  // deg2rad below
  var dLon = (lon2 - lon1) * Math.PI / 180;
  var a = 
     0.5 - Math.cos(dLat)/2 + 
     Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) * 
     (1 - Math.cos(dLon))/2;

  return R * 2 * Math.asin(Math.sqrt(a));
}

Vous pouvez jouer avec ma jsPerf (qui a été grandement améliorée grâce à Bart) et voir la résultats ici .

4voto

jostmey Points 51

Pourquoi ne pas simplifier l'équation ci-dessus et même quelques calculs ?

Math.sin(dLat/2) * Math.sin(dLat/2) = (1.0-Math.cos(dLat))/2.0

Math.sin(dLon/2) * Math.sin(dLon/2) = (1.0-Math.cos(dLon))/2.0

0voto

Cody Points 1198

J'ai changé deux ou trois choses :

if (!Number.prototype.toRad || (typeof(Number.prototype.toRad) === undefined)) {

et, j'ai remarqué qu'il n'y avait pas de vérification pour le arguments . Vous devriez vous assurer que les args sont définis ET probablement faire un parseInt(arg, 10) / parseFloat là-dessus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X