Как хранить линии и полигоны в документах JSON?

24

Глядя на растущее движение NoSQL и учитывая, что базы данных, такие как MongoDB, предлагает новую перспективу в гибком хранилище данных для ГИС. Как лучше всего хранить линии и многоугольники в документах JSON, чтобы использовать преимущества двумерных индексов и пространственных функций?

Pablo
источник
6
MongoDB в настоящее время не поддерживает индексирование для чего-либо, кроме точек, и его пространственные функции ограничены поиском в пределах границ.
SCW

Ответы:

16

GeoJSON вот спецы .

Вот пример линии и многоугольника:

{ "type": "FeatureCollection",
  "features": [
    { "type": "Feature",
      "geometry": {"type": "Point", "coordinates": [102.0, 0.5]},
      "properties": {"prop0": "value0"}
      },
    { "type": "Feature",
      "geometry": {
        "type": "LineString",
        "coordinates": [
          [102.0, 0.0], [103.0, 1.0], [104.0, 0.0], [105.0, 1.0]
          ]
        },
      "properties": {
        "prop0": "value0",
        "prop1": 0.0
        }
      },
    { "type": "Feature",
       "geometry": {
         "type": "Polygon",
         "coordinates": [
           [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0],
             [100.0, 1.0], [100.0, 0.0] ]
           ]
       },
       "properties": {
         "prop0": "value0",
         "prop1": {"this": "that"}
         }
       }
     ]
   }
CaptDragon
источник
9

Следует отметить, что поддержка MongoDB пространственных типов данных ужасно плоха для любого серьезного пространственного поиска, и это применимо ко всем аспектам с NoSQL, когда я проверял последний раз. Я немного не люблю GeoCouch, но у него еще есть путь.

GeoJSON - фантастический формат, но чтобы воспользоваться ограниченными пространственными индексами (POINT-ONLY) в Mongo, вам понадобится пространственно проиндексированная коллекция, содержащая только запись для каждой из точек многоугольника с дополнительным значением для идентификатора записи вашего Пространственная запись, находящаяся в другой коллекции, затем используйте ограничивающий прямоугольник для получения идентификаторов записей из одного и выбора из другого, эффективно эмулируя объединение.

Вы можете пойти не так, как надо, и просто сделать углы ограничивающего прямоугольника точками для своих записей, но тогда поиск ограничивающего прямоугольника может потерпеть неудачу, и в целом это вызовет некоторые довольно неэффективные шаблоны проектирования и ненадлежащим образом возлагает все виды ответственности на разработчика.

В качестве эталонной реализации вы можете обратиться к этому коду, который был представлен на Саммите разработчиков Esri в этом году.

Я совсем не был доволен пространственной поддержкой различных баз данных NoSQL. Они заходят достаточно далеко для поиска в тупых облаках, что имеет смысл, учитывая, что большинство приложений, использующих это, просто сбрасывают метки на карте Google в браузере. PostGIS по-прежнему будет лучшей рабочей лошадкой с открытым исходным кодом для управления пространственной информацией в обозримом будущем.

Джейсон Шайрер
источник
9

Это просто неправда,

«Чтобы воспользоваться пространственными индексами в Mongo, вам понадобится пространственно проиндексированная коллекция, содержащая только запись для каждой точки многоугольника, с дополнительным значением для идентификатора записи вашей пространственной записи, находящейся в другой коллекции, а затем используйте ограничивающий запрос, чтобы получить идентификаторы записей из одной [коллекции] и выбрать [записи данных] из другой [коллекции], эффективно эмулируя объединение. "

У меня есть данные точек USGS, хранящиеся в одной коллекции Mongo с записями, которые выглядят так:

> db.names.find({FEATURE_NAME: 'Mount Saint Helens', STATE_ALPHA: 'WA'})       
{ "_id" : ObjectId("4e262106d7a99b7db41a4919"), 
"_ID" : 1525360, 
"FEATURE_NAME" : "Mount Saint Helens", 
"FEATURE_CLASS" : "Summit", 
"STATE_ALPHA" : "WA", 
"STATE_FIPS" : 53, 
"COUNTY_NAME" : "Skamania", 
"COUNTY_FIPS" : "059", 
"COORDS" : [ -122.1944, 46.1912 ], 
"ELEV_IN_FT" : "8356" }

Я могу выполнять ограничивающие запросы к этим данным, которые возвращают всю запись (без необходимости в другой коллекции).

Запрос:

> box = [[-126.562500,45.089036], [-123.750000,47.040182]]
[ [ -126.5625, 45.089036 ], [ -123.75, 47.040182 ] ]
> db.names.find({"COORDS" : {"$within" : {"$box" : box}}, FEATURE_CLASS: "Summit"}, {FEATURE_NAME: true, COUNTY_NAME: true, STATE_ALPHA: true, ELEV_IN_FEET: true}).limit(5);

Отклик:

{ "_id" : ObjectId("4e2620f8d7a99b7db4146cec"), "FEATURE_NAME" : "Harlocker Hill", "STATE_ALPHA" : "OR", "COUNTY_NAME" : "Coos" }
{ "_id" : ObjectId("4e2620f8d7a99b7db414a349"), "FEATURE_NAME" : "Neskowin Crest", "STATE_ALPHA" : "OR", "COUNTY_NAME" : "Tillamook" }
{ "_id" : ObjectId("4e2620f8d7a99b7db414a105"), "FEATURE_NAME" : "Miles Mountain", "STATE_ALPHA" : "OR", "COUNTY_NAME" : "Tillamook" }
{ "_id" : ObjectId("4e2620f8d7a99b7db414934a"), "FEATURE_NAME" : "Mount Gauldy", "STATE_ALPHA" : "OR", "COUNTY_NAME" : "Tillamook" }
{ "_id" : ObjectId("4e2620f8d7a99b7db4149d06"), "FEATURE_NAME" : "Little Hebo", "STATE_ALPHA" : "OR", "COUNTY_NAME" : "Yamhill" }

Mongo также предоставляет возможность выполнять поиск ближайших соседей, а также указывать в поисках полигонов. Это хорошо задокументировано на mongodb.org

lagerratrobe
источник
Извините, но я в замешательстве, MongoDB может или не может создать пространственный индекс для линейных и полигональных коллекций объектов?
Дерек Суингли
2
В настоящее время он не может создать пространственный индекс для линейных и полигональных объектов. Тем не менее, он может выполнять поиск точки-полигона в таблице с точками в ней, если вы предоставляете геометрию многоугольника как часть запроса. mongodb.org/display/DOCS/…
lagerratrobe
1
Итак, утверждение: «GeoJSON - фантастический формат, но использовать ограниченные (POINT-ONLY) пространственные индексы в Mongo» на самом деле верно, потому что Mongo может только пространственно индексировать точки.
Дерек Суингли
Я признаю, что часть этого предложения является точной, «ограниченные (ТОЛЬКО ТОЧНО) пространственные индексы». Так что 5 из 71 слов или 7%. Это оставляет 93% из этого неправильным. Я поддерживаю свое заявление.
Лагерратроб
1
Можете ли вы отредактировать свой ответ, чтобы уточнить? Это сбивает с толку и вводит в заблуждение. Что касается другой части утверждения, разве это не просто предложение для реализации пространственного индекса для неточечных данных? Это не может быть идеальным или оптимальным, но это всего лишь предложение. Подробная информация о том, почему вы считаете, что большинство из этих утверждений неверны, также поможет.
Дерек Свингли