mongodb $geoIntersects или $ geo, где точка совпадает с несколькими полигонами - сортировка по области?
У меня есть запрос Монго, который проверяет, находится ли точка внутри многоугольника.
neighborhood = db.collection.findOne({
loc: {$geoInteresects: {$geometry: {
type: 'Point',
coordinates: [lng, lat]
}}}
})
В настоящее время все мои полигоны - это просто один уровень, окрестность, и ни один из них не перекрывается.
Я хотел бы начать хранить данные о городе, округе и стране в одной коллекции. Очевидно, что я могу изменить findOne на find и изменить код соответствующим образом, но, в частности, я хочу, чтобы результаты сортировали совпадения, чтобы результаты были такими: [ "Downtown", "San Francisco", "California", " США "," Северная Америка "]
и это тривиально для меня, чтобы построить хорошую строку из этого.
Мои многоуровневые полигоны еще не установлены, поэтому я не тестировал.
Я знаю, что оператор $near возвращает ближайшие точки к объекту и может выполнять сортировку, но, исходя из прочтения документации, я предполагаю, что, поскольку моя контрольная точка находится внутри полигона, порядок сортировки будет неопределенным, и я также запускаю а также риск попадания в близлежащие полигоны, поэтому мне нужно было бы проверить вторые геопересекающиеся объекты, чтобы убедиться, что мы не внутри них.
1 ответ
Так что я решил это по-другому. Расчет площадей географических объектов должен выполняться заранее, при заполнении указателя.
Я написал код для вычисления площади и границ для каждого многоугольника и вставки в коллекцию, чтобы можно было использовать обычную сортировку вместе с ее индексами.
db.collection.find({
loc: {$geoInteresects: {$geometry: {
type: 'Point',
coordinates: [lng, lat]
}}}).sort({'properties.area': 1})
всегда будет давать наименьший многоугольник, который нам соответствует. Было бы замечательно, если бы Mongo мог сделать это, но, поскольку это может быть вычислительно дорогая операция, даже с моделью трапеции, это следует делать один раз при вставке, а не при поиске.