Si vous obtenez une erreur "longitude/latitude est hors limites" lorsque vous essayez de créer un index 2dsphere dans MongoDB, cela peut être dû au fait que vos coordonnées de longitude et de latitude sont dans le mauvais ordre.
Lorsque vous créez un objet GeoJSON, vous devez d'abord indiquer la longitude, puis la latitude.
- Les valeurs de longitude valides sont comprises entre
-180
et180
, tous deux inclus. - Les valeurs de latitude valides sont comprises entre
-90
et90
, tous deux inclus.
Par conséquent, si vous obtenez l'erreur "longitude/latitude est hors limites", vérifiez vos documents pour voir dans quel ordre se trouvent les coordonnées de latitude et de longitude.
Exemple d'erreur
Voici un exemple de collection appelée bars
qui contient des documents avec des coordonnées dans le mauvais ordre.
{ "_id" : 1, "name" : "Boardwalk Social", "location" : { "type" : "Point", "coordinates" : [ -16.919297718553366, 145.77675259719823 ] } } { "_id" : 2, "name" : "The Downunder Bar", "location" : { "type" : "Point", "coordinates" : [ -16.92107838010542, 145.77621640842125 ] } }
Si nous essayons de créer un index 2dsphere sur le location
champ, nous obtiendrons une erreur.
Exemple :
db.bars.createIndex(
{ location : "2dsphere" }
)
Résultat :
{ "ok" : 0, "errmsg" : "Index build failed: 2bb26869-1dec-4484-b554-3ba55fc0c0de: Collection krankykranes.bars ( e1a99ee2-b77c-41a4-b833-25c4b3c599c3 ) :: caused by :: Can't extract geo keys: { _id: 1.0, name: \"Boardwalk Social\", location: { type: \"Point\", coordinates: [ -16.91929771855337, 145.7767525971982 ] } } longitude/latitude is out of bounds, lng: -16.9193 lat: 145.777", "code" : 16755, "codeName" : "Location16755" }
Exemple avec un ordre de coordonnées correct
Voici à nouveau la collection, sauf avec les coordonnées dans le bon ordre :
{ "_id" : 1, "name" : "Boardwalk Social", "location" : { "type" : "Point", "coordinates" : [ 145.77675259719823, -16.919297718553366 ] } } { "_id" : 2, "name" : "The Downunder Bar", "location" : { "type" : "Point", "coordinates" : [ 145.77621640842125, -16.92107838010542 ] } }
Créons maintenant un index 2dsphere sur location
champ :
db.bars.createIndex(
{ location : "2dsphere" }
)
Résultat :
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
Cela signifie qu'il a été créé.
Nous pouvons vérifier cela avec le getIndexes()
méthode :
db.bars.getIndexes()
Résultat :
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "location" : "2dsphere" }, "name" : "location_2dsphere", "2dsphereIndexVersion" : 3 } ]