Konversi Multipolygon Geojson ke beberapa poligon geojson?

9

Saya melihat banyak pertanyaan dari Polygonske MultiPolygon, tetapi apakah ada beberapa cara mudah untuk pergi sebaliknya? Ini juga akan berguna untuk menjaga atribut dari yang MultiPolygonberlaku untuk yang baru Polygons.

Ouwen Huang
sumber
1
Dalam konteks apa? Nodejs, openlayers, database, dll.
John Powell
Saya punya Postgis dan nodejs tersedia untuk proyek ini
Ouwen Huang
Apakah Anda ingin menyimpan properti dari multipolygon di poligon baru?
John Powell
Apa maksudmu? Suka jenis proyeksi?
Ouwen Huang
Tidak, itu berlaku untuk seluruh koleksi fitur GeoJSON. Tetapi setiap geometri individu memiliki set properti sendiri. Lihat, geojson.org/geojson-spec.html#examples
John Powell

Jawaban:

12

Jika Anda memiliki Multipolygon sederhana seperti di bawah ini,

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

kemudian menggunakan Javascript / Nodejs Anda dapat mengakses setiap Polygon konstituen menggunakan forEach, dan menulis Polygon baru menggunakan JSON.stringify

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

Anda juga dapat mengaksesnya langsung dalam satu lingkaran, jika Anda lebih suka cara yang kurang fungsional, diindeks pada mp.coordinates.length misalnya,

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

Jika Anda berurusan dengan FeatureCollection, di mana Anda mungkin memiliki berbagai fitur, masing-masing berisi MultiPolygon, misalnya,

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

Kemudian, Anda dapat menggunakan forEach untuk mendapatkan setiap fitur, dan kemudian mengakses setiap Polygon dalam setiap Multipolygon hanya dengan mengulang melalui array, sebagai dimensi pertama dari array koordinat, adalah indeks ke setiap Polygon. Catatan, Anda juga dapat menyimpan properti, dan menetapkannya ke setiap fitur Polygon baru.

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

Jika Anda menginginkan sesuatu yang lebih canggih, Anda dapat melihat memodifikasi kelas OpenLayers.Format.GeoJSON .

John Powell
sumber