16665891 10211247083188500 2291386332147570222 o

Daniel Ancuta es un ingeniero de software con varios años de experiencia utilizando diferentes tecnologías. Es un gran fan de "El Zen de Python", que intenta aplicar no sólo en su código sino también en su vida privada. Puedes encontrarle en Twitter: @daniel_ancuta

Consultas geoespaciales: Uso de Python para buscar ciudades

La información de geolocalización se utiliza a diario en casi todos los aspectos de nuestra interacción con los ordenadores. Ya sea un sitio web que quiere enviarnos notificaciones personalizadas basadas en la ubicación, mapas que nos muestran la ruta más corta posible o simplemente tareas que se ejecutan en segundo plano y comprueban los lugares que hemos visitado.

Hoy me gustaría presentarles a consultas geoespaciales que se utilizan en Couchbase. Consultas geoespaciales permiten buscar documentos en función de su localización geográfica.

Juntos escribiremos una herramienta en Python que utilice consultas geoespaciales con API REST de Couchbase y Búsqueda de texto completo en Couchbaseque nos ayudará a buscar en una base de datos de ciudades.

Requisitos previos

Dependencias

En este artículo he utilizado Couchbase Edición Enterprise 5.1.0 build 5552 y Python 3.6.4.

Para ejecutar fragmentos de este artículo debe instalar Couchbase 2.3 (estoy usando 2.3.4) a través de pip.

Couchbase

  1. Crear un cubo de ciudades
  2. Cree una búsqueda de ciudades con un campo geográfico de tipo geopunto. Puede leer sobre ello en el Insertar un campo hijo parte de la documentación.

Debería parecerse a la imagen de abajo:

image 1

Rellenar Couchbase con datos

En primer lugar, necesitamos datos para nuestro ejercicio. Para ello, utilizaremos una base de datos de ciudades de geonames.org.

GeoNames contiene dos bases de datos principales: lista de ciudades y lista de códigos postales.

Todos están agrupados por países con la información correspondiente como nombre, coordenadas, población, zona horaria, código de país, etc. Ambos están en formato CSV.

Para este ejercicio, utilizaremos la lista de ciudades. He utilizado PL.zip pero siéntase libre de elegir el que prefiera del lista de ciudades.

Modelo de datos

La clase City será nuestra representación de una única ciudad que utilizaremos en toda la aplicación. Al encapsularla en un modelo, unificamos la API y no necesitamos depender de fuentes de datos de terceros (por ejemplo, un archivo CSV) que podrían cambiar.

La mayoría de nuestros fragmentos se encuentran (hasta que se diga lo contrario) en el archivo core.py. Así que recuerda actualizarlo (especialmente cuando añadas nuevas importaciones) y no anular todo el contenido.

 

Iterador CSV para procesar ciudades

Como ya tenemos una clase modelo, es hora de preparar un iterador que nos ayude a leer las ciudades del fichero CSV.

Insertar ciudades en el bucket de Couchbase

Hemos unificado la forma de representar una ciudad, y tenemos un iterador que leería las del archivo csv.

Es hora de poner estos datos en nuestra fuente de datos principal, Couchbase.

 

Para comprobar si todo lo que hemos escrito hasta ahora funciona, vamos a cargar contenido CSV en Couchbase.

 

En este punto deberías tener las ciudades cargadas en tu bucket de Couchbase. El tiempo que tarde dependerá del país que haya elegido.

Buscar ciudades

Ya tenemos nuestro bucket listo con los datos, así que es hora de volver a CitiesService y preparar unos cuantos métodos que nos ayuden en la búsqueda de ciudades.

Pero antes de empezar, tenemos que modificar ligeramente la clase City, añadiendo el siguiente método:

Esa es la lista de métodos que implementaremos en CitiesService:

  • get_by_name(name, limit=10), devuelve las ciudades por su nombre
  • get_by_coordinates(lat, lon), devuelve la ciudad por coordenadas
  • get_nearest_to_city(ciudad, distancia='10', unidad='km', limit=10), devuelve la ciudad más cercana

get_by_name

 

get_by_coordinates

 

get_nearest_to_city

Como podrás notar en este ejemplo, usamos las clases RawQuery y SortRaw. Lamentablemente, la API couchbase-python-client no funciona correctamente con las nuevas búsquedas de Couchbase y geo.

Métodos de llamada

Como ya tenemos todos los métodos listos, ¡podemos llamarlo!

¿Qué hacer a partir de ahora?

Creo que esta introducción le permitirá trabajar en algo más avanzado.

Hay algunas cosas que puedes hacer:

  • Tal vez utilizar una herramienta CLI o REST API para servir estos datos... Mejorar la forma en que cargamos los datos, ya que podría no ser super performante si queremos cargar TODAS las ciudades de TODOS los países.

Puedes encontrar el código completo de core.py en gist github.

Si tienes alguna pregunta, no dudes en tuitearme @daniel_ancuta.

 

Este post forma parte del Programa de escritura comunitaria

Autor

Publicado por Laura Czajkowski, Directora de la Comunidad de Desarrolladores, Couchbase

Laura Czajkowski es la Snr. Developer Community Manager en Couchbase supervisando la comunidad. Es responsable de nuestro boletín mensual para desarrolladores.

Dejar una respuesta