2011-12-18 2 views
2

Я видел всевозможные решения типа «store locator» в Интернете для поиска, например, магазинов в пределах заданного радиуса определенного почтового индекса, и у них есть причудливые карты, отображающие в ближайших магазинах и т. д. Многие используют Карты Google или другие базы данных, но многие также полагаются на точные преобразования по широте и долготе и т. д. Но это все излишне для моего проекта.Расчет близости к почтовому индексу в PHP

В моем случае я просто обрабатываю заказы на задней панели (используя PHP), и у меня уже есть список всех ZIP-кодов всех складов моих поставщиков.

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

Любые идеи?

+0

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

ответ

5

Вам необходимо скачать Popular Data's ZIP code database.

С помощью этого калькулятора вы можете использовать следующую информацию.

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

Выше был украден из Adam Bellaire's answer in Calculating distance between zip codes in PHP. После выполнения этого расчета вы можете просто отсортировать результаты.

+0

Это просто обращается к численному порядку, который будет с довольно хорошей частотой хорошо соответствовать дальнему порядку. Однако это имеет некоторые серьезные ограничения. Главный, который приходит на ум, - это государственные границы (или, может быть, границы региона, в зависимости от того, как выкладываются почтовые индексы). Другими словами: это не решение, если его проблема не очень конкретна. Кроме того, этого глобального можно было бы избежать, либо закрытие простого небольшого класса. – Corbin

+0

Правильно, это неправильный подход. Он пытается упростить его. Он может сделать это с помощью только почтовых индексов (и без большого количества небольших бизнес-правил, ваш подход, скорее всего, лучший). В этом отношении ваш ответ хороший. Как я уже сказал, он пренебрегает даже упоминанием о том, что он ограничен по своей точности. – Corbin

+0

Это вполне разумно, если вещь ближайшего склада - это всего лишь эвристика, и ничего плохого не происходит, если что-то поставляется со второго ближайшего или третьего ближайшего склада. – Gravity

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