Учитывая координаты, как мне получить все почтовые индексы в радиусе 10 миль? - PullRequest
9 голосов
/ 16 ноября 2010

У меня есть местоположение (широта и долгота). Как я могу получить список почтовых индексов, которые частично или полностью находятся в радиусе 10 миль от моего местоположения?

Решением может быть обращение к известному веб-сервису (карты Google, карты Bing и т. Д.) Или решение для локальной базы данных (клиент имеет SQL Server 2005) или алгоритм.

Я видел несколько похожий вопрос , но все ответы там в значительной степени касаются использования географии SQL Server 2008, которая мне недоступна.

Ответы [ 3 ]

10 голосов
/ 18 ноября 2010

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

http://www.zipcodedownload.com/Products/Product/Z5Commercial/Standard/Overview/

Чтобы получить расстояние между широтой и долготой, вам понадобится хорошее расстояниеформула.У этого сайта есть пара вариантов:

http://www.meridianworlddata.com/distance-calculation/

Формула "Великого окружного расстояния" немного экстремальна.По моему опыту это работает достаточно хорошо:

sqrt(x * x + y * y)

where x = 69.1 * (lat2 - lat1)
and y = 69.1 * (lon2 - lon1) * cos(lat1/57.3)

Ваш SQL-запрос будет выглядеть примерно так:

select zd.ZipCode
from ZipData zd
where 
    sqrt(
        square(69.1 * (zd.Latitude - @Latitude)) +
        square(69.1 * (zd.Longitude - @Longitude) * cos(@Latitude/57.3))
    ) < @Distance

Удачи!

5 голосов
/ 16 ноября 2010

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

Во-вторых, если вы знаете, где вы находитесь, и знаете радиус, который вы ищете, вы можете посмотреть все почтовые индексы, попадающие в этот радиус. Что-то простое, написанное на PHP, будет выглядеть следующим образом: (извините, это не на C #)

function distanceFromTo($latitude1,$longitude1,$latitude2,$longitude2,$km){
  $latitude1  = deg2rad($latitude1);
  $longitude1 = deg2rad($longitude1);
  $latitude2  = deg2rad($latitude2);
  $longitude2 = deg2rad($longitude2);
  $delta_latitude  = $latitude2  - $latitude1;
  $delta_longitude = $longitude2 - $longitude1;
  $temp = pow(sin($delta_latitude/2.0),2) + cos($latitude1) * cos($latitude2) * pow(sin($delta_longitude/2.0),2);
  $earth_radius = 3956;
  $distance = $earth_radius * 2 * atan2(sqrt($temp),sqrt(1-$temp));
  if ($km)
    $distance = $distance * 1.609344;
  return $distance;
}
5 голосов
/ 16 ноября 2010

Большинство поисковых запросов работают с центроидами. Чтобы работать с частичными почтовыми индексами, находящимися в пределах 10 миль, вам придется купить базу данных полигонов почтовых индексов (*). Затем реализуйте алгоритм, который проверяет наличие почтовых индексов с вершинами в радиусе 10 миль. Чтобы сделать это правильно, вы должны использовать формулу Haversine для измерения расстояния. С некоторыми умными структурами данных вы можете значительно сократить пространство поиска. Аналогично, поиск может быть значительно ускорен путем сохранения и первоначального сравнения с экстентами zipcoe (север, запад, восток, юг).

(*) Примечание. Технически почтовые индексы НЕ являются полигонами! Я знаю, что мы все так думаем о них, но на самом деле они представляют собой наборы точек данных (уличные адреса), и именно так их использует USPS. Это означает, что почтовые индексы могут включать другие почтовые индексы; почтовые индексы могут быть сделаны из нескольких «многоугольников»; и почтовые индексы могут перекрывать другие почтовые индексы. Большинство из этих ситуаций не должно быть проблемой, но вам придется обрабатывать почтовые индексы, которые могут быть определены как несколько полигонов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...