Поиск по координатам в 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, которые выходят за рамки данного диапазона.

Предположу, что Вы перепутали местами значения широты и долготы из-за неопределенности в порядке следования данных параметров в разных системах отсчета.

Поэтому просто поменяйте порядок указания значений координат в ваших запросах и перепроверьте, что данные уже занесенные в базу данных имеют корректные координаты (вполне возможно, что они также указаны в неверном порядке.)

→ Ссылка