Question

Dire que j'ai une API de service Web qui accepte un code postal comme paramètre, mais je n'ai accès à un coordonnées GPS (latitude, longitude). Comment puis-je rechercher dynamiquement le code postal que la coordonnée appartient?

Je fais ce travail sur l'iPhone, donc je l'espère, il y a un moyen simple de le faire dans les API CoreLocation que je suis donnant dans la documentation.

Était-ce utile?

La solution

Je vais essayer de vérifier les documents pour le géocodage inverse dans le SDK 3.0 si je vous étais. Je ne peux pas dire ce qui est là, mais vous pourriez, par exemple, constater que le géocodage inverse retourne un Placemark, et puis si vous regardez que dans le SDK Placemark, vous pourriez trouver qu'il a une propriété unique code postal. Qui sait?

Autres conseils

Cette page fournit une base de données (csv) de tous les codes postaux aux États-Unis, avec leur latitude et la longitude. http://zips.sourceforge.net/

Le fichier est décompressé 500k. Voici les premières lignes de données:

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

Dump ces données dans une base de données locale. Utilisez la formule Haversine pour comparer vos coordonnées et celles de la base de données pour trouver le point le plus proche. CoreLocation a une getDistanceFrom fonction que vous pouvez utiliser aussi.

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

Cette page a une fonction Haversine en c et informations sur la base de données zips.

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

Modifier Heres une grande explication de Google sur le calcul des distances. Il utilise MySQL et PHP, mais le SQL pour trouver des points les plus proches est également utile ici. Il serait probablement plus rapide à interroger en utilisant SQL, plutôt que la fonction getDistanceFrom.

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

Dans les plus proches de 20 emplacements qui se trouvent dans un rayon de 25 miles à 37, -122 coordonnées:

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; 

Pour effectuer une recherche par kilomètre au lieu de miles, remplacer 3959 par 6371.

Ce type de recherche est appelée "Reverse Géolocalisation".

La première chose que vous devez faire est de convertir les données lat / lng de l'objet CLOCATION à des degrés ...

dans la fonction LocationManager (qui est appelé une fois que vous recevez une mise à jour de l'emplacement) ....

Code:

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

De là, vous envoyez les chaînes lat et lng à un webservice back-end comme « GeoNames.org » ou API Google Maps ... et vous pouvez obtenir l'adresse de la ville ou dans la rue la plus proche.

Il y a une base de données produite par le recensement des États-Unis - la base de données Tiger. Je crois qu'il ya une possibilité de rechercher donnée code postal lat / long.

Je parie que si vous avez recherché Tiger code postal peut trouver quelque chose. voir ici par exemple. Il semble qu'il y ait un module Perl sur CPAN qui fait cela, il ne devrait pas être impossible.

Google propose un service gratuit inverse géocodage. Vous pouvez l'utiliser directement, ou essayez le SDK Temboo qui offre un accès pratique en plusieurs langues, y compris Objective C (avec des exemples de code).

Consultez https://www.temboo.com/library/Library / Google / géocodage / GeocodeByCoordinates /

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top