¿Convertir Multipolígono Geojson en múltiples polígonos geojson?

9

Veo un montón de preguntas que van de Polygonsa MultiPolygon, pero ¿hay alguna manera fácil de ir hacia el otro en torno manera? También sería útil preservar los atributos de la MultiPolygonaplicación a la nueva Polygons.

Ouwen Huang
fuente
1
¿En que contexto? Nodejs, openlayers, base de datos, etc.
John Powell
Tengo Postgis y nodejs disponibles para este proyecto
Ouwen Huang
¿Desea mantener las propiedades del multipolígono en los nuevos polígonos?
John Powell
¿Qué quieres decir? ¿Te gusta el tipo de proyección?
Ouwen Huang
No, eso se aplica a toda la colección de características GeoJSON. Pero cada geometría individual tiene su propio conjunto de propiedades. Ver, geojson.org/geojson-spec.html#examples
John Powell

Respuestas:

12

Si tiene un Multipolígono simple como el siguiente,

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

luego, usando Javascript / Nodejs, puede acceder a cada Polígono constituyente usando forEach, y escribir un nuevo Polígono usando JSON.stringify

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

También puede acceder a ellos directamente en un bucle, si prefiere una forma menos funcional, indexada en mp.coordinates.length, por ejemplo,

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

Si se trata de una FeatureCollection, donde podría tener una matriz de características, cada una con un MultiPolygon, por ejemplo,

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

Luego, puede usar forEach para llegar a cada entidad y luego acceder a cada Polígono dentro de cada Multipolígono simplemente recorriendo la matriz, ya que la primera dimensión de la matriz de coordenadas es el índice en cada Polígono. Tenga en cuenta que también puede guardar las propiedades y asignarlas a cada nueva función 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));
      }
    }
 });

Si desea algo más sofisticado, podría considerar modificar la clase OpenLayers.Format.GeoJSON .

John Powell
fuente