Convertir un multipolygone Geojson en plusieurs polygones geojson?

9

Je vois beaucoup de questions allant de Polygonsà MultiPolygon, mais y a-t-il un moyen facile de faire l'inverse? Il serait également utile de conserver les attributs du MultiPolygonpour les appliquer au nouveau Polygons.

Ouwen Huang
la source
1
Dans quel contexte? Nodejs, openlayers, base de données, etc.
John Powell
J'ai Postgis et nodejs disponibles pour ce projet
Ouwen Huang
Voulez-vous conserver les propriétés du multipolygone dans les nouveaux polygones?
John Powell
Que voulez-vous dire? Vous aimez le type de projection?
Ouwen Huang
Non, cela s'applique à l'ensemble de la collection d'entités GeoJSON. Mais chaque géométrie individuelle a son propre ensemble de propriétés. Voir, geojson.org/geojson-spec.html#examples
John Powell

Réponses:

12

Si vous avez un multipolygone simple tel que celui ci-dessous,

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

puis en utilisant Javascript / Nodejs, vous pouvez accéder à chaque polygone constitutif en utilisant forEach, et écrire un nouveau polygone en utilisant JSON.stringify

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

Vous pouvez également y accéder directement dans une boucle, si vous préférez une méthode moins fonctionnelle, indexée sur mp.coordinates.length, par exemple,

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

Si vous traitez avec une FeatureCollection, où vous pourriez avoir un tableau de fonctionnalités, chacune contenant un MultiPolygon, par exemple,

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

Ensuite, vous pouvez utiliser forEach pour accéder à chaque entité, puis accéder à chaque polygone dans chaque multipolygone simplement en bouclant à travers le tableau, car la première dimension du tableau de coordonnées est l'index dans chaque polygone. Remarque, vous pouvez également enregistrer les propriétés et les affecter à chaque nouvelle fonction Polygone.

 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 vous voulez quelque chose de plus sophistiqué, vous pouvez envisager de modifier la classe OpenLayers.Format.GeoJSON .

John Powell
la source