Créditos: El contenido de este cuaderno ha sido tomado de varias fuentes, pero especialmente de Aveek Das, Halil Yildirim, Ramya N, JMongoDB Manual,. El compilador se disculpa por cualquier omisión involuntaria y estaría encantado de agregar un reconocimiento.
Bases de datos geoespaciales#
Cuando hablamos de bases de datos (DB), hay una base de datos común que viene a la mente: SQL. Esta es una base de datos relacional. Básicamente, utilizan tablas para describir la relación entre los datos.
Por otro lado, están las bases de datos NoSQL (Non Structured Query Language), que no utilizan tablas para describir la relación, sino que pueden utilizar documentos, pares clave-valor, etc. Además, a diferencia de SQL, tienen un esquema dinámico, mientras que SQL tiene un esquema bien definido.

Objetivos de aprendizaje#
Al finalizar este notebook, el estudiante será capaz de:
Gestionar datos geoespaciales en una base de datos relacional con extensión espacial (PostGIS/PostgreSQL).
Escribir consultas SQL con funciones espaciales PostGIS (
ST_Buffer,ST_Within,ST_DWithin).Comprender el modelo de datos documental de MongoDB y sus ventajas para datos heterogéneos.
Realizar operaciones CRUD en MongoDB desde Python con
pymongo.Ejecutar consultas geoespaciales en MongoDB usando los operadores
$near,$geoWithine índices2dsphere.
Requisitos previos: 01_DatosEspaciales — datos geoespaciales vectoriales; nociones básicas de SQL y bases de datos relacionales.
El conjunto de datos Mumbai House Price de Kaggle contiene detalles de varios apartamentos ubicados en la ciudad de Mumbai.
import pandas as pd
import geopandas as gpd
# Load the house price data
df_house_price = pd.read_csv('https://raw.githubusercontent.com/aveek22/cs621-spatial-db/master/dataset/house_price_data.csv')
df_house_price.head(2)
| id | id_string | city | locality | project | dev_name | furnishing | area | bathroom_num | bedroom_num | ... | longitude | post_date | poster_name | price | title | trans | type | url | user_type | desc | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 45349857 | domcache_srp_45349857 | Mumbai | Malad West | NaN | NaN | Unfurnished | 350.0 | 2.0 | 1 | ... | 72.825882 | 11/01/20 | Saurabh Patil | 9000 | 1 BHK Apartment for Rent in Malad West | Rent | Apartment | /propertyDetails/1-BHK-350-Sq-ft-Multistorey-A... | Agent | 2 Bath,Unfurnished,East facing The project has... |
| 1 | 45960973 | domcache_srp_45960973 | Mumbai | Vasai | Veena Dynasty | Veena Group | Semi-Furnished | 652.0 | 2.0 | 1 | ... | 72.833592 | 11/01/20 | Gorakh Chavan | 8060 | 1 BHK Apartment for Rent in Veena Dynasty, Vasai | Rent | Apartment | /propertyDetails/1-BHK-652-Sq-ft-Multistorey-A... | Agent | 2 Bath,Semi-Furnished,East facing A 1BHK apart... |
2 rows × 23 columns
df_house_price.shape
(34348, 23)
# Check for NULL values within the dataset
df_house_price.isna().sum()
id 0
id_string 0
city 0
locality 208
project 14169
dev_name 16999
furnishing 10
area 776
bathroom_num 14
bedroom_num 0
floor_count 2860
floor_num 2781
latitude 0
longitude 0
post_date 0
poster_name 1
price 0
title 10
trans 30
type 0
url 10
user_type 0
desc 10
dtype: int64
# To keep things simple, we will start by removing the fields that have NULL values
# Prepare a list of columns to be dropped
list_columns_dropped = ['id_string','project','dev_name','furnishing','area','post_date','bathroom_num','floor_count','floor_num','poster_name','trans','url']
df_house_price = df_house_price.drop(labels = list_columns_dropped, axis = 1)
df_house_price.head(2)
# Convert the pandas dataframe to a geopandas dataframe
# This will make a geometry column based on the latitude and longitude
gdf_house_price = gpd.GeoDataFrame(df_house_price, geometry = gpd.points_from_xy(df_house_price.longitude, df_house_price.latitude), crs="EPSG:4326")
gdf_house_price.head(2)
| id | city | locality | bedroom_num | latitude | longitude | price | title | type | user_type | desc | geometry | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 45349857 | Mumbai | Malad West | 1 | 19.201336 | 72.825882 | 9000 | 1 BHK Apartment for Rent in Malad West | Apartment | Agent | 2 Bath,Unfurnished,East facing The project has... | POINT (72.82588 19.20134) |
| 1 | 45960973 | Mumbai | Vasai | 1 | 19.410704 | 72.833592 | 8060 | 1 BHK Apartment for Rent in Veena Dynasty, Vasai | Apartment | Agent | 2 Bath,Semi-Furnished,East facing A 1BHK apart... | POINT (72.83359 19.41070) |
gdf_house_price.to_file("gdf_house_price.shp", crs={'init' :'epsg:4326'})
<ipython-input-7-fb838af11281>:1: UserWarning: Column names longer than 10 characters will be truncated when saved to ESRI Shapefile.
gdf_house_price.to_file("gdf_house_price.shp", crs={'init' :'epsg:4326'})
PostGIS#
PostGIS es una extensión espacial para la base de datos relacional de objetos PostgreSQL. Agrega soporte para objetos geográficos, lo que permite ejecutar consultas de ubicación en SQL.
Al instalar PostgreSQL no es necesario cambiar ninguna de las configuraciones predeterminadas. Si olvidas tu contraseña, no tendrás acceso a tu servidor de PostgreSQL.
pgAdmin es una plataforma de código abierto muy popular, completamente dedicada a PostgreSQL, que cuenta con herramientas de administración con interfaz gráfica para gestionar tus bases de datos relacionales. Algunas características incluyen una herramienta de consulta para sentencias SQL y la importación/exportación de archivos CSV.

En el lado izquierdo, puedes crear una base de datos haciendo clic derecho en Create –> Database…
Para crear una tabla dentro de la base de datos, solo necesitas hacer clic derecho en Schemas –> Tables –> Create y luego en Table. También es posible crear una tabla desde SQL, simplemente debes hacer clic derecho en la base de datos y seleccionar Query Tool. Se abrirá una pestaña llamada editor de consultas a la derecha. Puedes escribir sentencias SQL y hacer clic en el botón de ejecución (play) para ejecutarlas. Los resultados se mostrarán debajo del editor en la pestaña Data Output.
CREATE TABLE prueba2 (name varchar, geom geometry)
Ahora que has creado una tabla, visualízala bajo el objeto Tables. Haz clic derecho y selecciona Refresh si no se ha actualizado.

