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 мог сделать это, но, поскольку это может быть вычислительно дорогая операция, даже с моделью трапеции, это следует делать один раз при вставке, а не при поиске.

Другие вопросы по тегам