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

StackOverflow https://stackoverflow.com/questions/115850

  •  02-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

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

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

API-ссылка API направлений

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top