Нахождение почтовых индексов в определенном радиусе - PullRequest
6 голосов
/ 07 августа 2009

Я нашел этот популярный скрипт PHP / MySQL под названием Zip Location от SaniSoft, и он прекрасно работает, кроме одной вещи: в некоторых случаях это не так.

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

Я бы предпочел разобраться с этой проблемой, прежде чем платить за программу, и я мог бы также использовать опыт обучения. База данных представляет собой список почтовых индексов, а также долготы и широты каждого почтового индекса. В сценарии используется метод, который определяет расстояние вокруг введенного почтового индекса и возвращает почтовые индексы в этом радиусе на основе их lon / lat.

Спасибо !!

Edit: Используя функцию расстояния, предоставляемую сценарием, я обнаружил, что расстояние между почтовыми индексами, которые программа мне и моим почтовым индексом, составляет 0 миль.

ОСНОВНОЕ ОБНОВЛЕНИЕ

Из исследований выясняется, что в базе данных есть повторяющиеся значения широт / долгот. Помните об этом при использовании Zip Locator. Хотя PHP делает свою работу, вам нужно будет найти новую базу данных почтовых индексов. Я опубликую свои выводы позже.

Ответы [ 3 ]

10 голосов
/ 07 августа 2009

Следующие приблизительные расчеты расстояния относительно просты, но может производить ошибки расстояния на 10% больше. Эти приблизительные расчеты выполняются с использованием значений широты и долготы в градусах . Первое приближение требует только простых математических функций:

Approximate distance in miles = sqrt(x * x + y * y)

where
      x = 69.1 * (lat2 - lat1)
and   
      y = 53 * (lon2 - lon1)

Вы можете повысить точность расчета приблизительного расстояния, добавление косинусной математической функции:

Approximate distance in miles = sqrt(x * x + y * y)

where
      x = 69.1 * (lat2 - lat1)
and   
      y = 69.1 * (lon2 - lon1) * cos(lat1/57.3)

Если вам нужна большая точность, вы должны использовать точный расчет расстояния. Точный расчет расстояния требует использования сферической геометрии, так как Земля это сфера. Точный расчет расстояния также требует высокого уровня математической точности с плавающей точкой - около 15 знаков точности (иногда называется «двойной точностью»). Кроме того, тригматика функции, используемые в точном расчете, требуют преобразования широты и значения долготы от градусов до радианов. Чтобы преобразовать широту или долготы от градусов до радианов, разделите значения широты и долготы в этой базе данных на 180 / пи или 57,2958. Радиус Земли предполагается равным быть 6 371 км или 3 958,75 миль.

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

          Exact distance in miles = 3958.75 * arccos[sin(lat1/57.2958) *
                               sin(lat2/57.2958) + 
                               cos(lat1/57.2958) * 
                               cos(lat2/57.2958) * 
                               cos(lon2/57.2958 - lon1/57.2958)]
1 голос
/ 07 августа 2009

Вторая попытка!

Увидев ваше отредактированное заявление о проблеме, я посмотрю, как вы назначаете значения zip.

Множество ошибок может быть введено, если ваши почтовые индексы целые, а не строки. Самая большая проблема в том, что американские почтовые индексы могут начинаться с 0.

Примеры в ziptest.php не очень хороши, поскольку рассматривают zips как целые числа. Когда вы пытаетесь описать мой собственный почтовый индекс с целым числом:

$zip1 = 02446;

Это интерпретируется PHP как восьмеричное значение 2446. phpZipLocator использует это значение в виде строки без какого-либо явного преобразования. Поэтому PHP дает ему десятичное значение восьмеричного 2446 в виде строки (1318), которая вообще не является почтовым индексом.

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

Если я установил почтовый индекс, используя строку

$zip1 = '02446';

Я получаю правильный результат.

ИМХО, похоже, что phpZipLocator мог бы немного поработать.

0 голосов
/ 07 августа 2009

Значение по умолчанию для радиуса в демонстрационном скрипте для phpZipLocator (ziptest.php) использует радиус в 20 миль в качестве радиуса по умолчанию

$radius = 20;
$zipArray = $zipLoc->inradius($zipOne,$radius);

Полагаю, это значение для $radius все еще находится в вашем коде и перезаписывает радиус, который вы хотите использовать. Попробуйте выполнить поиск и замену для $radius.

Еще лучше, посмотрите на свой код с помощью отладчика и посмотрите, установлено ли для $radius значение 20, когда вы вызываете inradius().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...