Подтвердить что ты не робот

Какие существуют существующие службы для расчета расстояния между двумя адресами?

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

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

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

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.

Ответ 4

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

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

Ответ 5

Я бы предложил исследовать API карт google.

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

Ссылка API API-интерфейсов

Ответ 6

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

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

Ответ 7

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

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