Как найти zipcode из координаты GPS?

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

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

Ответы

Ответ 1

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

Ответ 2

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

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

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

Сбросьте эти данные в локальную базу данных. Используйте формулу Хаверсина для сравнения ваших координат и данных в базе данных, чтобы найти ближайшую точку. 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.

Ответ 3

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

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

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

код:

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

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

Ответ 4

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

Готов поспорить, если вы искали Tip zipcode, вы могли бы что-то найти. см. здесь. Кажется, есть модуль Perl на CPAN, который делает это, поэтому это не должно быть невозможно.

Ответ 5

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

Отъезд https://www.temboo.com/library/Library/Google/Geocoding/GeocodeByCoordinates/