Эта страница предоставляет базу данных (в формате 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.