Using the Query Tool, it is needed to create the extension Postgis in the new database with the following statement:
CREATE EXTENSION postgis;
Ahora que tenemos todo el conjunto de datos en formato .shp, podemos importarlo fácilmente a PostGIS y visualizarlo. Para importar archivos .shp en PostGIS, necesitamos abrir PostGIS Bundle 3. Después de establecer la conexión con la base de datos, solo necesitamos Agregar archivo y importar.
Para seleccionar columnas:
SELECT city, price, geom
FROM gdf_house_price
LIMIT 10
Para poder ver el filtro se usa Geometry Viewer
SELECT city, price
FROM gdf_house_price
WHERE type='Apartment'
PostGIS y QGIS#
Primero, importemos OpenStreetMap en QGIS como capa de fondo.
Web → QuickMapServices → OSM → OSM Standard.
Para importar en QGIS desde PostGIS:#
Para importar capas desde PostGIS en QGIS, primero se debe establecer una conexión. Esta conexión se puede establecer a través del navegador en el ícono de PostGIS haciendo clic derecho o desde Layer → Add Layer → Add PostGIS Layers. Necesitas proporcionar un nombre para tu conexión y el nombre de la base de datos a la que deseas conectarte. Si todo está correcto, QGIS leerá todas las tablas espaciales en la carpeta Public y podrás abrirlas en QGIS.
Todos los puntos de datos de la tabla de PostgreSQL ahora se cargarán en la capa de QGIS y los puntos se representarán en el mapa.
Como puedes ver en el gráfico anterior, hay más de 30,000 apartamentos que se han mostrado en el mapa. Sin embargo, sería interesante ver cómo varía el rango de precios de estos apartamentos con respecto a la localidad. Básicamente, estamos tratando de responder si la localidad tiene un impacto en los precios de las viviendas.
Para esto, hemos dividido los precios de las viviendas en 3 categorías como se indica a continuación:
Menos de 20K
De 20K a 40K
Más de 40K
Voy a agregar una columna en la tabla de PostgreSQL y actualizarla con la información relevante sobre las categorías.
ALTER TABLE mumbai_house_price_raw
ADD COLUMN house_price_category VARCHAR(20);
UPDATE mumbai_house_price_raw
SET house_price_category = CASE WHEN price < 20000 THEN 'Below 20K'
WHEN price >= 20000 AND price < 40000 THEN '20K - 40K'
WHEN price >= 40000 THEN 'Above 50K'
END;
Now, we need to refresh the layer that we have already fetched in QGIS. This will bring the new column ‘house_price_category’ that we have just created. Once the new column is in the layer, the next step is to display the points on the map based on this category.
Right-click Layer → Properties → Symbology → Categorize → Value = house_price_category → Color Ramp = Create Manual Color Ramp for 3 categories → Classify.
This will categorize all the points on the map into three bins and it will look like below.
From the above analysis, now we have an idea about what our budget should be while searching for a home in the city of Mumbai. While few of the houses are below 40K (green and blue), most of the houses are priced above 40K (red). To verify the above observation, I did a quick check using SQL to find the number of apartments in each of the categories.
SELECT
house_price_category,
COUNT(1) number_houses
FROM mumbai_house_price_raw
GROUP BY house_price_category;
As it can be verified, there are almost around 20K+ apartments in the range above 50K. So, if we keep the budget high, the chances of leasing a better apartment is more.
Now we are going to create a query in PostgreSQL that will filter the names of the buildings within 5km radius of the airport (Lon: 72.874374, Lat: 19.096713), and create and store this in a view. Fetch the view created in the previous step into QGIS and plot the apartments.
CREATE OR REPLACE VIEW vw_mumbai_houses_airport_5km
AS
SELECT *
FROM mumbai_house_price_raw
WHERE 1=1
AND ST_DISTANCE(
ST_TRANSFORM(ST_GEOMFROMTEXT('POINT(72.874374 19.096713)',4326), 7755),
ST_TRANSFORM((geometry),7755)
) <= 5000;
El siguiente es el gráfico de todos los apartamentos dentro de un rango de 5 km del aeropuerto.
En QGIS, es posible usar SQL para generar consultas y crear vistas. QGIS –> Database –> DB Manager.
MongoDB#
MongoDB es una base de datos NoSQL orientada a documentos utilizada para el almacenamiento de grandes volúmenes de datos, lo que significa que almacena datos en formato BSON. BSON es JSON Binario (Binary JSON - JavaScript Object Notation). Así que los documentos son el formato binario de objetos JSON. En lugar de usar tablas y filas como en las bases de datos relacionales tradicionales, MongoDB utiliza colecciones y documentos. Los documentos consisten en pares clave-valor, que son la unidad básica de datos en MongoDB. Las colecciones contienen conjuntos de documentos y funcionan como el equivalente de las tablas en una base de datos relacional.
Cada base de datos contiene colecciones que, a su vez, contienen documentos. Cada documento puede ser diferente, con un número variable de campos. El tamaño y contenido de cada documento puede ser diferente entre sí.
El campo _id es obligatorio en cada documento de MongoDB. El campo _id representa un valor único en el documento de MongoDB. El campo _id es como la clave primaria del documento. Si creas un nuevo documento sin un campo _id, MongoDB creará automáticamente el campo. Por ejemplo, si observamos el ejemplo de la tabla de clientes anterior, MongoDB añadirá un identificador único de 24 dígitos a cada documento en la colección.
Documento: MongoDB es una base de datos de documentos, lo que significa que cada registro en una colección es un documento.
Colección: es un conjunto de documentos de MongoDB. Una colección es el equivalente de una tabla que se crea en otros sistemas de bases de datos relacionales (RDMS), como Oracle o MS SQL. Una colección existe dentro de una sola base de datos. Como se mencionó en la introducción, las colecciones no imponen ningún tipo de estructura.
Base de datos: es un contenedor de colecciones, similar a los RDMS donde es un contenedor para tablas. Cada base de datos obtiene su propio conjunto de archivos en el sistema de archivos. Un servidor de MongoDB puede almacenar múltiples bases de datos.
Existen tres formas de comunicarse con MongoDB:
Mongo Shell
Python
MongoDB Compass
Conectemos a MongoDB usando Python.
MongoDB con Python#
!pip install pymongo
Collecting pymongo
Downloading pymongo-3.12.0-cp39-cp39-win_amd64.whl (397 kB)
Installing collected packages: pymongo
Successfully installed pymongo-3.12.0
import pymongo
from pymongo import MongoClient
Local connection#
client = MongoClient('mongodb://localhost:27017/')
db = client.Geospatial
prueba = db.prueba
Si ya tenemos la base de datos, pero está almacenada localmente, aquí te mostramos cómo acceder a ella en Python. Necesitaríamos importar pymongo y MongoClient, luego acceder a nuestra base de datos y, finalmente, a la colección que queremos. Aquí, nuestra colección actual, restaurants, ahora se guarda como la variable llamada rest, y en este punto podemos iterar sobre ella como deseemos.
prueba.insert_one({"name": "Mondongos", "location": "Unal"})
<pymongo.results.InsertOneResult at 0x1efc3a34140>
for document in prueba.find():
print(document)
{'_id': ObjectId('61367f9e8dd03350c29d7785'), 'name': 'Mondongos', 'location': 'Unal'}
{'_id': ObjectId('613680848dd03350c29d7788'), 'name': 'Mondongos', 'location': 'Unal'}
prueba.drop()
External server connection#
Después de configurar tu cuenta en MongoDB, haz clic en el botón connect en el panel de control, luego selecciona connect your application y elige Python driver. Verás tu cadena de conexión allí, cópiala.
No olvides reemplazar los marcadores admin y password con tu nombre de usuario y contraseña que creaste al configurar un usuario. Ten en cuenta que este usuario no es el que usaste al registrarte, es el usuario que creaste después de crear un clúster.
uri= "mongodb://edier:M********8@cluster0-shard-00-00.rqn4t.gcp.mongodb.net:27017,cluster0-shard-00-01.rqn4t.gcp.mongodb.net:27017,cluster0-shard-00-02.rqn4t.gcp.mongodb.net:27017/Geospatial?ssl=true&replicaSet=atlas-hup4mf-shard-0&authSource=admin&retryWrites=true&w=majority"
client= pymongo.MongoClient(uri)
db = client.Geospatial
prueba=db["prueba"]
print(client.list_database_names())
['Geospatial', 'Landslides', 'PAE', 'prueba', 'admin', 'local']
print(db.list_collection_names())
[]
insert_one(): insert_one() inserts a single document into a collection.
prueba.insert_one({"name": "Mondongos", "location": "la 80"})
<pymongo.results.InsertOneResult at 0x7fbb8de12280>
prueba.find_one()
{'_id': ObjectId('6084724e48673efb49afbe72'),
'name': 'Mondongos',
'location': 'la 80'}
insert_many(): insert_many() inserts multiple documents into a collection.
prueba.insert_many(
[
{ "name": "Jeorge", "location": 70},
{ "name": "Steve", "location": 100},
{ "name": "David", "location": 250}
]
)
<pymongo.results.InsertManyResult at 0x7fbaa9a85300>
find(): find() function will return with all the documents in that collection. By default it returns a cursor object.
prueba.find()
<pymongo.cursor.Cursor at 0x7fba9956b490>
for document in prueba.find():
print(document)
{'_id': ObjectId('6084724e48673efb49afbe72'), 'name': 'Mondongos', 'location': 'la 80'}
{'_id': ObjectId('6084727048673efb49afbe73'), 'name': 'Jeorge', 'location': 70}
{'_id': ObjectId('6084727048673efb49afbe74'), 'name': 'Steve', 'location': 100}
{'_id': ObjectId('6084727048673efb49afbe75'), 'name': 'David', 'location': 250}
query = {'name': 'David'}
print(prueba.find_one(query))
{'_id': ObjectId('6084727048673efb49afbe75'), 'name': 'David', 'location': 250}
new_document = {'$set': {'name': 'Juan', 'location': '250'}}
update_post = prueba.update_one(query, new_document, upsert=False)
print(update_post.matched_count)
1
updated_document = prueba.find_one({'name': 'Juan'})
print(updated_document)
{'_id': ObjectId('6084727048673efb49afbe75'), 'name': 'Juan', 'location': '250'}
del_document = prueba.delete_one({'name': 'Juan'})
print(del_document.deleted_count) # output: 1
1
df=pd.DataFrame.from_records(prueba.find())
df.head(2)
| _id | name | location | |
|---|---|---|---|
| 0 | 6084724e48673efb49afbe72 | Mondongos | la 80 |
| 1 | 6084727048673efb49afbe73 | Jeorge | 70 |
data=pd.read_json('https://raw.githubusercontent.com/mongodb/docs-assets/geospatial/restaurants.json', lines=True)
data.head(2)
| _id | location | name | |
|---|---|---|---|
| 0 | {'$oid': '55cba2476c522cafdb053add'} | {'coordinates': [-73.856077, 40.848447], 'type... | Morris Park Bake Shop |
| 1 | {'$oid': '55cba2476c522cafdb053ade'} | {'coordinates': [-73.961704, 40.662942], 'type... | Wendy'S |
data={'name':data.name,'location':data.location}
df=pd.DataFrame(data)
dic=df.to_dict(orient='records')
restaurants=client['Geospatial']['restaurants']
restaurants.insert_many(dic)
<pymongo.results.InsertManyResult at 0x7fbaa09b09c0>
restaurants.count_documents({})
25359
restaurants.create_index([("location",pymongo.GEOSPHERE)])
'location_2dsphere'
restaurants.find_one()
{'_id': ObjectId('60846f2d48673efb49af5b5b'),
'name': 'Morris Park Bake Shop',
'location': {'coordinates': [-73.856077, 40.848447], 'type': 'Point'}}
data=pd.read_json('https://raw.githubusercontent.com/mongodb/docs-assets/geospatial/neighborhoods.json', lines=True)
data.head(2)
| _id | geometry | name | |
|---|---|---|---|
| 0 | {'$oid': '55cb9c666c522cafdb053a1a'} | {'coordinates': [[[-73.94193078816193, 40.7007... | Bedford |
| 1 | {'$oid': '55cb9c666c522cafdb053a1b'} | {'coordinates': [[[-73.94732672160579, 40.6291... | Midwood |
data={'name':data.name,'location':data.geometry}
df=pd.DataFrame(data)
dic=df.to_dict(orient='records')
# create a new collection instance from Geospatial
neighborhoods=client['Geospatial']['neighborhoods']
neighborhoods.insert_many(dic)
<pymongo.results.InsertManyResult at 0x7fbab15c5100>
neighborhoods.count_documents({})
195
Encontrar el Vecindario Actual#
Supongamos que el usuario se encuentra en la longitud -73.93414657 y latitud 40.82302903. Para encontrar el vecindario actual, debes especificar un punto utilizando el campo especial $geometry en formato GeoJSON:
from bson.son import SON
query1 = { "geometry": { "$geoIntersects": SON([("$geometry", SON([("type", "Point"), ("coordinates", [ -73.93414657, 40.82302903 ] )]))])}}
barrio=neighborhoods.find_one()
print(barrio)
{'_id': ObjectId('608474f648673efb49afbe76'), 'name': 'Bedford', 'location': {'coordinates': [[[-73.94193078816193, 40.70072523469547], [-73.9443878859649, 40.70042452378256], [-73.94424286147482, 40.69969927964773], [-73.94409591260093, 40.69897295461309], [-73.94394947271304, 40.69822127983908], [-73.94391750192877, 40.69805620211356], [-73.94380383211836, 40.697469265449826], [-73.94378455587042, 40.6973697290538], [-73.94374306706803, 40.69715549995503], [-73.9437245356891, 40.697059812179496], [-73.94368427322361, 40.696851909818065], [-73.9436842703752, 40.69685189440415], [-73.94363806934868, 40.69661331854307], [-73.94362121369004, 40.696526279661654], [-73.9435563415296, 40.69619128295102], [-73.94354024149403, 40.6961081421151], [-73.94352527471477, 40.69603085523812], [-73.94338802084431, 40.69528899051899], [-73.943242490861, 40.694557485733355], [-73.94312826743185, 40.693967038330925], [-73.94311427813774, 40.693894720557466], [-73.94310040895432, 40.69382302905847], [-73.94295136131598, 40.69309078423585], [-73.94280765181726, 40.692357794128945], [-73.94266181801652, 40.69162434435983], [-73.94251587928605, 40.69089200097073], [-73.94236932748694, 40.690159944665304], [-73.94222203471806, 40.68942797886745], [-73.94207684924385, 40.68869720298344], [-73.9419324508184, 40.687962958755094], [-73.94178527584324, 40.687228372121126], [-73.94163933150469, 40.68649727009258], [-73.94149491757346, 40.68576452882908], [-73.94134827184915, 40.685031202512505], [-73.94120399291621, 40.68429983923358], [-73.94105783787931, 40.68356687284592], [-73.94091334273119, 40.682833617234294], [-73.94076893329961, 40.68210083903887], [-73.94062005382186, 40.68137013010259], [-73.94047635005941, 40.680635695422964], [-73.94032793962053, 40.67988997506463], [-73.94120864299748, 40.67993835375214], [-73.94326176928655, 40.68005060712657], [-73.94397347805013, 40.680088128426995], [-73.94627470970092, 40.68021332692951], [-73.94674915979888, 40.680239661363046], [-73.9477302355664, 40.680291846282316], [-73.9495568871113, 40.68039040292329], [-73.95115828512961, 40.68047861480679], [-73.95155682676496, 40.680498847575564], [-73.95337017508861, 40.68064050844431], [-73.95351616791015, 40.68138260047889], [-73.95366256227194, 40.68211490361348], [-73.95380893530668, 40.68284800827331], [-73.95395453033524, 40.68358077882069], [-73.95410042574005, 40.684313107633436], [-73.95424647696164, 40.68504624826183], [-73.95439296867414, 40.685779720013606], [-73.95453798607406, 40.68651117540455], [-73.95468418850508, 40.68724485443714], [-73.95684165193596, 40.68699607883792], [-73.95956770121337, 40.68668255592727], [-73.95971374756459, 40.6874156340909], [-73.95985939425704, 40.688147451217226], [-73.96000519802635, 40.688881033718204], [-73.96009714565346, 40.689345210097464], [-73.96012172912181, 40.68946930706387], [-73.96017256138677, 40.68972986156118], [-73.96018691858275, 40.689803455988546], [-73.96022304539724, 40.689988627383755], [-73.96023740336433, 40.69006222280781], [-73.96029281668112, 40.690346249915414], [-73.96013760800457, 40.69036438035883], [-73.96008336800442, 40.6903707157072], [-73.95957591847137, 40.69042998753855], [-73.95942791320554, 40.69044727471387], [-73.95934862389824, 40.6904564609108], [-73.95928133730644, 40.69046425696955], [-73.95899330491858, 40.69049762936284], [-73.95886713625437, 40.69051224801476], [-73.95857844775936, 40.690545694857576], [-73.9581804874994, 40.69059073040573], [-73.95808563435828, 40.69060146372528], [-73.95727249112613, 40.69069347835403], [-73.95635602958276, 40.69079978191732], [-73.95541057949602, 40.690908291885876], [-73.95582662769675, 40.69299238288233], [-73.95614239268207, 40.69457901857237], [-73.9570870194244, 40.694470440162995], [-73.95799732979468, 40.694365838684114], [-73.95931047927598, 40.69421508783189], [-73.96015854658333, 40.69411730915604], [-73.96062056531659, 40.6963201401926], [-73.96092543804184, 40.69773650701631], [-73.96105100700007, 40.698326078819065], [-73.96019688857467, 40.698462727438596], [-73.95885874627406, 40.6986773264162], [-73.95795938220984, 40.69882000321581], [-73.95701993123406, 40.698973914349565], [-73.957167301054, 40.69970786791901], [-73.95722517405626, 40.69999935002626], [-73.95745736372834, 40.70082260318457], [-73.95572361014881, 40.70194576955721], [-73.9538119690652, 40.70318097979544], [-73.95318085172319, 40.70261690547745], [-73.95255052777945, 40.7020516665144], [-73.951920189279, 40.70148754916077], [-73.95128819434734, 40.70092236548591], [-73.95027424109588, 40.70157924195056], [-73.9493787354337, 40.70215888982628], [-73.94753858146478, 40.703350650664795], [-73.94705205297524, 40.70366394934019], [-73.94625107780892, 40.70320874745355], [-73.9458549904679, 40.70298720677488], [-73.94544988192177, 40.702760635974364], [-73.94463910154856, 40.70231369467456], [-73.94431460096804, 40.70213334535181], [-73.94400504048726, 40.70196179219718], [-73.9438247374114, 40.701862007878276], [-73.94322686012315, 40.701520709145726], [-73.94306406845838, 40.7014244350918], [-73.94220058705264, 40.700890667467746], [-73.94193078816193, 40.70072523469547]]], 'type': 'Polygon'}}
Restaurantes en 1km alrededor#
También puedes usar nearSphere y especificar un término maxDistance en metros. Esto devolverá todos los restaurantes dentro de un radio de 1 km del usuario, ordenados de más cercano a más lejano:
query3 = {'location': {'$near': SON([('$geometry', SON([('type', 'Point'), ('coordinates', [-73.93414657, 40.82302903 ])])), ('$maxDistance', 1000)])}}
for doc in restaurants.find(query3):
print(doc)
{'_id': ObjectId('60846f2d48673efb49afad01'), 'name': 'Gotham Stadium Tennis Center Cafe', 'location': {'coordinates': [-73.9316894, 40.8231974], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49afa6c9'), 'name': "Tia Melli'S Latin Kitchen", 'location': {'coordinates': [-73.9378967, 40.823448], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49aface1'), 'name': "Chuck E. Cheese'S", 'location': {'coordinates': [-73.9303724, 40.8234978], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af7128'), 'name': "Domino'S Pizza", 'location': {'coordinates': [-73.93795159999999, 40.823376], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af695e'), 'name': 'Red Star Chinese Restaurant', 'location': {'coordinates': [-73.9381738, 40.8224212], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af8be8'), 'name': "Applebee'S Neighborhood Grill & Bar", 'location': {'coordinates': [-73.93011659999999, 40.8219403], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af9931'), 'name': 'Marisco Centro Seafood Restaurant & Bar', 'location': {'coordinates': [-73.93011659999999, 40.8219403], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49afae7a'), 'name': '108 Fast Food Corp', 'location': {'coordinates': [-73.9370572, 40.8206095], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af954b'), 'name': 'Kentucky Fried Chicken', 'location': {'coordinates': [-73.9365102, 40.8202205], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af9dd0'), 'name': 'United Fried Chicken', 'location': {'coordinates': [-73.9385009, 40.8222455], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af6f01'), 'name': 'Dunkin Donuts', 'location': {'coordinates': [-73.9373291, 40.8206458], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af81dd'), 'name': "King'S Pizza", 'location': {'coordinates': [-73.9373291, 40.8206458], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af67e8'), 'name': "Papa John'S", 'location': {'coordinates': [-73.9365637, 40.8201488], 'type': 'Point'}}
{'_id': ObjectId('60846f2e48673efb49afba8f'), 'name': "Jimbo'S Hamburgers", 'location': {'coordinates': [-73.9365637, 40.8201488], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49afa125'), 'name': 'Home Garden Chinese Restaurant', 'location': {'coordinates': [-73.938599, 40.82211110000001], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49afa1ca'), 'name': "Sweet Mama'S Soul Food", 'location': {'coordinates': [-73.9367511, 40.8198978], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af8c14'), 'name': 'Dunkin Donuts (Inside Gulf Gas Station On North Side Of Maj. Deegan Exwy- After Exit 13 - 233 St.)', 'location': {'coordinates': [-73.9308109, 40.82594580000001], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af907b'), 'name': 'Reggae Sun Delights Natural Juice Bar', 'location': {'coordinates': [-73.939159, 40.8216897], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af8b8a'), 'name': 'Ho Lee Chinese Restaurant', 'location': {'coordinates': [-73.939145, 40.8213757], 'type': 'Point'}}
{'_id': ObjectId('60846f2e48673efb49afb695'), 'name': 'Ivory D O S Inc', 'location': {'coordinates': [-73.9396354, 40.8220958], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49afa857'), 'name': 'Cea-Lo Cafe', 'location': {'coordinates': [-73.9394446, 40.8215751], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af86fa'), 'name': 'Little Ochie Jamaican Cuisine', 'location': {'coordinates': [-73.93951050000001, 40.821488], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49afaf9e'), 'name': 'Harlem Juice Bar', 'location': {'coordinates': [-73.93757889999999, 40.8265405], 'type': 'Point'}}
{'_id': ObjectId('60846f2e48673efb49afb7b8'), 'name': "Pinky'S Jamaican And American Restaurant", 'location': {'coordinates': [-73.939987, 40.822336], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49afa79f'), 'name': 'Biters Llc', 'location': {'coordinates': [-73.938811, 40.82583899999999], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af8bed'), 'name': 'Subway', 'location': {'coordinates': [-73.93032130000002, 40.8193837], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af67e5'), 'name': "Grini'S Grill & Restaurant", 'location': {'coordinates': [-73.9376491, 40.8191987], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af601c'), 'name': "Touch Of Dee'S", 'location': {'coordinates': [-73.9373939, 40.8190144], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af6fa7'), 'name': 'Lenox Fast Food', 'location': {'coordinates': [-73.9373939, 40.8190144], 'type': 'Point'}}
{'_id': ObjectId('60846f2e48673efb49afbe48'), 'name': '', 'location': {'coordinates': [-73.92961799999999, 40.81970099999999], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49afa43b'), 'name': 'New Jing Hui Restaurant', 'location': {'coordinates': [-73.94011490000001, 40.8247261], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49afa936'), 'name': 'Mountain Bird', 'location': {'coordinates': [-73.9405598, 40.8225635], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49afad65'), 'name': "Grini'S Bakery", 'location': {'coordinates': [-73.9376221, 40.8186934], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af74e0'), 'name': 'Yong Sheng Restaurant', 'location': {'coordinates': [-73.9394274, 40.8262905], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af939c'), 'name': 'Makkah Pizza Restaurant', 'location': {'coordinates': [-73.937699, 40.8185813], 'type': 'Point'}}
{'_id': ObjectId('60846f2e48673efb49afb38e'), 'name': 'Subway Restaurant', 'location': {'coordinates': [-73.94058179999999, 40.8251808], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af8796'), 'name': 'La Nomade Restaurant', 'location': {'coordinates': [-73.940585, 40.825221], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af917c'), 'name': 'Brothers Seafood', 'location': {'coordinates': [-73.9274327, 40.82120159999999], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af8ed2'), 'name': "Hot Pot Under De' Tree", 'location': {'coordinates': [-73.9392579, 40.826971], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af8466'), 'name': 'Country Pan Fried Chicken', 'location': {'coordinates': [-73.93922800000001, 40.8270259], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af6171'), 'name': 'Popeyes Chicken & Biscuits', 'location': {'coordinates': [-73.9414927, 40.8228713], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af7734'), 'name': "Dunkin' Donuts", 'location': {'coordinates': [-73.9414927, 40.8228713], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af9f01'), 'name': '88 Chinese Restaurant', 'location': {'coordinates': [-73.9379543, 40.8182292], 'type': 'Point'}}
{'_id': ObjectId('60846f2e48673efb49afbbd5'), 'name': 'House Of Seafood Express', 'location': {'coordinates': [-73.9379721, 40.8182047], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af91e8'), 'name': "Jumbo'S Hamburgers", 'location': {'coordinates': [-73.9416849, 40.822537], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af71fc'), 'name': 'Glacken Bar', 'location': {'coordinates': [-73.92856720000002, 40.8190635], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49afac81'), 'name': 'City One Chinese Restaurant', 'location': {'coordinates': [-73.94182719999999, 40.8226224], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af7e2c'), 'name': 'Sunlight Restaurant', 'location': {'coordinates': [-73.9284026, 40.8190186], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af7089'), 'name': 'Peoples Choice Kitchen', 'location': {'coordinates': [-73.94195599999999, 40.823392], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af789f'), 'name': 'Starbucks Coffee', 'location': {'coordinates': [-73.94201369999999, 40.8231374], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af8a6a'), 'name': "Margie'S Red Rose Diner", 'location': {'coordinates': [-73.9420166, 40.8221478], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af8d80'), 'name': 'Fu On Kitchen', 'location': {'coordinates': [-73.94047139999999, 40.8192368], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af6858'), 'name': 'Polanco Restaurant Bbq', 'location': {'coordinates': [-73.9405196, 40.8191934], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af7b2f'), 'name': 'The News Room Jazz Club', 'location': {'coordinates': [-73.9280411, 40.8189109], 'type': 'Point'}}
{'_id': ObjectId('60846f2e48673efb49afbe2b'), 'name': '', 'location': {'coordinates': [-73.92778, 40.819083], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af62c5'), 'name': 'Glen Roy Bar And Grill', 'location': {'coordinates': [-73.92789290000002, 40.8189679], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af5fe5'), 'name': "Mcdonald'S", 'location': {'coordinates': [-73.9270544, 40.8197704], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af70f0'), 'name': 'Stadium Pizza Bar Restaurant', 'location': {'coordinates': [-73.92637870000001, 40.8255594], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af767a'), 'name': "Giovanni'S Restaurant", 'location': {'coordinates': [-73.9271442, 40.81938170000001], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af709a'), 'name': "Jimbo'S Hamburger Place", 'location': {'coordinates': [-73.93805429999999, 40.8287532], 'type': 'Point'}}
{'_id': ObjectId('60846f2e48673efb49afb3b4'), 'name': "Big Papa'S", 'location': {'coordinates': [-73.9275868, 40.8188987], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af83a1'), 'name': 'Haagan Daz', 'location': {'coordinates': [-73.9272196, 40.8192564], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af7f6d'), 'name': 'Popeyes Chicken & Biscuits', 'location': {'coordinates': [-73.927454, 40.818949], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af7f6c'), 'name': 'Burger King', 'location': {'coordinates': [-73.927454, 40.818949], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49afb082'), 'name': "King'S Chef Chinese Restaurant", 'location': {'coordinates': [-73.938581, 40.8173752], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af9a63'), 'name': 'Planet Wings', 'location': {'coordinates': [-73.9274579, 40.8188226], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af886a'), 'name': 'Mamas Fried Chicken', 'location': {'coordinates': [-73.93757959999999, 40.8291233], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af7468'), 'name': 'Happy Wok', 'location': {'coordinates': [-73.92582759999999, 40.8255104], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af9da9'), 'name': 'Great Wall', 'location': {'coordinates': [-73.92636689999999, 40.8196623], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af64bc'), 'name': "Sam'S Restaurant", 'location': {'coordinates': [-73.92631920000001, 40.8196491], 'type': 'Point'}}
{'_id': ObjectId('60846f2e48673efb49afba04'), 'name': 'Don Rico Pollo Restaurant', 'location': {'coordinates': [-73.9384185, 40.8169908], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af98cc'), 'name': 'Capitol International', 'location': {'coordinates': [-73.926361, 40.819499], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af8587'), 'name': "Dunkin' Donuts", 'location': {'coordinates': [-73.9251285, 40.8220602], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af895f'), 'name': 'Jacob Restaurant', 'location': {'coordinates': [-73.94310630000001, 40.8217797], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af8802'), 'name': "Stan'S Sports Bar", 'location': {'coordinates': [-73.9262845, 40.82669569999999], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49afaeae'), 'name': 'Subway#50497 (Cardinal Hayes High School)', 'location': {'coordinates': [-73.92537449999999, 40.8207116], 'type': 'Point'}}
{'_id': ObjectId('60846f2e48673efb49afb2a2'), 'name': 'Hostos Community College', 'location': {'coordinates': [-73.9272977, 40.81822409999999], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af9cad'), 'name': 'B & B Restaurant Ii', 'location': {'coordinates': [-73.9388057, 40.8167739], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af8f34'), 'name': 'Yankee Bar & Grill', 'location': {'coordinates': [-73.9259928, 40.82713630000001], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af6449'), 'name': "Billy'S Sport Bar Restaurant & Lounge", 'location': {'coordinates': [-73.92594439999999, 40.8272129], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49afa794'), 'name': 'Subway', 'location': {'coordinates': [-73.94410130000001, 40.8237544], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af94f0'), 'name': 'United Fried Chicken', 'location': {'coordinates': [-73.93923579999999, 40.8164916], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49afab67'), 'name': 'Dunkin Donuts', 'location': {'coordinates': [-73.9259245, 40.827435], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af9cbd'), 'name': "Victorio'S Pizza Plus", 'location': {'coordinates': [-73.94420389999999, 40.8237974], 'type': 'Point'}}
{'_id': ObjectId('60846f2e48673efb49afb3ec'), 'name': 'Ponty Bistro', 'location': {'coordinates': [-73.94126949999999, 40.8175925], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af8aae'), 'name': 'Subway', 'location': {'coordinates': [-73.9392905, 40.8164177], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af7f6f'), 'name': "Mama Tina'S Pizza", 'location': {'coordinates': [-73.9438724, 40.8207066], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af65d4'), 'name': 'Make My Cake', 'location': {'coordinates': [-73.9420895, 40.8181467], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af9d0e'), 'name': 'Branson Got Juice', 'location': {'coordinates': [-73.94387689999999, 40.8255961], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af706c'), 'name': 'Texas Star Snack Bar', 'location': {'coordinates': [-73.94387689999999, 40.8255961], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af9752'), 'name': 'Subway', 'location': {'coordinates': [-73.9276146, 40.8169727], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af9ae5'), 'name': "Mama K'S Soup Or Salad", 'location': {'coordinates': [-73.9435414, 40.8263004], 'type': 'Point'}}
{'_id': ObjectId('60846f2e48673efb49afbd33'), 'name': 'New Golden Empire Chinese Restaurant', 'location': {'coordinates': [-73.94360379999999, 40.82619649999999], 'type': 'Point'}}
{'_id': ObjectId('60846f2e48673efb49afbc1e'), 'name': 'Tsion Cafe & Bakery', 'location': {'coordinates': [-73.94351460000001, 40.82635579999999], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af8083'), 'name': 'Nyy Steak', 'location': {'coordinates': [-73.9259201, 40.8278293], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af8082'), 'name': 'Hard Rock Cafe', 'location': {'coordinates': [-73.9259201, 40.8278293], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49afabf4'), 'name': 'Bullpen Deli Twin Donuts', 'location': {'coordinates': [-73.92536059999999, 40.8273453], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af9c08'), 'name': 'Flavas International Grill', 'location': {'coordinates': [-73.9250339, 40.8269856], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49afaa1f'), 'name': 'Honeycomb Playhouse', 'location': {'coordinates': [-73.9442299, 40.8252683], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49afa03f'), 'name': 'Dunkin Donuts', 'location': {'coordinates': [-73.9446206, 40.8237467], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af6447'), 'name': 'Famous Fish Market', 'location': {'coordinates': [-73.9446811, 40.8237287], 'type': 'Point'}}
{'_id': ObjectId('60846f2e48673efb49afb3d5'), 'name': 'Manhatanville Coffee', 'location': {'coordinates': [-73.94446900000001, 40.8212633], 'type': 'Point'}}
{'_id': ObjectId('60846f2e48673efb49afb827'), 'name': 'Hyacinth Haven Harlem', 'location': {'coordinates': [-73.9422781, 40.8178187], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af6ef1'), 'name': 'Ihop', 'location': {'coordinates': [-73.9419869, 40.8175016], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af606a'), 'name': "Mcdonald'S", 'location': {'coordinates': [-73.9419869, 40.8175016], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af811c'), 'name': 'Stand 321', 'location': {'coordinates': [-73.9265691, 40.8288189], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af8116'), 'name': 'Legends 100', 'location': {'coordinates': [-73.9265691, 40.8288189], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49afa3a4'), 'name': 'Gate 2 Picnic Area', 'location': {'coordinates': [-73.9265691, 40.8288189], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af8115'), 'name': 'Dugout Lounge Inseat Pantry 3B', 'location': {'coordinates': [-73.9265691, 40.8288189], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af811f'), 'name': 'Stand 110 B', 'location': {'coordinates': [-73.9265691, 40.8288189], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af811d'), 'name': 'Stand 331', 'location': {'coordinates': [-73.9265691, 40.8288189], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af8130'), 'name': "Sheppard'S Place Press Kitchen", 'location': {'coordinates': [-73.9265691, 40.8288189], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af8114'), 'name': 'Ketal One Lounge Inseat Pantry Ib', 'location': {'coordinates': [-73.9265691, 40.8288189], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af811e'), 'name': 'Stand 110 A', 'location': {'coordinates': [-73.9265691, 40.8288189], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af8119'), 'name': 'Stand 312', 'location': {'coordinates': [-73.9265691, 40.8288189], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af8113'), 'name': 'Stand 224', 'location': {'coordinates': [-73.9265691, 40.8288189], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af8110'), 'name': 'Stand 216B Delta Suite', 'location': {'coordinates': [-73.9265691, 40.8288189], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af8112'), 'name': 'Stand 217', 'location': {'coordinates': [-73.9265691, 40.8288189], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af8111'), 'name': 'Yankees Clubhouse Kitchen', 'location': {'coordinates': [-73.9265691, 40.8288189], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af812a'), 'name': 'Stand 205', 'location': {'coordinates': [-73.9265691, 40.8288189], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af810f'), 'name': 'Visitors Clubhouse Kitchen', 'location': {'coordinates': [-73.9265691, 40.8288189], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af8126'), 'name': 'Stand 107', 'location': {'coordinates': [-73.9265691, 40.8288189], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af8118'), 'name': 'Stand 310', 'location': {'coordinates': [-73.9265691, 40.8288189], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af8125'), 'name': 'Stand 334 Beer Room', 'location': {'coordinates': [-73.9265691, 40.8288189], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af811a'), 'name': 'Stand 320 - Premio', 'location': {'coordinates': [-73.9265691, 40.8288189], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af8123'), 'name': 'Stand 324', 'location': {'coordinates': [-73.9265691, 40.8288189], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af812f'), 'name': 'Audi Yankee Club', 'location': {'coordinates': [-73.9265691, 40.8288189], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af8122'), 'name': 'Stand 305', 'location': {'coordinates': [-73.9265691, 40.8288189], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af8129'), 'name': 'Stand 132', 'location': {'coordinates': [-73.9265691, 40.8288189], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af8121'), 'name': 'Stand 218A Delta Suite', 'location': {'coordinates': [-73.9265691, 40.8288189], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af8128'), 'name': 'Stand 125 Food Court', 'location': {'coordinates': [-73.9265691, 40.8288189], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49afb0f6'), 'name': 'New York Yankees Mvp Club', 'location': {'coordinates': [-73.9265691, 40.8288189], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af8132'), 'name': 'Suite Pantry Suite 4', 'location': {'coordinates': [-73.9265691, 40.8288189], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af8131'), 'name': 'Suite Pantry Suite 30', 'location': {'coordinates': [-73.9265691, 40.8288189], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af812e'), 'name': 'Stand 115', 'location': {'coordinates': [-73.9265691, 40.8288189], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af8127'), 'name': 'Stand 112', 'location': {'coordinates': [-73.9265691, 40.8288189], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af812b'), 'name': 'Stand 213', 'location': {'coordinates': [-73.9265691, 40.8288189], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af817a'), 'name': 'Bleacher Food Court', 'location': {'coordinates': [-73.9265691, 40.8288189], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af8120'), 'name': 'Stand 127 Food Court', 'location': {'coordinates': [-73.9265691, 40.8288189], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af8134'), 'name': 'Stand 232', 'location': {'coordinates': [-73.9265691, 40.8288189], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af8124'), 'name': 'Stand 318', 'location': {'coordinates': [-73.9265691, 40.8288189], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af8117'), 'name': 'Mohegan Sun Sports Bar', 'location': {'coordinates': [-73.9265691, 40.8288189], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af8133'), 'name': 'Legends 000', 'location': {'coordinates': [-73.9265691, 40.8288189], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af811b'), 'name': 'Ny Yankees Concessions (Jim Beam)', 'location': {'coordinates': [-73.9265691, 40.8288189], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af6f2a'), 'name': 'New Millenium Pizzeria', 'location': {'coordinates': [-73.9448376, 40.8240638], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af5bc7'), 'name': 'Yankee Tavern', 'location': {'coordinates': [-73.92506, 40.8275556], 'type': 'Point'}}
{'_id': ObjectId('60846f2e48673efb49afb67f'), 'name': 'Mei Ya Kitchen', 'location': {'coordinates': [-73.92493759999999, 40.8274727], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af919f'), 'name': "Eat Healthy & Bomber'S Stadium Pizza", 'location': {'coordinates': [-73.9246301, 40.8270987], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49afa240'), 'name': 'Us Fried Chicken', 'location': {'coordinates': [-73.9249324, 40.8274822], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af87ca'), 'name': "New Lam'S Garden", 'location': {'coordinates': [-73.92319560000001, 40.8234113], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af7fb6'), 'name': 'Queen Sheeba Restaurant', 'location': {'coordinates': [-73.94477479999999, 40.8208534], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af75ba'), 'name': 'Court Deli Restaurant', 'location': {'coordinates': [-73.9244796, 40.8270316], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af6d8f'), 'name': "Londel'S Supper Club", 'location': {'coordinates': [-73.9440848, 40.8194187], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af5f4d'), 'name': "Mcdonald'S", 'location': {'coordinates': [-73.9252904, 40.828054], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af9f14'), 'name': "D'Milton Restaurant", 'location': {'coordinates': [-73.9404685, 40.8299073], 'type': 'Point'}}
{'_id': ObjectId('60846f2e48673efb49afb16f'), 'name': 'Agave Mexican & American Grill', 'location': {'coordinates': [-73.94514459999999, 40.8240196], 'type': 'Point'}}
{'_id': ObjectId('60846f2e48673efb49afbe20'), 'name': '', 'location': {'coordinates': [-73.94514459999999, 40.8240196], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af81af'), 'name': 'New Golden Dragon Chinese Restaurant', 'location': {'coordinates': [-73.94514459999999, 40.8240196], 'type': 'Point'}}
{'_id': ObjectId('60846f2e48673efb49afb2ad'), 'name': 'Island Spice And Southern Cuisine', 'location': {'coordinates': [-73.9421715, 40.8172179], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49afa790'), 'name': "Checker'S", 'location': {'coordinates': [-73.9452088, 40.823885], 'type': 'Point'}}
{'_id': ObjectId('60846f2e48673efb49afba18'), 'name': "Miss Maude'S", 'location': {'coordinates': [-73.9397855, 40.8157361], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49afa93c'), 'name': 'Los Bravos', 'location': {'coordinates': [-73.9401206, 40.83016850000001], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af6138'), 'name': 'Crown Diner', 'location': {'coordinates': [-73.924914, 40.827846], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af6eb2'), 'name': 'The Dugout', 'location': {'coordinates': [-73.92516189999999, 40.8284252], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af9304'), 'name': 'Bronx Lala Pizza', 'location': {'coordinates': [-73.9244313, 40.8276846], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af7190'), 'name': "Jimbo'S Burger Palace", 'location': {'coordinates': [-73.93994789999999, 40.8155067], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af8ad8'), 'name': 'Subway', 'location': {'coordinates': [-73.924339, 40.8276619], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af5ecb'), 'name': 'El Molino Rojo Restaurant', 'location': {'coordinates': [-73.9243061, 40.8276297], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af7425'), 'name': 'Vega Alta Sports Bar', 'location': {'coordinates': [-73.9244643, 40.8279347], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af921d'), 'name': 'Pizza Stop', 'location': {'coordinates': [-73.94002669999999, 40.8153973], 'type': 'Point'}}
{'_id': ObjectId('60846f2d48673efb49af7aeb'), 'name': 'Jo Jo Pizza', 'location': {'coordinates': [-73.9244744, 40.8180032], 'type': 'Point'}}
Actividades#
Consultas espaciales en PostGIS: Escribe una consulta SQL en PostGIS que seleccione todas las subcuencas del dataset con más de 50 deslizamientos y que se encuentren a menos de 20 km de la ciudad de Medellín. Usa las funciones
ST_DWithinyST_Centroid.Carga de datos en MongoDB: Convierte el GeoDataFrame del dataset de cuencas a formato GeoJSON y carga los documentos en una colección MongoDB llamada
cuencas. Verifica la carga concollection.count_documents({}).Consulta geoespacial en MongoDB: Usando el operador
$geoWithincon$centerSphere, encuentra todas las subcuencas dentro de un radio de 100 km del centroide de Medellín. ¿Cuántas subcuencas quedan dentro de ese radio?Comparación SQL vs. NoSQL: Para la misma consulta (subcuencas con más de 50 deslizamientos ordenadas por pendiente media descendente), escribe la consulta equivalente en SQL (PostGIS) y en MongoDB. Compara la sintaxis y discute cuándo preferirías una base de datos relacional espacial (PostGIS) sobre una no relacional (MongoDB) para proyectos de análisis geoespacial.
Recursos adicionales#
Documentación oficial#
Lecturas recomendadas#
Obe, R. O. & Hsu, L. S. (2021). PostGIS in Action (3rd ed.). Manning Publications.
Chodorow, K. (2013). MongoDB: The Definitive Guide (2nd ed.). O’Reilly Media.
Boundless (2015). Introduction to PostGIS. Tutorial online