Como armazenar linhas e polígonos em documentos JSON?

24

Observando o crescente movimento NoSQL e considerando que bancos de dados como o MongoDB oferecem uma nova perspectiva em armazenamento de dados flexível para GIS. Qual é a melhor maneira de armazenar linhas e polígonos em documentos JSON para aproveitar os índices 2D e as funções espaciais?

Pablo
fonte
6
Atualmente, o MongoDB não suporta indexação em nada além de pontos, e suas funções espaciais são limitadas à localização dentro dos limites.
ACS

Respostas:

16

GeoJSON aqui estão os SPECs .

Aqui está um exemplo de uma linha e um polígono:

{ "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
fonte
9

Uma coisa a observar é que o suporte do MongoDB para tipos de dados espaciais é terrivelmente ruim para qualquer pesquisa espacial séria, e isso se aplica a todos os aspectos do NoSQL na última vez que verifiquei. Não gosto muito do GeoCouch, mas ele ainda tem um caminho a percorrer.

GeoJSON é um formato fantástico, mas para tirar proveito dos índices espaciais limitados (POINT-ONLY) no Mongo, você precisaria de uma coleção indexada espacialmente contendo apenas um registro para cada um dos pontos do polígono com um valor adicional para o ID do registro do seu registro espacial vivendo em outra coleção, use uma consulta de caixa delimitadora para obter IDs de registro de um e selecionar do outro, emulando efetivamente uma associação.

Você pode ficar pirateado e apenas fazer os cantos da caixa delimitadora como pontos para seus registros, mas as pesquisas da caixa delimitadora podem falhar e tudo isso força alguns padrões de design bastante ineficientes e atribui inadequadamente todos os tipos de responsabilidades ao desenvolvedor.

Como uma implementação de referência, você pode consultar este código que foi apresentado na Esri Developer Summit este ano.

Não fiquei nada satisfeito com o suporte espacial nos vários bancos de dados NoSQL. Eles só vão longe o suficiente para pesquisar na nuvem de pontos, o que faz sentido, considerando que a maioria dos aplicativos que usam isso está apenas inserindo pinos no mapa do Google em um navegador em algum lugar. O PostGIS ainda será o melhor cavalo de batalha de código aberto para gerenciar informações espaciais no futuro próximo.

Jason Scheirer
fonte
9

Isto simplesmente não é verdade,

"para tirar proveito dos índices espaciais no Mongo, você precisaria de uma coleção espacialmente indexada que não contenha nada além de um registro para cada um dos pontos do polígono, com um valor adicional para o ID do registro espacial do seu registro espacial vivendo em outra coleção e use um consulta de caixa delimitadora para obter IDs de registro de uma [coleção] e selecionar [dados do registro] da outra [coleção], emulando efetivamente uma associação ".

Eu tenho dados de ponto USGS armazenados em uma única coleção Mongo com registros parecidos com este:

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

Eu sou capaz de fazer consultas de caixa delimitadora nesses dados que retornam todo o registro (sem a necessidade de outra coleção).

Inquerir:

> 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);

Resposta:

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

O Mongo também oferece a capacidade de fazer pesquisas de vizinhos mais próximos, bem como apontar pesquisas de polígonos. Isso está bem documentado em mongodb.org

lagerratrobe
fonte
Desculpas, mas estou confuso, o MongoDB pode ou não pode criar um índice espacial nas coleções de recursos de linha e polígono?
Derek Swingley
2
No momento, não é possível criar um índice espacial nos recursos de linha e polígono. No entanto, ele pode fazer uma pesquisa point-in-polygon em uma tabela com pontos, se você fornecer a geometria do polígono como parte da consulta. mongodb.org/display/DOCS/…
lagerratrobe
11
OK, então a afirmação: "GeoJSON é um formato fantástico, mas tirar proveito dos índices espaciais limitados (POINT-ONLY) no Mongo" é realmente verdade porque o Mongo pode apenas indexar espacialmente pontos.
Derek Swingley
Concordo que uma parte dessa sentença é precisa, "índices espaciais limitados (apenas para pontos)". Então, 5 de 71 palavras, ou 7%. Isso deixa 93% incorreto. Eu estou por trás da minha declaração.
Lagerratrobe
11
Você pode editar sua resposta para esclarecer? Como é, é confuso e enganoso. Em relação à outra parte da declaração, isso não é basicamente apenas uma sugestão para implementar um índice espacial para dados não pontuais? Pode não ser o ideal ou o ideal, mas é apenas uma sugestão. Elaborar por que você acha que a maioria dessa afirmação está errada também ajudaria.
Derek Swingley