Подтвердить что ты не робот

ToRad() Ошибка сброса функции JavaScript

Я пытаюсь найти расстояние между двумя точками (для которых у меня есть широты и долготы), используя метод, описанный здесь, в Рассчитать расстояние между двумя точками долготы широты? (Формула Хаверсина)

Коды приведены ниже Javascript:

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

Но когда я пытаюсь его реализовать, появляется сообщение об ошибке Uncaught TypeError: Object 20 has no Method 'toRad'.

Нужна ли мне специальная библиотека или что-то, чтобы получить .toRad()? потому что это похоже прикручивая вторую линию.

4b9b3361

Ответ 1

Вам не хватает объявления функции.

В этот случай toRad() должен быть определен сначала как:

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

в соответствии с сегментом кода на в нижней части страницы

Ответ 2

Или в моем случае это не сработало. Это может быть связано с тем, что мне нужно вызвать toRad() внутри jquery. Я не уверен на 100%, поэтому я сделал это:

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

Ответ 3

Мне нужно было вычислить много расстояний между точками моего проекта, поэтому я пошел дальше и попытался оптимизировать код, который я нашел здесь. В среднем в разных браузерах моя новая реализация работает почти в 3 раза быстрее, чем упоминалось здесь.

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

Вы можете играть с моим jsPerf (который был значительно улучшен благодаря Bart) и посмотреть результаты здесь.

Ответ 4

Почему бы не упростить приведенное выше уравнение и такое же несколько вычислений?

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

Ответ 5

У меня была такая же проблема. глядя на ответ Каспера, я только что быстро исправил: Ctrl+H (Найти и заменить), заменил все экземпляры .toRad() с * Math.PI / 180. Это сработало для меня.

Никакой идеи о скоростях работы браузера и т.д., но.. Мой вариант использования нужен только тогда, когда пользователь нажимает на карту.

Ответ 6

Я изменил пару вещей:

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

и, я заметил, что не было проверки для arguments. Вы должны убедиться, что аргументы определены и, вероятно, там parseInt(arg, 10)/parseFloat.