Index géo-spatiaux#
Introduction aux index géo-spatiaux#
Les index géo-spatiaux facilitent les requêtes sur des données géographiques#
Exemple d'une structure de document avec des données géographiques :
{
name: "Tour Eiffel",
location: {
type: "Point",
coordinates: [2.2945, 48.8583]
}
}
Types d'index géo-spatiaux : 2D et 2DSphere#
- Index 2D : pour des données planaires (cartésiennes)
- Convient pour des données dans un espace cartésien, comme des coordonnées [x, y] ou {x, y}
- Exemple de données plannaires:
{ name: "Point A", location: [50, 100] }
- Index 2DSphere : utilisés pour des données sphériques (géographiques) tenant compte la courbure de la Terre
- Exemple de données géographiques au format GeoJSON
{ name: "Tour Eiffel", location: { type: "Point", coordinates: [2.2945, 48.8583] } }
- Exemple de données géographiques au format GeoJSON
Création d'index 2D#
Créer un index 2D#
- Exemple :
db.places.createIndex({location: "2d"})
Format des données géographiques pour index 2D#
- Exemple 1 (format tableau) :
{location: [2, 3]}
- Exemple 2 (format objet) :
{location: {x: 2, y: 3}}
Insérer des documents avec des coordonnées géographiques#
- Exemple :
db.places.insert([{name: "A", location: [2, 3]}, {name: "B", location: [4, 6]}, {name: "C", location: [8, 2]}])
Requête pour trouver des documents à proximité d'un point donné avec un index 2D#
- Requête :
db.places.find({location: {$near: [3, 4], $maxDistance: 5}})
- Résultat : documents dont la distance de "location" au point
[3, 4]
est inférieure ou égale à 5 unités
Création d'index 2DSphere#
Créer un index 2DSphere#
- Exemple :
db.places.createIndex({location: "2dsphere"})
Format des données géographiques pour index 2DSphere (GeoJSON)#
- Point :
{type: "Point", coordinates: [<longitude>, <latitude>]}
- Polygon :
{type: "Polygon", coordinates: [[[<lon1>, <lat1>], [<lon2>, <lat2>], ..., [<lon1>, <lat1>]]]}
Exemple d'insertion et de requête avec index 2DSphere#
Insertion d'un document avec des données géographiques au format GeoJSON :
db.places.insert({
name: "Tour Eiffel",
location: {
type: "Point",
coordinates: [2.294481, 48.858158]
}
})
Création de l'index 2DSphere sur le champ "location" :
db.places.createIndex({location: "2dsphere"})
Recherche des lieux à proximité de la Tour Eiffel dans un rayon de 1 km :
db.places.find({
location: {
$near: {
$geometry: {
type: "Point",
coordinates: [2.294481, 48.858158]
},
$maxDistance: 1000
}
}
})
Requêtes géo-spatiales avec MongoDB#
Opérateur $near#
- Recherche des documents à proximité d'un point spécifique
- Exemple de commande shell :
db.places.find({
location: {
$near: {
$geometry: {
type: "Point",
coordinates: [-73.9667, 40.78] // longitude, latitude
},
$maxDistance: 1000 // distance en mètres
}
}
})
Opérateur $geoWithin#
- Recherche des documents dans une région géographique délimitée
- Exemple de commande shell :
db.places.find({
location: {
$geoWithin: {
$geometry: {
type: "Polygon",
coordinates: [
[
[-74.0, 40.7], // coordonnées des sommets
[-73.9, 40.7],
[-73.9, 40.8],
[-74.0, 40.8],
[-74.0, 40.7]
]
]
}
}
}
})
Opérateur $geoIntersects#
- Recherche des documents qui intersectent une région géographique spécifique (ex. ligne, polygone)
- Exemple de commande shell :
db.places.find({
location: {
$geoIntersects: {
$geometry: {
type: "LineString",
coordinates: [
[-74.0, 40.7], // coordonnées des points de la ligne
[-73.9, 40.7]
]
}
}
}
})