2009-05-28 20 views
15

Supongamos que tengo una API de servicio web que acepta un código postal como parámetro, pero solo tengo acceso a una coordenada GPS (latitud, longitud). ¿Cómo puedo buscar dinámicamente el código postal al que pertenece la coordenada?¿Cómo buscar un código postal desde una coordenada de GPS?

Estoy haciendo este trabajo en el iPhone, así que espero que haya una manera simple de hacerlo en las API de CoreLocation que tengo en cuenta en la documentación.

+0

dudo que encontrarlo en CoreLocation, pero vale la pena intentarlo ... será interesante ver si es – hhafez

Respuesta

6

Intentaría consultar los documentos del geocodificador inverso en el SDK 3.0 si fuera usted.No puedo decir qué hay allí, pero podría, por ejemplo, encontrar que el geocodálogo inverso devuelve un placeMark, y luego, si busca ese lugar en el SDK, puede encontrar que tiene una propiedad de código postal. ¿Quién sabe?

+0

Si nos referimos a MapKit Framework, tenga en cuenta que utiliza la API de Google Maps y que requiere que se adhiera a los TOS de Google. – jottos

0

Este tipo de búsqueda se denomina "Geolocalización inversa".

Lo primero que hay que hacer es convertir los datos LAT/LNG desde CLOCATION objeto a grados ...

en la función locationManager (que se llama una vez que reciba una actualización de posición) ....

Código:

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

Desde allí se puede enviar las cadenas de lat y lng a un servicio web de back-end como "GeoNames.org" o API de Google Maps ... y se puede obtener la dirección de la ciudad o calle más cercana.

0

Hay una base de datos producida por el Censo de EE. UU. - la base de datos Tiger. Creo que hay una posibilidad de buscar código postal dado lat/long.

Apuesto a que si buscó Tiger zipcode, podría encontrar algo. ver here por ejemplo. Parece que hay un módulo Perl en CPAN que hace esto, por lo que no debería ser imposible.

15

Esta página proporciona una base de datos (en csv) de todos los códigos postales de los EE. UU., Con su latitud y longitud. http://zips.sourceforge.net/

El archivo está 500k desempacado. Aquí están las primeras líneas de datos:

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

Vuelque esta información en una base de datos local. Use la fórmula de Haversine para comparar sus coordenadas y las de la base de datos para encontrar el punto más cercano. CoreLocation tiene una función getDistanceFrom que también puede usar.

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

Esta página tiene una función Haversine en c e información sobre la base de datos de cremalleras.

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

Editar: Heres una gran explicación de Google sobre el cálculo de distancias. Utiliza MySQL y PHP, pero el SQL para encontrar los puntos más cercanos también es útil aquí. Probablemente sea más rápido realizar consultas usando SQL, en lugar de la función getDistanceFrom.

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

Encuentra los 20 lugares más cercanos que se encuentran dentro de un radio de 25 millas al 37, -122 coordenadas:

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; 

Para buscar por kilómetros en lugar de millas, reemplace 3959 con 6371.

+0

Esto sólo le dará la distancia al centro más cercano de un área de código postal, no le indicará en qué código postal está realmente la coordenada, como solicitó el OP. – user4815162342

+0

Bajé la votación porque los códigos postales se agregan y eliminan cada mes. Si se toma en serio la precisión de la búsqueda del código postal, debe comprar una suscripción a los datos del código postal y actualizar su conjunto de datos cada pocos meses. Su proceso de control de calidad debe incluir, en particular, la indicación de los códigos postales * eliminados *, ya que es posible que desee actualizar los datos relacionados para hacer referencia a los códigos postales que reemplazan los que se eliminan. –

Cuestiones relacionadas