Как найти 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/