{"id":4864,"date":"2018-03-22T06:37:43","date_gmt":"2018-03-22T13:37:43","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=4864"},"modified":"2025-06-13T23:43:11","modified_gmt":"2025-06-14T06:43:11","slug":"geospatial-queries-using-python-search-cities","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/geospatial-queries-using-python-search-cities\/","title":{"rendered":"Consultas geoespaciales: Uso de Python para buscar ciudades"},"content":{"rendered":"<h3><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4863\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/03\/16665891_10211247083188500_2291386332147570222_o.jpg\" alt=\"16665891 10211247083188500 2291386332147570222 o\" width=\"247\" height=\"247\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/16665891_10211247083188500_2291386332147570222_o.jpg 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/16665891_10211247083188500_2291386332147570222_o-300x300.jpg 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/16665891_10211247083188500_2291386332147570222_o-1024x1024.jpg 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/16665891_10211247083188500_2291386332147570222_o-150x150.jpg 150w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/16665891_10211247083188500_2291386332147570222_o-768x768.jpg 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/16665891_10211247083188500_2291386332147570222_o-65x65.jpg 65w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/16665891_10211247083188500_2291386332147570222_o-50x50.jpg 50w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/16665891_10211247083188500_2291386332147570222_o-20x20.jpg 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/16665891_10211247083188500_2291386332147570222_o-1320x1320.jpg 1320w\" sizes=\"auto, (max-width: 247px) 100vw, 247px\" \/><\/h3>\n<p>Daniel Ancuta es un ingeniero de software con varios a\u00f1os de experiencia utilizando diferentes tecnolog\u00edas. Es un gran fan de \"El Zen de Python\", que intenta aplicar no s\u00f3lo en su c\u00f3digo sino tambi\u00e9n en su vida privada. Puedes encontrarle en Twitter: <u><a href=\"https:\/\/twitter.com\/daniel_ancuta\" target=\"_blank\" rel=\"noopener noreferrer\">@daniel_ancuta<\/a><\/u><\/p>\n<h2><strong>Consultas geoespaciales: Uso de Python para buscar ciudades<\/strong><\/h2>\n<p>La informaci\u00f3n de geolocalizaci\u00f3n se utiliza a diario en casi todos los aspectos de nuestra interacci\u00f3n con los ordenadores. Ya sea un sitio web que quiere enviarnos notificaciones personalizadas basadas en la ubicaci\u00f3n, mapas que nos muestran la ruta m\u00e1s corta posible o simplemente tareas que se ejecutan en segundo plano y comprueban los lugares que hemos visitado.<\/p>\n<p>Hoy me gustar\u00eda presentarles a <u><a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/5.1\/fts\/fts-geospatial-queries.html\" target=\"_blank\" rel=\"noopener noreferrer\">consultas geoespaciales<\/a><\/u>\u00a0que se utilizan en Couchbase. <u><a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/5.1\/fts\/fts-geospatial-queries.html\" target=\"_blank\" rel=\"noopener noreferrer\">Consultas geoespaciales<\/a><\/u>\u00a0permiten buscar documentos en funci\u00f3n de su localizaci\u00f3n geogr\u00e1fica.<\/p>\n<p>Juntos escribiremos una herramienta en Python que utilice <u><a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/5.1\/fts\/fts-geospatial-queries.html\" target=\"_blank\" rel=\"noopener noreferrer\">consultas geoespaciales<\/a><\/u>\u00a0con <u><a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/fts\/fts-query-types.html\" target=\"_blank\" rel=\"noopener noreferrer\">API REST de Couchbase<\/a><\/u>\u00a0y <u><a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/fts\/full-text-intro.html\" target=\"_blank\" rel=\"noopener noreferrer\">B\u00fasqueda de texto completo en Couchbase<\/a><\/u>que nos ayudar\u00e1 a buscar en una base de datos de ciudades.<\/p>\n<h2><strong>Requisitos previos<\/strong><\/h2>\n<h3><strong>Dependencias<\/strong><\/h3>\n<p>En este art\u00edculo he utilizado <a href=\"https:\/\/www.couchbase.com\/blog\/es\/downloads\/\">Couchbase Edici\u00f3n Enterprise<\/a> 5.1.0 build 5552 y <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/sdk\/python\/start-using-sdk.html\">Python<\/a> 3.6.4.<\/p>\n<p>Para ejecutar fragmentos de este art\u00edculo debe instalar Couchbase 2.3 (estoy usando 2.3.4) a trav\u00e9s de pip.<\/p>\n<h3><strong>Couchbase<\/strong><\/h3>\n<ol>\n<li>Crear un cubo de ciudades<\/li>\n<li>Cree una b\u00fasqueda de ciudades con un campo geogr\u00e1fico de tipo geopunto. Puede leer sobre ello en el <u><a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/5.1\/fts\/fts-creating-indexes.html\" target=\"_blank\" rel=\"noopener noreferrer\">Insertar un campo hijo<\/a><\/u>\u00a0parte de la documentaci\u00f3n.<\/li>\n<\/ol>\n<p>Deber\u00eda parecerse a la imagen de abajo:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"1600\" height=\"1244\" class=\"wp-image-4862\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/03\/image_1.png\" alt=\"image 1\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/image_1.png 1600w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/image_1-300x233.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/image_1-1024x796.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/image_1-768x597.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/image_1-1536x1194.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/image_1-20x16.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/image_1-1320x1026.png 1320w\" sizes=\"auto, (max-width: 1600px) 100vw, 1600px\" \/><\/p>\n<h2><strong>Rellenar Couchbase con datos<\/strong><\/h2>\n<p>En primer lugar, necesitamos datos para nuestro ejercicio. Para ello, utilizaremos una base de datos de ciudades de <u><a href=\"https:\/\/www.geonames.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">geonames.org<\/a><\/u>.<\/p>\n<p>GeoNames contiene dos bases de datos principales: lista de ciudades y lista de c\u00f3digos postales.<\/p>\n<p>Todos est\u00e1n agrupados por pa\u00edses con la informaci\u00f3n correspondiente como nombre, coordenadas, poblaci\u00f3n, zona horaria, c\u00f3digo de pa\u00eds, etc. Ambos est\u00e1n en formato CSV.<\/p>\n<p>Para este ejercicio, utilizaremos la lista de ciudades. He utilizado <u><a href=\"https:\/\/download.geonames.org\/export\/dump\/PL.zip\" target=\"_blank\" rel=\"noopener noreferrer\">PL.zip<\/a><\/u>\u00a0pero si\u00e9ntase libre de elegir el que prefiera del <u><a href=\"https:\/\/download.geonames.org\/export\/dump\/\" target=\"_blank\" rel=\"noopener noreferrer\">lista de ciudades<\/a><\/u>.<\/p>\n<h3><strong>Modelo de datos<\/strong><\/h3>\n<p>La clase City ser\u00e1 nuestra representaci\u00f3n de una \u00fanica ciudad que utilizaremos en toda la aplicaci\u00f3n. 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\u00edan cambiar.<\/p>\n<p>La mayor\u00eda de nuestros fragmentos se encuentran (hasta que se diga lo contrario) en el archivo core.py. As\u00ed que recuerda actualizarlo (especialmente cuando a\u00f1adas nuevas importaciones) y no anular todo el contenido.<\/p>\n<pre class=\"lang:default decode:true\"># core.py\r\nclass City:\r\n   def __init__(self, geonameid, feature_class, name, population, lat, lon):\r\n       self.geonameid = geonameid\r\n       self.feature_class = feature_class\r\n       self.name = name\r\n       self.population = population\r\n       self.lat = lat\r\n       self.lon = lon\r\n\r\n   @classmethod\r\n   def from_csv_row(cls, row):\r\n       return cls(row[0], row[7], row[1], row[12], row[4], row[5])<\/pre>\n<p>&nbsp;<\/p>\n<h3><strong>Iterador CSV para procesar ciudades<\/strong><\/h3>\n<p>Como ya tenemos una clase modelo, es hora de preparar un iterador que nos ayude a leer las ciudades del fichero CSV.<\/p>\n<pre class=\"lang:default decode:true\"># core.py\r\nimport csv\r\nfrom collections import Iterator\r\n\r\nclass CitiesCsvIterator(Iterator):\r\n   def __init__(self, path):\r\n       self._path = path\r\n       self._fp = None\r\n       self._csv_reader = None\r\n\r\n   def __enter__(self):\r\n       self._fp = open(self._path, 'r')\r\n       self._csv_reader = csv.reader(self._fp, delimiter='\\t')\r\n\r\n       return self\r\n\r\n   def __exit__(self, exc_type, exc_val, exc_tb):\r\n       self._fp.close()\r\n\r\n   def __next__(self):\r\n       return City.from_csv_row(next(self._csv_reader))\r\n<\/pre>\n<h3><strong>Insertar ciudades en el bucket de Couchbase<\/strong><\/h3>\n<p>Hemos unificado la forma de representar una ciudad, y tenemos un iterador que leer\u00eda las del archivo csv.<\/p>\n<p>Es hora de poner estos datos en nuestra fuente de datos principal, <u><a href=\"https:\/\/www.couchbase.com\/blog\/es\/\" target=\"_blank\" rel=\"noopener noreferrer\">Couchbase<\/a><\/u>.<\/p>\n<pre class=\"lang:default decode:true\"># core.py\r\nimport logging\r\nimport sys\r\nfrom couchbase.cluster import Cluster, PasswordAuthenticator\r\n\r\n\r\nlogger = logging.getLogger()\r\nlogger.setLevel(logging.DEBUG)\r\nlogger.addHandler(logging.StreamHandler(sys.stdout))\r\n\r\n\r\ndef get_bucket(username, password, connection_string='couchbase:\/\/localhost'):\r\n   cluster = Cluster(connection_string)\r\n   authenticator = PasswordAuthenticator(username, password)\r\n   cluster.authenticate(authenticator)\r\n\r\n   return cluster.open_bucket('cities')\r\n\r\n\r\nclass CitiesService:\r\n   def __init__(self, bucket):\r\n       self._bucket = bucket\r\n\r\n   def load_from_csv(self, path):\r\n       with CitiesCsvIterator(path) as cities_iterator:\r\n           for city in cities_iterator:\r\n               if city.feature_class not in ('PPL', 'PPLA', 'PPLA2', 'PPLA3',\r\n                                             'PPLA4', 'PPLC'):\r\n                   continue\r\n\r\n               logger.info(f'Inserting {city.geonameid}')\r\n               self._bucket.upsert(\r\n                   city.geonameid,\r\n                   {\r\n                       'name': city.name,\r\n                       'feature_class': city.feature_class,\r\n                       'population': city.population,\r\n                       'geo': {'lat': float(city.lat),\r\n                               'lon': float(city.lon)}\r\n                   }\r\n               )\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Para comprobar si todo lo que hemos escrito hasta ahora funciona, vamos a cargar contenido CSV en Couchbase.<\/p>\n<pre class=\"lang:default decode:true\"># core.py\r\n\r\nbucket = get_bucket('admin', 'test123456')\r\ncities_service = CitiesService(bucket)\r\ncities_service.load_from_csv('~\/directory-with-cities\/PL\/PL.txt', bucket)<\/pre>\n<p>&nbsp;<\/p>\n<p>En este punto deber\u00edas tener las ciudades cargadas en tu bucket de Couchbase. El tiempo que tarde depender\u00e1 del pa\u00eds que haya elegido.<\/p>\n<h2><strong>Buscar ciudades<\/strong><\/h2>\n<p>Ya tenemos nuestro bucket listo con los datos, as\u00ed que es hora de volver a CitiesService y preparar unos cuantos m\u00e9todos que nos ayuden en la b\u00fasqueda de ciudades.<\/p>\n<p>Pero antes de empezar, tenemos que modificar ligeramente la clase City, a\u00f1adiendo el siguiente m\u00e9todo:<\/p>\n<pre class=\"lang:default decode:true\"># core.py\r\n\r\n@classmethod\r\ndef\u00a0from_couchbase_dict(cls, row):\r\nfields =\u00a0row['fields']\r\n\r\nreturn\u00a0cls(row['id'],\r\nfields['feature_class'],\r\nfields['name'],\r\nfields['population'],\r\nfields['geo'][1],\r\nfields['geo'][0])\r\n\r\n<\/pre>\n<p>Esa es la lista de m\u00e9todos que implementaremos en CitiesService:<\/p>\n<ul>\n<li>get_by_name(name, limit=10), devuelve las ciudades por su nombre<\/li>\n<li>get_by_coordinates(lat, lon), devuelve la ciudad por coordenadas<\/li>\n<li>get_nearest_to_city(ciudad, distancia='10', unidad='km', limit=10), devuelve la ciudad m\u00e1s cercana<\/li>\n<\/ul>\n<h3><strong>get_by_name<\/strong><\/h3>\n<pre class=\"lang:default decode:true\"># core.py\r\nfrom\u00a0couchbase.fulltext import\u00a0TermQuery\r\n\r\nINDEX_NAME\u00a0=\u00a0'cities'\r\n\r\ndef\u00a0get_by_name(self, name, limit=10):\r\nresult =\u00a0self._bucket.search(self.INDEX_NAME,\r\nTermQuery(name.lower(), field='name'),\r\nlimit=limit,\r\nfields='*')\r\n\r\nfor\u00a0c_city in\u00a0result:\r\nyield\u00a0City.from_couchbase_dict(c_city)<\/pre>\n<p>&nbsp;<\/p>\n<h3><strong>get_by_coordinates<\/strong><\/h3>\n<pre class=\"lang:default decode:true\"># core.py\r\nfrom\u00a0couchbase.fulltext import\u00a0GeoDistanceQuery\r\n\r\nINDEX_NAME\u00a0=\u00a0'cities'\r\n\r\ndef\u00a0get_by_coordinates(self, lat, lon):\r\nresult =\u00a0self._bucket.search(self.INDEX_NAME,\r\nGeoDistanceQuery('1km', (lon, lat)),\r\nfields='*')\r\n\r\nfor\u00a0c_city in\u00a0result:\r\nyield\u00a0City.from_couchbase_dict(c_city)<\/pre>\n<p>&nbsp;<\/p>\n<h3><strong>get_nearest_to_city<\/strong><\/h3>\n<pre class=\"lang:default decode:true\"># core.py\r\nfrom\u00a0couchbase.fulltext import\u00a0RawQuery, SortRaw\r\n\r\nINDEX_NAME\u00a0=\u00a0'cities'\r\n\r\ndef\u00a0get_nearest_to_city(self, city, distance='10', unit='km', limit=10):\r\nquery =\u00a0RawQuery({\r\n'location': {\r\n'lon': city.lon,\r\n'lat': city.lat\r\n},\r\n'distance': str(distance) +\u00a0unit,\r\n'field': 'geo'\r\n\r\n})\r\nsort =\u00a0SortRaw([{\r\n'by': 'geo_distance',\r\n'field': 'geo',\r\n'unit': unit,\r\n'location': {\r\n'lon': city.lon,\r\n'lat': city.lat\r\n}\r\n}])\r\n\r\nresult =\u00a0self._bucket.search(self.INDEX_NAME,\r\nquery,\r\nsort=sort,\r\nfields='*',\r\nlimit=limit)\r\n\r\nfor\u00a0c_city in\u00a0result:\r\nyield\u00a0City.from_couchbase_dict(c_city)\r\n\r\n<\/pre>\n<p>Como podr\u00e1s notar en este ejemplo, usamos las clases RawQuery y SortRaw. Lamentablemente, la API couchbase-python-client no funciona correctamente con las nuevas b\u00fasquedas de Couchbase y geo.<\/p>\n<h2><strong>M\u00e9todos de llamada<\/strong><\/h2>\n<p>Como ya tenemos todos los m\u00e9todos listos, \u00a1podemos llamarlo!<\/p>\n<pre class=\"lang:default decode:true\"># core.py\r\n\r\nbucket =\u00a0get_bucket('admin', 'test123456')\r\n\r\ncities_service =\u00a0CitiesService(bucket)\r\n# cities_service.load_from_csv('\/my-path\/PL\/PL.txt')\r\n\r\nprint('get_by_name')\r\ncities =\u00a0cities_service.get_by_name('Pozna\u0144')\r\nfor\u00a0city in\u00a0cities:\r\nprint(city.__dict__)\r\n\r\nprint('get_by_coordinates')\r\ncities =\u00a0cities_service.get_by_coordinates(52.40691997632544,\r\n16.929929926276657)\r\nfor\u00a0city in\u00a0cities:\r\nprint(city.__dict__)\r\n\r\nprint('get_nearest_to_city')\r\ncities =\u00a0cities_service.get_nearest_to_city(city)\r\nfor\u00a0city in\u00a0cities:\r\nprint(city.__dict__)<\/pre>\n<h2><strong>\u00bfQu\u00e9 hacer a partir de ahora?<\/strong><\/h2>\n<p>Creo que esta introducci\u00f3n le permitir\u00e1 trabajar en algo m\u00e1s avanzado.<\/p>\n<p>Hay algunas cosas que puedes hacer:<\/p>\n<ul>\n<li>Tal vez utilizar una herramienta CLI o REST API para servir estos datos... Mejorar la forma en que cargamos los datos, ya que podr\u00eda no ser super performante si queremos cargar TODAS las ciudades de TODOS los pa\u00edses.<\/li>\n<\/ul>\n<p>Puedes encontrar el c\u00f3digo completo de core.py en <u><a href=\"https:\/\/gist.github.com\/whisller\/74b731270cd56937a6d821f6cbe773d9\" target=\"_blank\" rel=\"noopener noreferrer\">gist github<\/a><\/u>.<\/p>\n<p>Si tienes alguna pregunta, no dudes en tuitearme <u><a href=\"https:\/\/twitter.com\/daniel_ancuta\" target=\"_blank\" rel=\"noopener noreferrer\">@daniel_ancuta<\/a><\/u>.<\/p>\n<p>&nbsp;<\/p>\n<p style=\"text-align: center\"><em>Este post forma parte del <a href=\"https:\/\/www.couchbase.com\/blog\/es\/community\/community-writers-program\/\" target=\"_blank\" rel=\"noopener noreferrer\">Programa de escritura comunitaria<\/a><\/em><\/p>","protected":false},"excerpt":{"rendered":"<p>Usando Python estamos creando una herramienta que utilizar\u00e1 consultas geoespaciales con Couchbase REST API y Couchbase Full Text Search, que nos ayudar\u00e1 en la b\u00fasqueda en una base de datos de ciudades.<\/p>","protected":false},"author":53,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1816,8683,9139],"tags":[],"ppma_author":[9026],"class_list":["post-4864","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-server","category-geospatial","category-python"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.2 (Yoast SEO v26.2) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Geospatial queries: Using Python to search cities - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"What are Geospatial queries? Check out how to write a tool in Python that uses geospatial queries\u00a0with Couchbase REST API\u00a0and Couchbase FullText Search.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/es\/geospatial-queries-using-python-search-cities\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Geospatial queries: Using Python to search cities\" \/>\n<meta property=\"og:description\" content=\"What are Geospatial queries? Check out how to write a tool in Python that uses geospatial queries\u00a0with Couchbase REST API\u00a0and Couchbase FullText Search.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/geospatial-queries-using-python-search-cities\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2018-03-22T13:37:43+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T06:43:11+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/16665891_10211247083188500_2291386332147570222_o.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1536\" \/>\n\t<meta property=\"og:image:height\" content=\"1536\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Laura Czajkowski, Developer Community Manager, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Laura Czajkowski, Developer Community Manager, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/geospatial-queries-using-python-search-cities\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/geospatial-queries-using-python-search-cities\/\"},\"author\":{\"name\":\"Laura Czajkowski, Developer Community Manager, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/5f1a0ece4e644bc8c037686fbc8f3220\"},\"headline\":\"Geospatial queries: Using Python to search cities\",\"datePublished\":\"2018-03-22T13:37:43+00:00\",\"dateModified\":\"2025-06-14T06:43:11+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/geospatial-queries-using-python-search-cities\/\"},\"wordCount\":762,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/geospatial-queries-using-python-search-cities\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"articleSection\":[\"Couchbase Server\",\"Geospatial\",\"Python\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/geospatial-queries-using-python-search-cities\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/geospatial-queries-using-python-search-cities\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/geospatial-queries-using-python-search-cities\/\",\"name\":\"Geospatial queries: Using Python to search cities - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/geospatial-queries-using-python-search-cities\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/geospatial-queries-using-python-search-cities\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2018-03-22T13:37:43+00:00\",\"dateModified\":\"2025-06-14T06:43:11+00:00\",\"description\":\"What are Geospatial queries? Check out how to write a tool in Python that uses geospatial queries\u00a0with Couchbase REST API\u00a0and Couchbase FullText Search.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/geospatial-queries-using-python-search-cities\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/geospatial-queries-using-python-search-cities\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/geospatial-queries-using-python-search-cities\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/geospatial-queries-using-python-search-cities\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Geospatial queries: Using Python to search cities\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/5f1a0ece4e644bc8c037686fbc8f3220\",\"name\":\"Laura Czajkowski, Developer Community Manager, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/9deb07d5daaa00220534c31768bc4409\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g\",\"caption\":\"Laura Czajkowski, Developer Community Manager, Couchbase\"},\"description\":\"Laura Czajkowski is the Snr. Developer Community Manager at Couchbase overseeing the community. She\u2019s responsible for our monthly developer newsletter.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/laura-czajkowski\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Geospatial queries: Using Python to search cities - The Couchbase Blog","description":"\u00bfQu\u00e9 son las consultas geoespaciales? Echa un vistazo a c\u00f3mo escribir una herramienta en Python que utiliza consultas geoespaciales con Couchbase REST API y Couchbase FullText Search.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/es\/geospatial-queries-using-python-search-cities\/","og_locale":"es_MX","og_type":"article","og_title":"Geospatial queries: Using Python to search cities","og_description":"What are Geospatial queries? Check out how to write a tool in Python that uses geospatial queries\u00a0with Couchbase REST API\u00a0and Couchbase FullText Search.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/geospatial-queries-using-python-search-cities\/","og_site_name":"The Couchbase Blog","article_published_time":"2018-03-22T13:37:43+00:00","article_modified_time":"2025-06-14T06:43:11+00:00","og_image":[{"width":1536,"height":1536,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/16665891_10211247083188500_2291386332147570222_o.jpg","type":"image\/jpeg"}],"author":"Laura Czajkowski, Developer Community Manager, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Laura Czajkowski, Developer Community Manager, Couchbase","Est. reading time":"4 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/geospatial-queries-using-python-search-cities\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/geospatial-queries-using-python-search-cities\/"},"author":{"name":"Laura Czajkowski, Developer Community Manager, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/5f1a0ece4e644bc8c037686fbc8f3220"},"headline":"Geospatial queries: Using Python to search cities","datePublished":"2018-03-22T13:37:43+00:00","dateModified":"2025-06-14T06:43:11+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/geospatial-queries-using-python-search-cities\/"},"wordCount":762,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/geospatial-queries-using-python-search-cities\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","articleSection":["Couchbase Server","Geospatial","Python"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/geospatial-queries-using-python-search-cities\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/geospatial-queries-using-python-search-cities\/","url":"https:\/\/www.couchbase.com\/blog\/geospatial-queries-using-python-search-cities\/","name":"Geospatial queries: Using Python to search cities - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/geospatial-queries-using-python-search-cities\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/geospatial-queries-using-python-search-cities\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2018-03-22T13:37:43+00:00","dateModified":"2025-06-14T06:43:11+00:00","description":"\u00bfQu\u00e9 son las consultas geoespaciales? Echa un vistazo a c\u00f3mo escribir una herramienta en Python que utiliza consultas geoespaciales con Couchbase REST API y Couchbase FullText Search.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/geospatial-queries-using-python-search-cities\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/geospatial-queries-using-python-search-cities\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/geospatial-queries-using-python-search-cities\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/geospatial-queries-using-python-search-cities\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Geospatial queries: Using Python to search cities"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"El blog de Couchbase","description":"Couchbase, la base de datos NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/5f1a0ece4e644bc8c037686fbc8f3220","name":"Laura Czajkowski, Directora de la Comunidad de Desarrolladores, Couchbase","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/9deb07d5daaa00220534c31768bc4409","url":"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g","caption":"Laura Czajkowski, Developer Community Manager, Couchbase"},"description":"Laura Czajkowski es la Snr. Developer Community Manager en Couchbase supervisando la comunidad. Es responsable de nuestro bolet\u00edn mensual para desarrolladores.","url":"https:\/\/www.couchbase.com\/blog\/es\/author\/laura-czajkowski\/"}]}},"authors":[{"term_id":9026,"user_id":53,"is_guest":0,"slug":"laura-czajkowski","display_name":"Laura Czajkowski, Developer Community Manager, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g","author_category":"","last_name":"Czajkowski","first_name":"Laura","job_title":"","user_url":"","description":"Laura Czajkowski es la Snr. Developer Community Manager en Couchbase supervisando la comunidad. Es responsable de nuestro bolet\u00edn mensual para desarrolladores."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/4864","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/53"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=4864"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/4864\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=4864"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=4864"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=4864"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=4864"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}