расчет расстояния между двумя почтовыми индексами с использованием javascript

Я пытаюсь определить расстояние между двумя почтовыми индексами. Координаты одного почтового индекса являются общими, однако другой почтовый индекс хранится в базе данных, которую мне нужно получить. Этот код ниже не определяет расстояние между общим почтовым индексом и тем, который я ввел.

var x = getDistanceFromLatLonInKm(52.482799000000000, -2.000643000000000, 52.48463500000000, -1.980759000000000);

function getDistanceFromLatLonInKm(lat1, lon1, lat2, lon2){
  console.log(lat1, lon1, lat2, lon2); 
var distanceFromSpecificPoint = getDistanceFromLatLonInKm.bind(null, 52.486637, -1.890952); 

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


document.getElementById('result').textContent = x;

console.log(x)
</script>

person Amandeep Singh    schedule 05.04.2016    source источник
comment
zipcodeapi.com   -  person Richard Hamilton    schedule 05.04.2016
comment
Что эта строка пытается сделать? Мне кажется странным. Неверная сигнатура функции и, похоже, она не добавляет никакого значения: var distanceFromSpecificPoint = getDistanceFromLatLonInKm.bind(null, 52.486637, -1.890952);   -  person ManoDestra    schedule 05.04.2016
comment
Кроме того, вы можете заключить несколько квадратных скобок в свой расчет для a. До сих пор не проверял математическую достоверность этих расчетов, но это одна из возможных областей для ошибки, которая сразу приходит на ум. И вы можете использовать некоторые вызовы Math.pow в этом вычислении, чтобы избежать повторного выполнения двух операций sin.   -  person ManoDestra    schedule 05.04.2016
comment
Основываясь на следующем алгоритме (я полагаю, что это то, откуда вы взяли свой код?), ваш код выглядит правильно: movable-type.co.uk/scripts/latlong.html. Разница лишь в том, что он возвращает значение в метрах, а ваш возвращает километры. Предполагая, что алгоритм правильный, ваш код кажется правильным. В чем твоя ошибка? Ваша функция javascript верна. Если вы хотите получить расстояние, просто вызовите функцию javascript, передав общую широту/долготу с широтой/долготой, которую вы получаете из базы данных. Ваш звонок выше у меня отлично работает: 1.3618590385878444 км.   -  person ManoDestra    schedule 05.04.2016
comment
@ManoDestra Я понимаю, что это работает так, однако я пытаюсь заставить код иметь один общий почтовый индекс (один почтовый индекс всегда установлен), а другой почтовый индекс изменяться в зависимости от того, какое это свойство, а затем работать на расстоянии от каждого свойства   -  person Amandeep Singh    schedule 05.04.2016
comment
Затем либо передайте фиксированную широту/долготу функции javascript, либо установите ее как константу в функции javascript динамически из базы данных через ваш JSP, ASP или что-то еще. Затем вы можете просто изменить сигнатуру функции, чтобы принимать только одну пару широты и долготы, так как значения для другой будут храниться внутри самой функции. Есть смысл? Я могу показать вам что-то вроде того, что я имею в виду в качестве ответа, если хотите?   -  person ManoDestra    schedule 05.04.2016
comment
@ManoDestra да, пожалуйста, не могли бы вы показать мне   -  person Amandeep Singh    schedule 05.04.2016


Ответы (1)


Как указано выше, вы можете просто получить значение из базы данных на стороне сервера и использовать любую веб-инфраструктуру на стороне сервера, которую вы хотите. Пример, который я привел здесь, — это классический ASP, исключительно в качестве примера, чтобы показать вам, где вводятся значения. Затем на стороне сервера значения базы данных являются константами, и вы вводите широту/долготу только для одной точки и получаете расстояние из базы данных широты/долготы (константы LAT1/LON1 здесь). dbModel будет некоторым объектом на стороне сервера, который заполняется из базы данных. Затем вы можете получить значения широты/долготы из этого объекта для вставки на веб-страницу с помощью сценариев на стороне сервера.

function getDistanceFromLatLonInKm(lat, lon) {
    const EARTH_RADIUS = 6371; // Radius of the earth in km 
    // Here's where you would add the value dynamically from the DB.
    // I'm using classic ASP here just as an example. You'll have to
    // amend for your particular server side web framework, be it
    // JSP, MVC, etc.
    const LAT1 = <%=dbModel.getLatitude()%>;
    const LON1 = <%=dbModel.getLongitude()%>;
    console.log(LAT1, LON1, lat, lon);

    var dLat = deg2rad(lat - LAT1);
    var dLon = deg2rad(lon - LON1);
    var a = Math.pow(Math.sin(dLat / 2), 2) + Math.cos(deg2rad(LAT1)) * Math.cos(deg2rad(LON1)) * Math.pow(Math.sin(dLon / 2), 2);
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
    var d = EARTH_RADIUS * c; // Distance in km 

    return d;
}

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

Или, если вам не требуется такая динамика, просто возьмите статические значения из базы данных и введите их здесь как значения для LAT1 и LON1.

E.g.

    const LAT1 = 52.482799;
    const LON1 = -2.000643;

Затем просто вызовите свою функцию следующим образом...

var distance = getDistanceFromLatLonInKm(52.48463500000000, -1.980759000000000);

Чтобы выполнить поиск PAF:

FreeMapTools

Карты Google. Просто найдите свой почтовый индекс, затем возьмите широту/долготу из URL-адреса.

person ManoDestra    schedule 05.04.2016
comment
У меня работает нормально. Какую ошибку вы получаете или почему это не работает? Вы должны будете сказать мне, что идет не так, чтобы я мог помочь вам. - person ManoDestra; 05.04.2016
comment
При переносе кода была небольшая опечатка. Обновлено сейчас :) - person ManoDestra; 05.04.2016
comment
Спасибо. Я использую php для получения информации из базы данных. Я не уверен, как я получу информацию о почтовом индексе, поскольку почтовый индекс свойства хранится без длинной информации о широте. Однако у меня есть все почтовые индексы Великобритании с соответствующей длинной и широтой информации в другой таблице, называемой почтовыми индексами. Итак, как мне получить почтовый индекс свойства из таблицы свойств, затем связать его с таблицей почтовых индексов, а затем получить эту информацию в этой формуле? - person Amandeep Singh; 05.04.2016
comment
Вам нужно будет выполнить поиск почтового индекса, если у вас нет широты/долготы в вашей базе данных, прежде чем вводить значения широты/долготы здесь через PHP. stackoverflow .com/questions/2832942/. Когда у вас есть значения широты и долготы, просто введите их здесь, и все будет работать нормально. Может показаться, что ваша проблема связана вовсе не с javascript, а с тем, как выполнить поиск почтового индекса и преобразовать его в широту/долготу. - person ManoDestra; 05.04.2016
comment
Спасибо за пример, вроде работает. Да, вы правильно подозревали, что это реальная проблема, и я не совсем уверен, как это сделать? если вы не возражаете, не могли бы вы привести мне пример или отправную точку для этого тоже? - person Amandeep Singh; 05.04.2016
comment
Я тебе ссылку выше дал. Прошло много времени с тех пор, как я делал какие-либо поиски PAF TBH, поэтому я не знаю, как они делаются сейчас, сколько стоят и т. д. Вам придется это поискать. Или вы можете просто использовать ЭТО. Или Карты Google. Просто введите свой почтовый индекс, перейдите к местоположению, а затем возьмите широту и долготу из URL-адреса. - person ManoDestra; 05.04.2016