Multipolygon Geojson in mehrere Geojson-Polygone konvertieren?

9

Ich sehe viele Fragen von Polygonsbis MultiPolygon, aber gibt es einen einfachen Weg, um umgekehrt zu werden? Es wäre auch nützlich, die Attribute von zu beibehalten MultiPolygon, um sie auf die neuen anzuwenden Polygons.

Ouwen Huang
quelle
1
In welchem ​​Kontext? Nodejs, Openlayers, Datenbank usw.
John Powell
Ich habe Postgis und Nodejs für dieses Projekt zur Verfügung
Ouwen Huang
Möchten Sie die Eigenschaften des Multipolygons in den neuen Polygonen beibehalten?
John Powell
Was meinst du? Wie der Projektionstyp?
Ouwen Huang
Nein, das gilt für die gesamte GeoJSON-Feature-Collection. Jede einzelne Geometrie hat jedoch ihre eigenen Eigenschaften. Siehe geojson.org/geojson-spec.html#examples
John Powell

Antworten:

12

Wenn Sie ein einfaches Multipolygon wie das folgende haben,

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

Anschließend können Sie mit Javascript / Nodejs mit forEach auf jedes einzelne Polygon zugreifen und mit JSON.stringify ein neues Polygon schreiben

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

Sie können auch direkt in einer Schleife darauf zugreifen, wenn Sie eine weniger funktionale Methode bevorzugen, die auf mp.coordinates.length indiziert ist, z.

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

Wenn Sie es mit einer FeatureCollection zu tun haben, in der Sie möglicherweise ein Array von Features haben, die jeweils ein MultiPolygon enthalten, z.

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

Anschließend können Sie mit forEach zu jedem Feature gelangen und dann auf jedes Polygon in jedem Multipolygon zugreifen, indem Sie einfach das Array durchlaufen, da die erste Dimension des Koordinatenarrays der Index für jedes Polygon ist. Beachten Sie, dass Sie die Eigenschaften auch speichern und jedem neuen Polygon-Feature zuweisen können.

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

Wenn Sie etwas Anspruchsvolleres wünschen, können Sie die OpenLayers.Format.GeoJSON- Klasse ändern .

John Powell
quelle