Я нашел этот популярный скрипт PHP / MySQL под названием Zip Location by SaniSoft, и он отлично работает, кроме одного: он не в некоторых случаях.
Кажется, что любой радиус менее 20 миль возвращает такое же количество почтовых индексов, что и 20 миль. Я искал по всему Google, но безуспешно, и мне было интересно, есть ли у кого-то представление об этой ситуации.
Я предпочел бы выяснить эту проблему, прежде чем платить за программу, и я мог бы также использовать опыт обучения. База данных представляет собой список почтовых индексов, долготы и широты каждого почтового индекса. Скрипт использует метод, который определяет расстояние по введенному почтовому индексу и возвращает zip-коды в этом радиусе на основе их lon / lat.
Спасибо!!
Edit: Из использования функции расстояния, которую предоставляет скрипт, я обнаружил, что расстояние между Zip-кодами, которое программа дает мне и моим почтовым индексом, составляет 0 миль.
ОСНОВНОЕ ОБНОВЛЕНИЕ
Из исследования выясняется, что база данных имеет повторяющиеся значения lat / lon. Помните об этом при использовании Zip Locator. Хотя PHP выполняет свою работу, вам нужно будет найти новую базу данных почтовых индексов. Я опубликую свои выводы позже.
Вторая попытка!
Увидев отредактированный запрос о проблеме, я посмотрю, как вы назначаете свои значения zip.
Множество ошибок может быть введено, если ваши почтовые индексы являются целыми числами вместо строк. Самая большая проблема заключается в том, что американские почтовые индексы могут начинаться с 0.
Примеры в ziptest.php не являются хорошими, так как обработка zips как целых чисел. Когда вы пытаетесь описать мой собственный почтовый индекс целым числом:
$zip1 = 02446;
Его интерпретируется PHP как восьмеричное значение 2446. phpZipLocator использует это значение как строку без какого-либо явного преобразования. Поэтому PHP дает десятичное значение восьмеричного 2446 как строку (1318), которая вообще не является почтовым индексом.
Вместо того, чтобы уведомлять, что он не нашел почтовый индекс, phpZipLocator выполняет поиск по радиусу всех почтовых индексов в пределах заданного радиуса чего-то, чего не существует, который он решает, должен быть 1.
Если я установил zip-код, используя строку
$zip1 = '02446';
Я получаю правильный результат.
ИМХО кажется, что phpZipLocator может использовать небольшую работу.
Следующие приблизительные расчеты расстояний относительно просты, но могут приводить к ошибкам расстояния 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. Предполагается, что радиус Земли составляет 6371 км, или 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)]
Значение по умолчанию радиуса в демонстрационном скрипте для phpZipLocator (ziptest.php) использует 20 миль в качестве его радиуса по умолчанию
$radius = 20; $zipArray = $zipLoc->inradius($zipOne,$radius);
Я предполагаю, что это значение для $radius
все еще находится в вашем коде и перезаписывает радиус, который вы хотите использовать. Попробуйте выполнить поиск и заменить $radius
.
Еще лучше, посмотрите на свой код с помощью отладчика и посмотрите, установлен ли $radius
inradius()
20 при вызове inradius()
.