Как получить расстояние или радиан между двумя точками на земле с lng и lat?Как получить расстояние или радиан между двумя точками на земле с lng и lat?
ответ
https://github.com/mongodb/mongo/blob/master/src/third_party/s2/s2latlng.cc#L37
GetDistance() Возвращает S1Angle, S1Angle :: радиан() вернет радиан.
Это принадлежит библиотеке s2-geometry-library (google code), я экспортирую ее в мой github. Java).
Вы, вероятно, не хотят mapReduce
в этом случае, но на самом деле в aggregation framework. Помимо общего запроса первого этапа, вы можете запускать через $geoNear
, который более эффективен в вашей цели.
db.places.aggregate([
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [ -88 , 30 ]
},
"distanceField": "dist"
}},
{ "$match": {
"loc": {
"$centerSphere": [ [ -88 , 30 ] , 0.1 ]
}
}}
])
Или откровенно, потому что первоначальный $geoNear
этап будет «проект» дополнительное поле в документ, содержащий «расстояние» от запрошенных «мест происхождения», то вы можете просто «фильтр» на этом элемент в последующий этап:
db.places.aggregate([
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [ -88 , 30 ]
},
"distanceField": "dist"
}},
{ "$match": {
"dist": { "$lte": 0.1 }
}}
])
Поскольку это один вариант, который может «произвести/проект» значение, представляющее расстояние в результате то, что удовлетворяет свои первые критерии. «Цепочный» характер «структуры агрегации» позволяет «дополнительную фильтрацию» или любую другую операцию, которую необходимо выполнить после фильтрации исходного запроса.
Так $geoWithin
работает так же, как и в рамках агрегации под стадией $match
, как и в любом стандартном запросе, поскольку он не «зависит» от «индекса» геопространственного происхождения. Он работает лучше в исходном запросе с одним, но ему это не нужно.
Поскольку ваше требование - это «расстояние» от места происхождения, то наиболее логичным является выполнение операции, которая вернет такую информацию. Как это делает.
Хотелось бы включить все соответствующие ссылки в этот ответ, но, как новый ответчик, тогда две ссылки - это все, на что мне разрешено. более
Одна соответствующая пометка:
Измерение «расстояния» или «радиус» в любой операции зависит от того, как хранятся ваши данные. Если он находится в формате «наследие» или «ключ/пара или простой массив», тогда значение будет выражено в «радианах», в противном случае, когда данные выражаются в формате GeoJSON в «местоположении», тогда «данные расстояния» выраженное в «метрах».
Это важное соображение, учитывая библиотеки, реализованные службой MongoDB, и то, как это взаимодействует с данными по мере их хранения. Конечно, есть документация об этом в официальных ресурсах, если вы позаботились об этом правильно. И снова, я не могу добавить эти ссылки в это время, если в этом ответе не появится какая-то очень необходимая любовь.
Мне действительно нужна работа с mapreduce, а не структура агрегации. Может быть, название должно быть «как получить расстояние между двумя точками на земле с lng и lat?» mongodb решил эту проблему. Итак, я хочу знать, как он решил эту проблему. – cola
@cola Проблема в том, что только операция '$ geoNear', упомянутая и другая отдельная командная форма geoNear, - единственный способ вернуть проецируемое« расстояние »между точкой, и нет способа вызвать это с помощью mapReduce. Я мог заметить, что вы действительно не просите ничего, кроме «как вернуть расстояние», что, конечно, имеет место. Для расчета расстояния в противном случае вам необходимо будет указать необходимый код JavaScript. Скорее всего, агрегирование будет лучшим подходом к тем результатам, которые вы хотите в любом случае. Это, конечно, быстрее. –
Большое спасибо за вашу помощь! Но мне действительно нужно «как получить расстояние или радиан между двумя точками на земле с lng и lat?» , Мое кластер - кластер хаопов вместо mongodb. Моя задача - автономный и пакетный процесс. Итак, я уверен, что мне не нужен mongodb. Я попытался найти «как получить расстояние или радиан между двумя точками на земле с lng и lat?» в источнике mongodb, но не найти. Итак, мне нужна помощь. – cola