Aller au contenu

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]
        }
      }
      

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]
        ]
      }
    }
  }
})