Як зберігати лінії та багатокутники в документах JSON?


24

Дивлячись на зростаючий рух NoSQL і враховуючи, що такі бази даних, як MongoDB, пропонують нову перспективу в гнучкому зберіганні даних для ГІС. Який найкращий спосіб зберігати лінії та багатокутники в документах JSON, щоб скористатися 2d-індексами та просторовими функціями?


6
На даний момент MongoDB не підтримує індексацію на чомусь, окрім точок, і його просторові функції обмежені знаходженням у межах.
scw

Відповіді:


16

GeoJSON ось SPEC .

Ось приклад лінії та багатокутника:

{ "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"}
         }
       }
     ]
   }

9

Варто зазначити, що підтримка MongoDB для просторових типів даних жахливо погана для будь-якого серйозного просторового пошуку, і це стосується всієї програми з NoSQL востаннє, коли я перевіряв. Мені не подобається GeoCouch трохи менше, але він все ще має шлях.

GeoJSON - це фантастичний формат, але щоб скористатися обмеженими (POINT-ONLY) просторовими індексами в Монго, вам знадобиться просторово індексована колекція, що не містить нічого, крім запису для кожної точки полігону з додатковим значенням для ідентифікатора запису вашого просторовий запис, що живе в іншій колекції, а потім використовуйте запит на обмежувальний ящик, щоб отримати ідентифікатори записів з одного та вибрати з іншого, ефективно імітуючи приєднання.

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

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

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


9

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

"щоб скористатися просторовими індексами в Монго, вам знадобиться просторово індексована колекція, що не містить нічого, крім запису для кожної з точок полігону, з додатковим значенням для ідентифікатора запису вашого просторового запису, що живе в іншій колекції, а потім використовуйте запит на обмежувальний ящик, щоб отримати ідентифікатори запису з однієї [колекції] та вибрати [запис даних] з іншого [колекція], ефективно імітуючи з'єднання. "

У мене є точкові дані 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


Вибачте, але я розгублений, MongoDB може чи не може створити просторовий індекс на колекціях ліній і полігонів?
Дерек Свінглі

2
Наразі він не може створити просторовий індекс на лініях та полігонах. Однак він може здійснювати точковий багатокутник на таблиці з точками в ньому, якщо ви вказали геометрію багатокутника як частину запиту. mongodb.org/display/DOCS/…
lagerratrobe

1
Гаразд, тому твердження: "GeoJSON - це фантастичний формат, але скористатися обмеженими (POINT-ONLY) просторовими індексами в Монго" насправді вірно, оскільки Монго може лише просторово вказувати точки.
Дерек Свінглі

Я підтверджую, що частина цього речення є точною, "обмеженою (POINT-ONLY) просторовими індексами". Так 5 із 71 слова, або 7%. Це залишає 93% неправильних. Я стою за своєю заявою.
lagerratrobe

1
Чи можете ви відредагувати свою відповідь, щоб уточнити? Як це, це заплутано і вводить в оману. Що стосується іншої частини висловлювання, чи це в основному не лише пропозиція щодо реалізації просторового індексу для неточкових даних? Це може бути не ідеальним чи оптимальним, але це лише пропозиція. Пояснення, чому ви вважаєте, що більшість цих тверджень є неправильним, також допоможе.
Дерек Свінглі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.