Как найти почтовый индекс из GPS-координаты? - PullRequest
15 голосов
/ 28 мая 2009

Скажем, у меня есть API веб-сервиса, который принимает почтовый индекс в качестве параметра, но у меня есть доступ только к GPS-координате (широта, долгота). Как я могу динамически искать почтовый индекс, которому принадлежит координата?

Я делаю эту работу на iPhone, так что, надеюсь, есть простой способ сделать это с помощью API CoreLocation, который я пропускаю в документации.

Ответы [ 5 ]

15 голосов
/ 28 мая 2009

Эта страница предоставляет базу данных (в формате csv) всех почтовых индексов в США с указанием их широты и долготы. http://zips.sourceforge.net/

Файл 500к распакован. Вот первые несколько строк данных:

"35004", "AL", " 33.606379", " -86.50249", "Moody", "Alabama"
"35005", "AL", " 33.592585", " -86.95969", "Adamsville", "Alabama"
"35006", "AL", " 33.451714", " -87.23957", "Adger", "Alabama"

Вывести эти данные в локальную базу данных. Используйте формулу Haversine, чтобы сравнить ваши координаты и координаты в базе данных, чтобы найти ближайшую точку. В CoreLocation есть функция getDistanceFrom, которую вы тоже можете использовать.

- (CLLocationDistance)getDistanceFrom:(const CLLocation *)location

Эта страница имеет функцию Haversine в c и информацию о базе данных zips.

http://www.jaimerios.com/?p=39

Редактировать: Вот отличное объяснение от Google по поводу расчета расстояний. Он использует MySQL и PHP, но здесь также полезен SQL для поиска ближайших точек. Вероятно, было бы быстрее выполнять запросы с использованием SQL, а не функции getDistanceFrom.

http://code.google.com/support/bin/answer.py?answer=87134&topic=11364

Найдите 20 ближайших местоположений в радиусе 25 миль от координаты 37, -122:

SELECT id, ( 3959 * acos( cos( radians(37) ) 
 * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) 
 + sin( radians(37) ) * sin( radians( lat ) ) ) ) 
 AS distance FROM markers HAVING distance < 25 
 ORDER BY distance LIMIT 0 , 20; 

Для поиска по километрам вместо миль замените 3959 на 6371.

6 голосов
/ 28 мая 2009

Я бы попробовал проверить документы для обратного геокодера в 3.0 SDK на вашем месте. Я не могу сказать, что там, но вы можете, скажем, обнаружить, что обратный геокод возвращает placeMark, а затем, если вы посмотрите этот placeMark в SDK, вы можете обнаружить, что он имеет свойство почтового индекса. Кто знает?

0 голосов
/ 17 апреля 2013

Google предлагает бесплатный сервис обратного геокодирования. Вы можете использовать его напрямую или попробовать Temboo SDK, который предлагает удобный доступ на нескольких языках, включая Objective C (с примерами кода).

Выезд https://www.temboo.com/library/Library/Google/Geocoding/GeocodeByCoordinates/

0 голосов
/ 28 мая 2009

Существует база данных, созданная переписью США - база данных Tiger. Я полагаю, что есть возможность искать почтовый индекс по широте / долготе.

Бьюсь об заклад, если вы искали Почтовый индекс тигра , вы можете найти что-нибудь. см. здесь например. Похоже, в CPAN есть модуль Perl, который делает это, поэтому это не должно быть невозможным.

0 голосов
/ 28 мая 2009

Этот вид поиска называется «Обратное геолокация».

Первое, что вам нужно сделать, - это преобразовать данные широты / долготы из объекта CLocation в градусы ...

в функции locationManager (которая вызывается при получении обновления местоположения) ....

Код:

[lat stringWithFormat:@"%+.6f", myLocation.coordinate.latitude];
[lng stringWithFormat:@"%+.6f", myLocation.coordinate.longitude];

Оттуда вы отправляете строки lat и lng внутреннему веб-сервису, например «GeoNames.org» или API Карт Google ... и вы можете получить адрес ближайшего города или улицы.

...