Расчет расстояния между почтовыми индексами в PHP - PullRequest
23 голосов
/ 02 января 2009

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

ZIP, LATITUDE, DONGITUDE, CITY, STATE, COUNTY, ZIP_CLASS

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

Ответы [ 5 ]

24 голосов
/ 03 января 2009

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

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.
}
7 голосов
/ 02 января 2009

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

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;
}
6 голосов
/ 03 января 2009

Проверьте формулу Haversine для расчета расстояний между большими точками. Еще несколько образцов можно найти здесь

Формула Haversine:

  • 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 = R.c

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

6 голосов
/ 03 января 2009

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

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

1 голос
/ 07 октября 2011

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

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

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

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

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

...