2008-09-22 3 views
12

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

Адреса в списке будут храниться в таблице базы данных. Отдельные части имеют отдельные поля (у нас есть поля для почтового индекса, название города и т. Д.), Поэтому он не просто гигантский varchar. Они введены пользователем и из-за характера системы не всегда могут быть полными (некоторые могут отсутствовать почтовый индекс, а другие могут иметь чуть больше города и штата).

Хотя это для приложения интрасети, у меня нет проблем с использованием внешних ресурсов, включая доступ к веб-службам Интернета и тому подобное. Я бы предпочел, чтобы это перевернуло мое собственное, если бы не было тривиально делать сам. Если Google или Yahoo! уже предоставляет бесплатный сервис, я более чем готов его проверить. Ключевое слово должно быть бесплатным, так как я не имею права вводить какие-либо дополнительные затраты на этот проект для этой функции, так как это уже бонус «перк», так сказать.

Я думаю об этом, как и многие кирпичные & минометные магазины выполняют функцию «Найти местоположение». Показывая его в простой таблице, отсортированной соответствующим образом и отображающей расстояние (в, скажем, мили), отлично. Показывать карту mash-up еще холоднее, но я определенно могу жить, просто получив дистанцию, и я обрабатываю все последующие отображения и сортировки.

Проблема с простыми алгоритмами расстояния - это характер данных. Поскольку все или часть адреса может быть неопределенным, у меня нет ничего удобного, например, лат/длинные координаты. Кроме того, даже если я делаю необходимые почтовые коды, 90% адресов, вероятно, будут иметь одинаковые пять почтовых кодов.

Хотя это не должно быть быстро, все, что занимает более семи секунд, чтобы отображаться на странице из-за латентности, может быть слишком большим, чтобы средний пользователь мог подождать, как мы знаем. Если такая гипотетическая служба поддерживает отправку пакета адресов одновременно, а не запрос по одному, это было бы здорово. Тем не менее, мне не следует думать, что список адресов превысил бы 50, если бы их было много.

ответ

10

Google и Yahoo! обе предоставляют услуги геокодирования бесплатно. Вы можете рассчитать расстояние, используя Haversine formula (implemented in .NET or SQL).Обе службы позволят вам выполнять частичный поиск (только почтовый индекс, только город) и сообщают вам, какова точность их результатов (чтобы вы могли исключать места без значимой информации, хотя Yahoo! предоставляет более точную информацию, чем Google).

+0

Я обязательно посмотрю на это. Мы уже, в рамках другой части этой же системы, ссылаемся на Yahoo! Карты, чтобы указать информацию о местоположении для произвольно введенных адресов. Но в этом случае мне не нужна какая-либо близость ... – 2008-09-22 18:02:25

+0

, пожалуйста, сообщите, какое решение вы использовали ... чтобы другие могли также извлечь выгоду из этого ... У меня также есть аналогичная проблема ... http: /stackoverflow.com/questions/7426710/how-to-find-the-distance-between-two-zipcodes-using-java-code – aProgrammer 2011-09-16 07:33:47

1

Не можете ли вы использовать API карт Google, чтобы получить расстояния и отсортировать их на вашей стороне?

http://code.google.com/apis/maps/

+0

Поскольку это не- public/intranet, мне нужно будет использовать API Google Maps Premier, который является несвободным. – 2009-06-08 21:00:05

0

Я предлагаю расследование Google Maps API.

Это потребует от вас внешнего подключения (и для того, чтобы оно было хорошо, чтобы шунтировать данные по нему в веб-службу), но оно обеспечивает то, что вам нужно, а именно расстояние, запросив маршрут между двумя точками и получить расстояние от него.

API reference of the directions API

0

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

В какой-то момент я натолкнулся на бесплатный почтовый индекс для таблицы поиска широты/долготы, чтобы использовать в этом приближении. Извините, у меня больше нет ссылки на это.

+0

Это было бы неплохо, если бы не тот факт, что почти все местоположения в их списке будут находиться внутри небольшого количества почтовых индексов (т. Е. Все в одной и той же зоне метро), и это не будет точным достаточно не думаю. Но все равно стоит посмотреть ... – 2008-09-22 17:59:11

4

API Карт Google не подходит для вас из-за условий их использования. Однако Yahoo предлагает услугу REST для преобразования адресов в координаты Long/Lat, которые затем можно использовать для расчета расстояний. Его here.

+0

+1 для обозначения суровых условий и условий Google ..... – aProgrammer 2011-09-23 06:02:03

0

Кто-то еще это сделал уже в Daft Logic (править: опечатка). Они используют API Карт Google с помощью Great-circle formula. Я не думаю, что это сложно реализовать.

Обновление: Вам нужно всего лишь получить координаты от вашего любимого провайдера, а затем выполнить расчет с помощью вашего кода. Вы можете предварительно загружать координаты магазинов, когда пользователи предоставляют свое местоположение, - вы можете даже использовать это для проверки. Затем, когда запрос сделан, вы можете искать местоположение клиента.

2

Требовать от них ввести почтовый индекс, а затем создать таблицу базы данных, отображающую почтовый индекс на пары широты/долготы (или найти один онлайн). Я не знаю, как там, где вы работаете, но здесь, почтовый индекс может быть конкретным для нескольких метров, поэтому это должно быть достаточно точным. Затем используйте этот метод для вычисления расстояния между двумя кодами ZIP:

public static double distance(double lat1, double lon1, double lat2, double lon2, char unit) 
{ 
    double theta = lon1 - lon2; 
    double dist = Math.Sin(deg2rad(lat1)) * Math.Sin(deg2rad(lat2)) + 
    Math.Cos(deg2rad(lat1)) * Math.Cos(deg2rad(lat2)) * Math.Cos(deg2rad(theta)); 
    dist = Math.Acos(dist); 
    dist = rad2deg(dist); 
    dist = dist * 60 * 1.1515; 
    if (unit == 'K') 
    { 
    dist = dist * 1.609344; 
    } 
    else if (unit == 'N') 
    { 
    dist = dist * 0.8684; 
    } 
    return (dist); 
} 

private static double deg2rad(double deg) 
{ 
    return (deg * Math.PI/180.0); 
} 

private static double rad2deg(double rad) 
{ 
    return (rad/Math.PI * 180.0); 
} 

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

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