Какие существуют существующие службы для расчета расстояния между двумя адресами? - PullRequest
12 голосов
/ 22 сентября 2008

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

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

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

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

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

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

Ответы [ 8 ]

10 голосов
/ 22 сентября 2008

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

4 голосов
/ 22 сентября 2008

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

2 голосов
/ 22 сентября 2008

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

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);
}

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

1 голос
/ 22 сентября 2008

Разве вы не можете просто использовать API Google Maps для определения расстояний и сортировки их на своей стороне?

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

0 голосов
/ 22 сентября 2008

Проверить этот сайт: http://geocoder.us/help/utility.shtml

Вы можете обрабатывать записи 1 раз в 15 секунд следующим образом: http://geocoder.us/service/distance?zip1=95472&zip2=94305

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

0 голосов
/ 22 сентября 2008

Кто-то уже сделал это уже на Daft Logic (правка: опечатка). Они используют Google Maps API с формулой большого круга . Я не думаю, что это сложно реализовать.

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

0 голосов
/ 22 сентября 2008

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

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

0 голосов
/ 22 сентября 2008

Я бы предложил изучить API карт Google.

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

Справочник API направлений API

...