Найти магазины по местоположению - PullRequest
2 голосов
/ 16 февраля 2010

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

Я планирую использовать API Карт Google для поиска геокода введенного местоположения и использовать теорему Пифагора для вычисления расстояния от каждого местоположенияи отсортировать список по расстояниям и вернуть результат (или, может быть, верхние 5 из набора результатов ...).

Это правильный способ сделать это?Есть ли более оптимальный метод или функция, встроенная в API Карт Google, которая сделает это?Поскольку это что-то настолько распространенное, я бы предположил, что оно было опробовано и проверено многими способами, и, вероятно, есть несколько правильных ответов.Я просто ищу совет, если я поступлю правильно.

Спасибо.

Ответы [ 2 ]

3 голосов
/ 16 февраля 2010

Теорема Пифагора будет недостаточной. Кривая Земли делает это так. Требуется немного евклидовой геометрии. Формула и простая реализация для определения расстояния между двумя точками на Земле - по мере того, как птица летит, а не фактическое расстояние перемещения - составляет (в PHP):

// pass the latitudes and longitudes in as degrees
function getDistance($lat1,$long1,$lat2,$long2)
{
    $r = 3963.1; //3963.1 statute miles; 3443.9 nautical miles; 6378 km
    $pi = pi();

    // convert the degrees to radians
    $lat1 = $lat1*($pi/180);
    $lat2 = $lat2*($pi/180);
    $long1 = $long1*($pi/180);
    $long2 = $long2*($pi/180);

    $ret = (acos(cos($lat1)*cos($long1)*cos($lat2)*cos($long2) + cos($lat1)*sin($long1)*cos($lat2)*sin($long2) + sin($lat1)*sin($lat2)) * $r) ;
    return $ret;
}

Вы можете включить версию этого в свой код. Кроме того, здесь приведена возможная (не проверенная) функция, являющаяся производной от другой, которую я использовал для MySQL.

DELIMITER $$

DROP FUNCTION IF EXISTS `FindDist` $$
CREATE FUNCTION `FindDist` (lt1 DOUBLE,lg1 DOUBLE,lt2 DOUBLE,lg2 DOUBLE) RETURNS DOUBLE
DETERMINISTIC
BEGIN
    DECLARE dist,eradius DOUBLE;

    SET eradius=3963.1;
    SET dist=Acos(Cos(lt1) * Cos(lg1) * Cos(lt2) * Cos(lg2) + Cos(lt1) * Sin(lg1) * Cos(lt2) * Sin(lg2) + Sin(lt1) * Sin(lt2)) * eradius;
    RETURN dist;
END $$

DELIMITER ;
1 голос
/ 16 февраля 2010

Я нашел эту ссылку некоторое время назад, когда исследовал нечто подобное.Он использует .NET, но принципы будут применяться к любому языку / структуре.

Локатор магазина: помогите клиентам найти вас с помощью Google Maps

Ключевой частью решения является использование Haversine Formul a, чтобы найти расстояние между двумя точками, указанными как долгота и широта.Реализация этой формулы на C # связана с приведенной выше статьей:

Расстояние между точками с использованием широты и долготы (CodeProject)

Aнемного больше рутинга:

Рассчитать расстояние между двумя точками на глобусе на 9 разных языках

...