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


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

ПОЧТОВЫЙ ИНДЕКС, ШИРОТА, ДОЛГОТА, ГОРОД, ШТАТ, ОКРУГ, КЛАСС ZIP_CLASS

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

Author: Click Upvote, 2009-01-02

5 answers

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

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

 6
Author: brendan, 2017-01-06 16:33:43

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

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.
}
 24
Author: Adam Bellaire, 2011-12-18 05:32:16

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

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;
}
 7
Author: Mike Paterson, 2009-01-02 21:03:39

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

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

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

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

 6
Author: Paul Dixon, 2009-01-02 21:32:03

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

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

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

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

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

 1
Author: JV-, 2011-10-07 18:12:35