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

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

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

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

Что такое «расстояние»? Вы хотите расстояние "по прямой" / расстояние по дуге? Расстояние по дороге? Фактическое расстояние в 3D между двумя точками в пространстве?

ShreevatsaR 03.01.2009 00:43

@Shreevats: Поскольку он запрашивает расчет с использованием широты и долготы, можно с уверенностью предположить, что вы не получите расстояние по дороге. Фактическое расстояние между двумя точками в космосе (например, через тело Земли), вероятно, также бесполезно. Следовательно, "по прямой" / большой круг наиболее вероятен.

Adam Bellaire 03.01.2009 03:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
23
2
32 367
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

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

Можете дать ссылку, откуда взяли этот расчет?

Eran Galperin 03.01.2009 00:00

Слишком много магических чисел и слишком много отступа справа!

Jonathan Leffler 03.01.2009 00:03

В какой единице это возвращает расстояние? Для почтового индекса, который должен давать 10 миль, он давал что-то вроде 7892.xx (приблизительно). Как это можно преобразовать в мили?

Click Upvote 03.01.2009 00:11

функции из класса util использовались годами. изначально математику нашел онлайн давно, не помню где. формирование предпочтений является субъективным. Я согласен с магическими числами, однако маловероятно, что Земля изменит размеры и нарушит код.

Mike Paterson 03.01.2009 00:15

И не должно ли число Пи быть 3,1415927 (с 7 в конце, а не с 6, поскольку следующая цифра - 5? Или я неправильно это запомнил ...)

Ben 03.01.2009 00:55

Магические числа: 57,29578 градуса - один радиан. А 3958 кажется близким к радиусу Земли, который составляет 3963 мили. [Почему номер другой? И почему только четыре значащих цифры, когда в π так много цифр?]

ShreevatsaR 03.01.2009 04:10

3958 - это, вероятно, средний радиус: 3963 - экваториальный радиус. Использование более точного среднего радиуса, вероятно, бессмысленно, учитывая, что США на самом деле не изометричны по отношению к подмножеству поверхности сферы: вам нужно более точное среднее значение, взятое по США. Или используйте сфероид GPS.

Steve Jessop 03.01.2009 04:19
Ответ принят как подходящий

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

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

это будет работать для 2 почтовых индексов, но представьте, что вы пытаетесь выбрать 100 самых близких местоположений к данному почтовому индексу из тысяч записей в базе данных :)

aryaxt 29.09.2010 08:58

Ознакомьтесь с Формула гаверсина для расчета расстояний по большой окружности между двумя точками. Еще несколько образцов можно найти здесь

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

  • 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

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

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

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

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

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

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

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

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

Другие вопросы по теме