Converter Geojson multipolígono em vários polígonos geojson?

9

Vejo muitas perguntas passando de Polygonspara MultiPolygon, mas existe alguma maneira fácil de fazer o contrário? Também seria útil preservar os atributos do MultiPolygonpara aplicar ao novo Polygons.

Ouwen Huang
fonte
1
Em que contexto? Nodejs, openlayers, banco de dados etc.
John Powell
Eu tenho Postgis e NodeJS disponíveis para este projeto
Ouwen Huang
Deseja manter as propriedades do multipolígono nos novos polígonos?
John Powell
O que você quer dizer? Como o tipo de projeção?
Ouwen Huang
Não, isso se aplica a toda a coleção de recursos do GeoJSON. Mas cada geometria individual tem seu próprio conjunto de propriedades. Veja, geojson.org/geojson-spec.html#examples
John Powell

Respostas:

12

Se você possui um multipolígono simples como o abaixo,

mp=
  {
  "type": "MultiPolygon",
  "coordinates": [
    [
        [
            [-99.028, 46.985], [-99.028, 50.979],
            [-82.062, 50.979], [-82.062, 47.002],
            [-99.028, 46.985]
        ]
    ],
    [
        [
            [-109.028, 36.985], [-109.028, 40.979],
            [-102.062, 40.979], [-102.062, 37.002],
            [-109.028, 36.985]
        ]
     ]
  ]
}

usando Javascript / Nodejs, você poderá acessar cada polígono constituinte usando forEach e escrever um novo polígono usando JSON.stringify

mp.coordinates.forEach(function(coords){
   var feat={'type':'Polygon','coordinates':coords};
   console.log(JSON.stringify(feat));
   }
);

Você também pode acessá-los diretamente em um loop, se preferir uma maneira menos funcional, indexada em mp.coordinates.length, por exemplo,

for (var i=0;i<mp.coordinates.length;i++){   
   var feat={'type':'Polygon','coordinates':mp.coordinates[i]};
   console.log(JSON.stringify(feat));
}

Se você está lidando com um FeatureCollection, no qual você pode ter uma matriz de recursos, cada um contendo um MultiPolygon, por exemplo,

mp = {
  "type": "FeatureCollection",
  "features": [
     {
      "type": "Feature",
       "geometry": {
         "type": "MultiPolygon",
           "coordinates": [
             [[
              [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0],
              [100.0, 0.0]
            ]],
            [[
             [0.0, 0.0], [1.0, 0.0], [1.0, 1.0], [0.0, 1.0],
             [0.0, 0.0]
           ]]          
         ]
     },
      "properties": {
      "prop1": {
        "this": "that"
      },
      "prop0": "value0"
     }
    }
  ]
}

Em seguida, você pode usar forEach para acessar cada recurso e acessar cada polígono em cada multipolígono simplesmente fazendo um loop pela matriz, pois a primeira dimensão da matriz de coordenadas é o índice de cada polígono. Observe que você também pode salvar as propriedades e atribuí-las a cada novo recurso de polígono.

 mp.features.forEach(function(feat){
   var geom=feat.geometry; 
   var props=feat.properties;
   if (geom.type === 'MultiPolygon'){
      for (var i=0; i < geom.coordinates.length; i++){
          var polygon = {
               'type':'Polygon', 
               'coordinates':geom.coordinates[i],
               'properties': props};
          console.log(JSON.stringify(polygon));
      }
    }
 });

Se você quiser algo mais sofisticado, poderá modificar a classe OpenLayers.Format.GeoJSON .

John Powell
fonte