Результат команды MongoDB geoNear в километрах

Я использую mongoDB для хранения данных о местоположении GPS в виде этого документа GeoJSON.

{"тип" : "точка", "координаты" : [33.313183, 44.465632]}

{"тип" : "точка", "координаты" : [33.2926487, 44.4159651]}

Обновление: я также обеспечил индекс 2dspher, как показано ниже.

db.test.ensureIndex( { loc : "2dsphere" } )

Я получил координаты с карт Google. Теперь, если я ищу с помощью этой команды, я не могу преобразовать полученные расстояния в километры.

db.runCommand({geoNear: 'test', spherical: true, near: {type: "Point" , coordinates: [33.2926487, 44.4159651]}})

результат следующий

"results" : [
    {
        "dis" : 0.0033427770982422957,
        "obj" : {
            "_id" : ObjectId("54a96f348fa05fcaed637a22"),
            "loc" : {
                "type" : "Point",
                "coordinates" : [
                    33.2926487,
                    44.4159651
                ]
            }
        }
    },
    {
        "dis" : 5764.7060911604085,
        "obj" : {
            "_id" : ObjectId("54a96f4c8fa05fcaed637a23"),
            "loc" : {
                "type" : "Point",
                "coordinates" : [
                    33.313183,
                    44.465632
                ]
            }
        }
    }
]

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

второе значение, которое я не могу преобразовать в километры, в калькуляторе расстояний Google составляет около 5,26 км.


person Shweelan Leon Sam    schedule 04.01.2015    source источник


Ответы (3)


Расстояния возвращаются в метрах. Чтобы преобразовать в километры, разделите на 1000. Вы можете заставить MongoDB сделать это, используя опцию distanceMultiplier:

db.runCommand({ "geoNear" : "test", "spherical" : true, "distanceMultiplier" : 0.001, "near" : { "type" : "Point" , "coordinates" : [33.2926487, 44.4159651] } })
person wdberkeley    schedule 05.01.2015
comment
Это кажется наиболее близким ответом на фактическое расстояние, но в документации geoNear упоминается, что расстояние находится в радианте, и если я хочу преобразовать, я должен умножить на земной радиус Земли. что ты думаешь? - person Shweelan Leon Sam; 05.01.2015
comment
Здесь не в радианах. Расстояние в радианах между двумя точками на Земле никогда не может превышать 2 * пи. Радианы возвращаются при использовании устаревших пар координат. - person wdberkeley; 06.01.2015

Продолжая исследовать эту проблему, я обнаружил, что существует два типа хранения очков.

устаревшая точка как этот формат

db.test2.insert({location: [33.313183, 44.465632]})

и GeoJSON указывают как этот формат

db.test.insert({location: {"type" : "Point", "coordinates" : [33.313183, 44.465632]}})

если мы используем устаревшую точку, результат будет в радианах, поэтому мы конвертируем его в километры, используя этот оператор

db.runCommand({geoNear: 'test2', spherical: true, near: [33.2926487, 44.4159651], distanceMultiplier: 6371})

если мы используем точку GeoJSON, результат будет в метрах, поэтому мы конвертируем его в километры, используя это утверждение в качестве ответа на этот вопрос.

db.runCommand({geoNear: 'test', spherical: true, near: {type: "Point" , coordinates: [33.2926487, 44.4159651]}, distanceMultiplier: 0.001})

решение в случае формата точки GeoJSON

для получения более подробной информации проверьте эту ссылку, отчет об ошибке в MongoDB, который все объясняет.

person Shweelan Leon Sam    schedule 05.01.2015

Вы проиндексировали поле как 2dsphere. Это может объяснить несоответствие, поскольку вы запрашиваете как sphere: true

person jtmarmon    schedule 04.01.2015
comment
Да, я уже добавил индекс 2dsphere, используя db.test.ensureIndex({loc: 2dsphere}) - person Shweelan Leon Sam; 05.01.2015