2009-09-15 18 views
9

Estoy trabajando en una aplicación en la que uno de los requisitos es que pueda realizar operaciones de geocodificación inversa en tiempo real basadas en datos de GPS. En particular, debo ser capaz de determinar el estado/provincia a la que un par de latitud y longitud mapea y detecta cuando nos hemos movido de un estado/provincia a otro.Geocodificación inversa sin acceso web

Tengo un par de ideas hasta ahora, pero se preguntó si alguien tenía alguna idea en cualquiera de los siguientes:

  • ¿Cuál es el mejor enfoque para abordar este problema de una manera eficiente?
  • Dónde es un buen lugar para encontrar y lo que es el formato adecuado para los límites del estado/provincia de América del Norte

Como aperitivo, aquí están las dos ideas principales que tengo:

  1. rotura del Norte América en una grilla con cada rectángulo en el mapeo de la grilla a una provincia estatal particular. Haga una búsqueda en esta tabla (que crece rápidamente cuanto más preciso le gustaría ser) en función de la latitud y la longitud (o viceversa).
  2. Defina polígonos para cada uno de los estados y realice algún tipo de cálculo para determinar en qué polígono se encuentra un par lat/lon. No estoy seguro de cómo hacerlo exactamente. Los mapas de imágenes HTML vienen a la mente como una forma de definir los límites para un estado/provincia.

estoy trabajando en el pitón para el interesado o aquellos que podrían tener una buena biblioteca que les gustaría sugerir.

Para que quede claro ... No tiene acceso a Internet disponible para mí, así que usar un servicio de geocodificación inversa existente no es una opción en tiempo de ejecución

+0

Me encantaría saber más sobre cómo resolvió esto. ¿Dónde terminaste obteniendo los datos de límites? – radven

Respuesta

6

Sugiero usar una variante de su primera idea: use un spatial index. Un índice espacial es una estructura de datos construida a partir de rectángulos, mapeando lat/long a la carga útil. En este caso, probablemente asigne rectángulos a pares estado-provincia. Un R-tree puede ser una buena opción. Aquí hay un R-tree python package. Puede detectar el roaming comparando los resultados de búsquedas consecutivas.

+0

Aunque no pude usar el proyecto r-tree python para mi implementación usé algunas de las ideas detrás de r-tree en el sentido de que construí un índice espacial simple usando rectángulos de delimitación para cada uno de los estados. Después de determinar en qué recuadros delimitadores estaba el punto, utilicé una prueba de punto en un polígono para descubrir el resto ... ¡funciona muy bien! –

+0

Me alegra oír eso. No entendí que también necesitabas esta búsqueda de condados, para lo cual un algoritmo similar también debería funcionar, solo necesitas mucha más información. De todos modos, ten una itinerancia feliz. –

0

Tengo una base de datos con todos estos datos y algunos herramientas de acceso. Hice la mía de los datos del tigre del censo. Imagino que básicamente sería una exportación de mi base de datos a sqlite y un poco de traducción de código.

+0

¿Puedes compartir el db? ¿En qué formato está? – Moshe

+0

@Mosche Tengo uno por aquí en algún lugar en formato sqlite. Envíame un correo electrónico y veré lo que puedo hacer. – Dustin

4

Me mantendría alejado de implementar su propia solución desde cero. Esta es una empresa bastante grande y ya hay herramientas para hacer esto. Si está buscando un enfoque de código abierto (léase: gratis), eche un vistazo a esta publicación de blog: Using PostGIS to Reverse Geocode.

+0

Excelente idea! Este podría ser el camino a seguir si necesita resolver este tipo de problema en el escritorio. Desafortunadamente, y debería haber mencionado esto, me estoy ejecutando en una plataforma incrustada que no tiene soporte para Postgres (y no se puede portar fácilmente ya que no está integrado en Linux, aunque está basado en posix). Un derivado de Digi connectport es la plataforma: http://www.digi.com/products/wirelessdropinnetworking/idigi-kits/x4-zb.jsp –

1

Si puede obtener límites de estado como polígonos (por ejemplo, a través de OpenStreetMap), determinar el estado actual es solo una prueba de punto en polígono.

Si necesita datos de dirección, una solución fuera de línea sería usar Microsoft Mappoint.

1

Puede obtener datos de todo Estados Unidos desde open street map Luego puede extraer los datos que necesita, como ubicaciones de ciudades o estados, en el formato que mejor funcione para su aplicación. Tenga en cuenta que aunque la calidad de los datos es buena, no está garantizado que sea completamente precisa, por lo que si necesita una precisión completa, es posible que deba buscar en otro lugar.

4

creé un módulo de geocodificación inversa en línea para los países: https://bitbucket.org/richardpenman/reverse_geocode

>>> import reverse_geocode 
>>> coordinates = (-37.81, 144.96), (31.76, 35.21) 
>>> reverse_geocode.search(coordinates) 
[{'city': 'Melbourne', 'code': 'AU', 'country': 'Australia'}, 
{'city': 'Jerusalem', 'code': 'IL', 'country': 'Israel'}] 

voy a ver si puedo agregar datos para los estados.

+1

Gracias hoju, la herramienta es realmente increíble. ¡Y lo he buscado durante años! – zfz

+0

Me alegro de que haya sido útil para otras personas. Lo necesitaba para mis propios proyectos – hoju

+0

Hola, esto se ve increíble. No soy un desarrollador de Python, pero a veces incluyo scripts de Python dentro de mi Node.js. ¿Podría decirme qué versión de python espera su script? – Kunok

Cuestiones relacionadas