Расчет расстояния между почтовыми индексами в PHP

Я захватил базу данных почтовых индексов и их языков / широт и т. Д. С этой страницы . Он имеет следующие поля:

ZIP, LATITUDE, LONGITUDE, CITY, STATE, COUNTY, ZIP_CLASS

Данные были в текстовом файле, но я ввел его в таблицу MySQL. Мой вопрос в том, как я могу использовать поля выше, чтобы рассчитать расстояние между двумя почтовыми индексами, которые пользователь может ввести на веб-сайт? Рабочий код в PHP будет оценен

Вы также можете попробовать ударить веб-сервис, чтобы вычислить расстояние. Пусть кто-то другой сделает тяжелый подъем.

https://www.zipcodeapi.com/API#distance

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

function calc_distance($point1, $point2) { $radius = 3958; // Earth's radius (miles) $deg_per_rad = 57.29578; // Number of degrees/radian (for conversion) $distance = ($radius * pi() * sqrt( ($point1['lat'] - $point2['lat']) * ($point1['lat'] - $point2['lat']) + cos($point1['lat'] / $deg_per_rad) // Convert these to * cos($point2['lat'] / $deg_per_rad) // radians for cos() * ($point1['long'] - $point2['long']) * ($point1['long'] - $point2['long']) ) / 180); return $distance; // Returned using the units used for $radius. } 

Это можно сделать только с помощью математики …

 function calc_distance($point1, $point2) { $distance = (3958 * 3.1415926 * sqrt( ($point1['lat'] - $point2['lat']) * ($point1['lat'] - $point2['lat']) + cos($point1['lat'] / 57.29578) * cos($point2['lat'] / 57.29578) * ($point1['long'] - $point2['long']) * ($point1['long'] - $point2['long']) ) / 180); return $distance; } 

Ознакомьтесь с формулой Хаверсина для расчета больших расстояний между двумя точками. Здесь можно найти еще несколько образцов

Формула Хаверсина:

  • R = радиус Земли (средний радиус = 6 371 км)
  • Δlat = lat2-lat1
  • Δlong = long2- long1
  • a = sin² (Δlat / 2) + cos (lat1) .cos (lat2) .sin² (Δlong / 2)
  • c = 2.atan2 (√a, √ (1-a))
  • d = Rc

(Обратите внимание, что углы должны быть в радианах, чтобы перейти к триггерным функциям).

В вашей таблице zip вам нужно захватить координаты (lat, long) для двух точек, для которых вы хотите получить расстояние.

Затем вы можете либо рассчитать расстояние прямо в SQL или PHP. Оба метода описаны в этом сообщении:

http://dev.strategystar.net/2011/10/mysql-php-get-distance-between-two-coordinates-in-miles-kilometers/

Расчет в примере основан на формуле, уже обсуждавшейся в этом потоке. Он обеспечивает радиус земли в километрах и километрах, поэтому он позволит вам получить расстояние между двумя точками в обоих устройствах.

Ссылка выше великолепна, потому что метод вычисления не включает никаких магических чисел, просто радиус земли!