16

¿Existe un módulo Python en el que pueda crear objetos con una ubicación geográfica coordinada (latitud y longitud) y consultar todos los objetos que estén dentro de una distancia de 5 km (es decir, radio) una determinada coordenada?Módulo Python para almacenar y consultar coordenadas geográficas

He intentado almacenar la latitud y la longitud como claves en los diccionarios (ya que están indexadas por clave) y utilizar algunos algoritmos de búsqueda de distancia para consultarlas. Pero esto se siente como un truco horrible.

Esencialmente algo así como PostGIS para PostgreSQL, pero todo dentro de la memoria de mi aplicación Python.

Respuesta

16

Sí, intente geopy.

import geopy 
import geopy.distance 

pt1 = geopy.Point(48.853, 2.349) 
pt2 = geopy.Point(52.516, 13.378) 

dist = geopy.distance.distance(pt1, pt2).km 
# 878.25 

después se puede consultar sus listas de puntos:

[pt for pt in points if geopy.distance.distance(orig, pt).km < 5.] 
+0

Gracias por la respuesta. Me había saltado el goepy porque pensé que era completamente para geocodificar. Con el ejemplo de consulta, ¿no recorrerá todos los objetos en 'points'? Lo cual no es tan eficiente como la indexación de puntos PostGIS, tal vez el enfoque de la base de datos sería más eficiente. –

+0

@Jonathan - tienes razón, repetirá sobre toda la lista de puntos. No sé sobre ninguna posibilidad de indexación dentro de la geopy. Tal vez encuentres algo. – eumiro

5

Sé que esto no es exactamente lo que quería decir, pero se puede usar GeoDjango con una base de datos SQLite en memoria. Se trata de un conjunto completo de herramientas SIG expuestas como una aplicación web, que lo convierte en una navaja suiza para el rápido desarrollo de aplicaciones SIG, especialmente para pequeñas consultas ad hoc.

1

La idea de su diccionario no suena tan mal, aunque también deberá comprobar los puntos que se encuentran en las claves del diccionario "vecino".

Si no puede encontrar la herramienta adecuada, y como los algoritmos de codificación, puede implementar un árbol de partición de espacio binario que afaik es una forma menos hacky de lograr algo similar.

2

El enfoque habitual en GIS es crear un búfer alrededor del punto de interés y consultar la intersección. Como @RyanDalton sugiere, si planeas hacer muchas funciones de geolocalización, utiliza Shapely, la API GIS para Python. Es bueno saber acerca de Shapely, incluso si todavía desea un índice espacial (ver a continuación). Aquí es cómo crear memorias intermedias en bien proporcionado:

distance = 3 
center = Point(1, 1) 
pts = [Point(1.1, 1.2),Point(1.2,1.2)] 
center_buf = a.buffer(distance) 
#filters the points list according to whether they are contained in the list 
contained = filter(center_buf.contains,pts) 

Usted puede indexar sus puntos de ti mismo (digamos por longitud por ejemplo) si no tiene muchos. De lo contrario, también puede utilizar el paquete Rtree, consulte el enlace llamado Using Rtree as a cheapo spatial database.

1

Puede usar SQLite que tiene una extensión Rtree para hacer exactamente ese tipo de almacenamiento y consultas. Este enfoque es útil si sus datos son más grandes que la memoria que desea usar o si desea guardar y manipular datos entre ejecuciones del programa. El código de almacenamiento y consulta real está en C, lo que significa que debe compilarse, pero el beneficio es un rendimiento adicional en comparación con soluciones puras de Python como geopy. O bien pysqlite o APSW funcionarán para el acceso SQLite. (Divulgación: soy el autor de APSW)

Cuestiones relacionadas