2009-08-07 3 views
6

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

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

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

спасибо !!

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

MAJOR UPDATE

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

ответ

1

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

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

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

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

$zip1 = 02446; 

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

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

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

$zip1 = '02446'; 

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

IMHO похоже, что phpZipLocator может использовать небольшую работу.

+0

Огромное спасибо вам. +1 для вас, но, к сожалению, это не решает проблему. Почтовый индекс, который я использую, - 11950, а радиус i установлен равным 5, он имеет 73 почтовых индексов. В настоящее время я отправляю переменную zip-кода через переменную post. Но я изменил переменную на $ zip1 = '11950'; и я все равно получаю тот же результат. –

+0

Я вижу, как он работает с вашим почтовым индексом, интересным материалом здесь. –

+0

Еще более интересно, некоторые из 73 почтовых индексов, которые приходят, находятся примерно в 20 милях от отеля. –

10

Следующие приблизительные расчеты расстояния относительно просты, но может производить ошибки расстояния 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/pi, или 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)] 
0

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

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

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

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

+0

Я изменил это значение непосредственно в первый раз. Спасибо за вашу помощь. –

+0

Ive использовал функцию расстояния, и, к моему удивлению, почтовые индексы, которые появляются, находятся в 0 милях от моего почтового индекса. –

Смежные вопросы