Поиск по координатам в MongoDB
Есть одна коллекция в монго, там лежат документы, каждый из которых содержит array coordinates, например [59.952673, 30.293132]. Для поиска по этим координатам я использую индекс 2dsphere. И ищу с помощью запроса:
db.objects.find({coordinates: {$nearSphere: {$geometry: {
type: "Point",
coordinates: [59.952673, 30.293132]},
$maxDistance: 100
}}}).limit(5)
Для указаннх координатов все работает корректно. Например вот результат поиска в гугл, это существующие координаты. Но при этом, также существующие координаты [64.89633499999999, 141.724606] выдают ошибку:
db.objects.find({coordinates: {$nearSphere: {$geometry: {
type: "Point",
coordinates: [64.89633499999999, 141.724606]},
$maxDistance: 100
}}}).limit(5)
[2022-09-30 15:43:49] Query failed with error code 2 and error message 'invalid point in geo near query $geometry argument: { type: "Point", coordinates: [ 64.89633499999999, 141.724606 ] } longitude/latitude is out of bounds, lng: 64.8963 lat: 141.725'
Что я делаю не так? Почему в одном случае координаты корректны, а в другом они is out of bounds?
Ответы (1 шт):
В сообщении сказано:
Query failed with error code 2 and error message 'invalid point in geo near query $geometry argument: { type: "Point", coordinates: [ 64.89633499999999, 141.724606 ] } longitude/latitude is out of bounds, lng: 64.8963 lat: 141.725'
Что здесь важно?
Важен порядок следования параметров longitude/latitude (или долгота/широта)
и то как он распознал ваши координаты:
lng: 64.8963
lat: 141.725
или
долгота: 64.8963
широта: 141.725
А как известно координаты, измеряемые в градусах имеют следующий диапазон:
- широта от −90° до +90°
- долгота от −180° до +180°
В Вашем случае широта (которая может находится в диапазоне от -90 до +90) имеет значение 141.725, которые выходят за рамки данного диапазона.
Предположу, что Вы перепутали местами значения широты и долготы из-за неопределенности в порядке следования данных параметров в разных системах отсчета.
Поэтому просто поменяйте порядок указания значений координат в ваших запросах и перепроверьте, что данные уже занесенные в базу данных имеют корректные координаты (вполне возможно, что они также указаны в неверном порядке.)