Jeśli podczas próby utworzenia indeksu 2dsphere w MongoDB pojawia się błąd „długość/szerokość geograficzna jest poza granicami”, może to być spowodowane niewłaściwą kolejnością współrzędnych długości i szerokości geograficznej.
Kiedy tworzysz obiekt GeoJSON, musisz najpierw podać długość geograficzną, a następnie szerokość geograficzną.
- Prawidłowe wartości długości geograficznej mieszczą się w przedziale
-180i180, zarówno włącznie. - Prawidłowe wartości szerokości geograficznej mieszczą się w przedziale
-90i90, zarówno włącznie.
Dlatego jeśli otrzymujesz błąd „długość/szerokość geograficzna jest poza granicami”, sprawdź dokumenty, aby zobaczyć, w jakiej kolejności są współrzędne szerokości i długości geograficznej.
Przykład błędu
Oto przykład kolekcji o nazwie bars który zawiera dokumenty ze współrzędnymi w złej kolejności.
{
"_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
]
}
}
Jeśli spróbujemy utworzyć indeks 2dsphere w location pole, otrzymamy błąd.
Przykład:
db.bars.createIndex(
{ location : "2dsphere" }
) Wynik:
{
"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"
} Przykład z prawidłową kolejnością współrzędnych
Oto kolekcja ponownie, z wyjątkiem współrzędnych w prawidłowej kolejności:
{
"_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
]
}
}
Teraz utwórzmy indeks 2dsphere w location pole:
db.bars.createIndex(
{ location : "2dsphere" }
) Wynik:
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
} Oznacza to, że został stworzony.
Możemy to sprawdzić za pomocą getIndexes() metoda:
db.bars.getIndexes() Wynik:
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_"
},
{
"v" : 2,
"key" : {
"location" : "2dsphere"
},
"name" : "location_2dsphere",
"2dsphereIndexVersion" : 3
}
]