Я собираю информацию о местоположении из разных источников и храню все в коллекции MongoDb. Помимо местоположений точек с едиными координатами широты и долготы, я также сохраняю области.

Теперь одни данные дают мне информацию о местоположении как GeometryCollection, но со всеми элементами Polygons. Другой источник данных дал мне местоположение как MultiPolygon. Хотя я на самом деле подумываю создать коллекцию для каждого источника данных, мне интересно, какой подход в целом лучше.

GeometryCollection, безусловно, более гибкий, но, возможно, MultiPolygon показывает лучшую производительность запроса (учитывая, что я всегда создаю индекс 2dspehere над полем местоположения). Стоит ли преобразовывать одно представление в другое?

1
Christian 25 Сен 2018 в 14:05

2 ответа

Лучший ответ

Хорошие новости: производительность запросов и индексируемость одинаковы в MongoDB для всех поддерживаемых типов GeoJSON.

Основным фактором, определяющим ваше решение, должно быть то, должна ли ваша информационная архитектура для географического поля и программное обеспечение, которое его использует, содержать больше типов, чем просто многоугольники. Вы говорите, что храните точечные локации? Если вы хотите хранить все геоданные в одном поле, например location (и, вероятно, с индексом 2dsphere), тогда вам понадобится GeometryCollection, в который вы можете поместить Point и MultiPolygon. Это рекомендуется в спецификации GeoJSON https://tools.ietf.org/html/rfc7946 # page-9 не для вложения GeometryCollection, поэтому для тех источников данных, которые дают вам GeometryCollection, вы должны перебирать содержимое и заполнять собственное {{X6} } который также содержит ваши Point и т. д.

Если вы храните точки отдельно, например eventCenter отдельно от eventAreasEffected, тогда eventCenter может быть просто Point, а eventAreasEffected может быть одним «Мультиполигоном»; нет необходимости в GeometryCollection. Совершенно нормально иметь geo более чем в одном поле и иметь или не иметь несколько индексов 2dsphere для этих полей. Начиная с MongoDB 4.0, вы можете использовать $geoNear в коллекции, которая имеет более одного индекса 2dsphere, включив опцию key.

Вот неофициальный, но разумный подход к определению: MultiPolygon - это не произвольный набор Polygon, а скорее единая «концепция формы», которая имеет непересекающиеся многоугольники. Соединенные Штаты можно описать одним MultiPolygon, в котором есть Аляска, Гавайи, континентальные США, возможно, Пуэрто-Рико и т. Д. Фактически, с этой целью вы заметите, что хранить данные немного сложнее. относится к каждому члену MultiPolygon, потому что coordinates может быть только массивом массивов точек. Например, информация о третьем многоугольнике должна передаваться в одноранговом поле в одно поле верхнего уровня coordinates. Но дискретный массив из Polygon или GeometryCollection из Polygon может хранить дополнительную информацию в каждой фигуре. Обратите внимание, что ни GeoJSON, ни MongoDB не запрещают вам добавлять поля в дополнение к type и coordinates для каждой формы.

Более тонкий вопрос - это конструкция и семантика GeometryCollection Polygon по сравнению с MultiPolygon. Еще больше усложняет ситуацию проблема явных дыр, определенных в Polygon, по сравнению с набором неявно "многоуровневых" Polygon, которые пост-обрабатываются вне БД программным обеспечением геолокации.

1
Buzz Moschetti 6 Окт 2018 в 15:19

Проблема с этой темой в том, что нет хорошего ответа. все дело в том, что вы предпочитаете или что вам нужно. вот отличный ответ, написанный на stackExchange.

Многоугольник против многополигона https://gis.stackexchange.com/ вопросы / 225368 / понимание разности- между - многоугольник - и - мультиполигон - для - шейпфайлы -в- QGIS

И я не знаю о GeometryCollection, поэтому ничего не могу вам сказать об этом. но эта ссылка откроет вам много информации.

0
Lars Hendriks 25 Сен 2018 в 12:08