2009-05-28 11 views
15

Powiedz, że mam interfejs API usług internetowych, który akceptuje kod pocztowy jako parametr, ale mam dostęp tylko do współrzędnych GPS (szerokość i długość geograficzna). Jak mogę dynamicznie wyszukać kod pocztowy, do którego należy ta współrzędna?Jak wyszukać kod pocztowy ze współrzędnej GPS?

Wykonuję tę pracę na iPhonie, więc mam nadzieję, że jest prosty sposób, aby to zrobić w interfejsach API CoreLocation, których nie ma w dokumentacji.

+0

wątpię, by go znaleźć w CoreLocation, ale warto spróbować ... to będzie interesujące zobaczyć, czy jest – hhafez

Odpowiedz

6

Próbowałbym sprawdzić dokumentację dla odwrotnego geokodera w pakiecie 3.0 SDK, gdybym był tobą.Nie mogę powiedzieć, co tam jest, ale możesz, powiedzmy, odkryć, że odwrotny geokod zwróci obiekt PlaceMark, a jeśli spojrzysz na to miejsce w zestawie SDK, może się okazać, że ma właściwość kodu pocztowego. Kto wie?

+0

Jeśli chodzi o MapKit Framework, pamiętaj, że używa on interfejsu Google Maps API i wymaga zgodności z Google TOS – jottos

0

Ten rodzaj wyszukiwania nazywa się "Reverse Geolocation".

Pierwszą rzeczą, którą musisz zrobić, to przekonwertować dane szer/LNG z CLocation obiektu do stopni ...

w funkcji locationManager (który nazywa się po odebraniu aktualizacji lokalizacji) ....

Kod:

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

Stamtąd wysłać LAT i lNG ciągi usługa backend jak „geonames.org” lub Google Maps API ... i można uzyskać pod najbliższym adresem miasta lub ulicy.

0

Istnieje baza danych stworzona przez US Census - bazę danych Tiger. Wierzę, że istnieje możliwość sprawdzenia kodu pocztowego podanego jako długi/długi.

Założę się, że jeśli szukasz Tiger zipcode, możesz coś znaleźć. patrz na przykład here. Wygląda na to, że w CPAN jest moduł Perla, który to robi, więc nie powinno być niemożliwe.

15

Ta strona zawiera bazę danych (w csv) wszystkich kodów pocztowych w USA, z ich szerokością i długością geograficzną. http://zips.sourceforge.net/

Plik jest rozpakowany 500k. Oto kilka pierwszych linii danych:

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

Zrzuć te dane do lokalnej bazy danych. Użyj wzoru Haversine, aby porównać swoje współrzędne i te w bazie danych, aby znaleźć najbliższy punkt. CoreLocation ma funkcję getDistanceFrom, z której możesz również skorzystać.

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

Ta strona zawiera funkcję Haversine w c oraz informacje o bazie zip.

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

Edit: Herezje doskonałym wyjaśnienie od Google o obliczaniu odległości. Używa MySQL i PHP, ale użyteczny jest tutaj także SQL do znajdowania najbliższych punktów. Prawdopodobnie szybciej będzie zapytać przy użyciu SQL, niż funkcji getDistanceFrom.

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

Znajdź najbliższe 20 miejsc, które znajdują się w promieniu 25 mil do 37, -122 współrzędnych:

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; 

Aby wyszukać według kilometrów zamiast mil zastąpić 3959 z 6371.

+0

To tylko daje odległość do najbliższego centrum obszar kodu pocztowego, nie poda kodu pocztowego, w którym znajduje się współrzędna, zgodnie z żądaniem PO. – user4815162342

+0

Obniżyłem to, ponieważ kody zip są dodawane i usuwane co miesiąc. Jeśli poważnie myślisz o dokładności wyszukiwania kodu zip, powinieneś kupić subskrypcję danych z kodu pocztowego i odświeżać swój zestaw danych co kilka miesięcy. Proces kontroli jakości powinien w szczególności uwzględniać, które kody * są * usuwane *, ponieważ możesz chcieć zaktualizować powiązane dane, aby odnosić się do kodów zip, które zastępują te, które zostały usunięte. –

Powiązane problemy