Почему координаты многоугольных объектов GeoJSON хранятся в массиве массивов?

Как видно из официальной документации, структура полигонального объекта GeoJSON выглядит следующим образом: показано ниже:

db.someCollection.insert({
  type: "Polygon",
  coordinates: [[[0, 0], [3, 6], [6, 1], [0, 0]]]
});

почему это не так просто, как показано ниже:

Тип А

db.someCollection.insert({
  type: "Polygon",
  coordinates: [[0, 0], [3, 6], [6, 1], [0, 0]]
});

Я предполагаю, что причиной может быть хранение нескольких геозон. Что-то вроде этого:

Тип Б

db.someCollection.insert({
  type: "Polygon",
  coordinates: [
    [[0, 0], [3, 6], [6, 1], [0, 0]],
    [[1, 1], [3, 6], [6, 1], [1, 1]]
  ]
});

Причина, по которой я разместил этот вопрос, заключается в том, что я предполагаю, что мое предположение неверно после использования некоторых функций в Mongo DB (например, $geoIntersects и $geoWithin), которые требуют, чтобы структура была в формате Type A.


person Dheemanth Bhat    schedule 24.10.2017    source источник


Ответы (1)


MongoDB не определяет формат GeoJSON. Вместо этого он был определен в стандарте: RFC7946.

Это соответствующий раздел о полигонах в RFC: https://tools.ietf.org/html/rfc7946#section-3.1.6, где говорилось:

  • Для типа «Многоугольник» элемент «координаты» ДОЛЖЕН быть массивом линейных массивов кольцевых координат.

  • Для многоугольников с более чем одним из этих колец первое ДОЛЖНО быть внешним кольцом, а все остальные ДОЛЖНЫ быть внутренними кольцами. Внешнее кольцо ограничивает поверхность, а внутренние кольца (если они есть) ограничивают отверстия внутри поверхности.

Где линейное кольцо определяется как:

  • Линейное кольцо представляет собой замкнутую строку LineString с четырьмя или более позициями.

А LineString — это https://tools.ietf.org/html/rfc7946#section-3.1.4:

  • Для типа «LineString» элемент «координаты» представляет собой массив из двух или более позиций.

В основном многоугольник определяется как серия замкнутых LineString, где первая LineString определяет границы многоугольника, а последующие LineString определяют «дыры» в первой LineString.

Определив таким образом, можно создать форму пончика с многоугольником.

Этот тип конструкции возможен только в том случае, если он представлен в виде массива массивов, следовательно, является стандартом.

person kevinadi    schedule 25.10.2017