Auf dieser Seite finden Sie eine Datenbank (im csv-Format) mit allen Postleitzahlen in den USA sowie deren Längen- und Breitengraden. http://zips.sourceforge.net/
Die Datei ist 500k groß und wird entpackt. Hier sind die ersten paar Zeilen der Daten:
"35004", "AL", " 33.606379", " -86.50249", "Moody", "Alabama"
"35005", "AL", " 33.592585", " -86.95969", "Adamsville", "Alabama"
"35006", "AL", " 33.451714", " -87.23957", "Adger", "Alabama"
Speichern Sie diese Daten in einer lokalen Datenbank. Verwenden Sie die Haversinus-Formel, um Ihre Koordinaten mit denen in der Datenbank zu vergleichen und den nächstgelegenen Punkt zu finden. CoreLocation hat eine Funktion getDistanceFrom, die Sie ebenfalls verwenden können.
- (CLLocationDistance)getDistanceFrom:(const CLLocation *)location
Auf dieser Seite finden Sie eine Haversine-Funktion in c und Informationen über die Zips-Datenbank.
http://www.jaimerios.com/?p=39
Edita: Hier ist eine großartige Erklärung von Google über die Berechnung von Entfernungen. Sie verwendet MySQL und PHP, aber das SQL für die Suche nach nächstgelegenen Punkten ist auch hier nützlich. Es wäre wahrscheinlich schneller, eine Abfrage mit SQL zu machen, als mit der Funktion getDistanceFrom.
http://code.google.com/support/bin/answer.py?answer=87134&topic=11364
Finden Sie die 20 nächstgelegenen Orte in einem Umkreis von 25 Meilen um die Koordinate 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;
Um nach Kilometern statt nach Meilen zu suchen, ersetzen Sie 3959 durch 6371.