Chuyển đổi Multipolygon Geojson thành nhiều đa giác Geojson?


9

Tôi thấy rất nhiều câu hỏi đi từ Polygonsđến MultiPolygon, nhưng có một số cách dễ dàng để đi theo cách khác? Nó cũng sẽ hữu ích để bảo tồn các thuộc tính từ MultiPolygonđể áp dụng cho cái mới Polygons.


1
Trong bối cảnh nào? Nodejs, openlayers, cơ sở dữ liệu, v.v.
John Powell

Tôi có Postgis và nodejs có sẵn cho dự án này
Ouwen Huang

Bạn có muốn giữ các thuộc tính của đa giác trong đa giác mới không?
John Powell

Ý anh là gì? Giống như kiểu chiếu?
Ouwen Huang

Không, điều đó áp dụng cho toàn bộ bộ sưu tập tính năng GeoJSON. Nhưng mỗi hình học riêng lẻ có tập hợp các thuộc tính riêng của nó. Xem, Geojson.org/geojson-spec.html#examples
John Powell

Câu trả lời:


12

Nếu bạn có một Đa giác đơn giản như hình dưới đây,

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

sau đó bằng cách sử dụng Javascript / Nodejs, bạn có thể truy cập từng Đa giác cấu thành bằng cách sử dụng forEach và viết ra một Đa giác mới bằng JSON.opesify

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

Bạn cũng có thể truy cập chúng trực tiếp trong một vòng lặp, nếu bạn thích một cách ít chức năng hơn, được lập chỉ mục trên mp.coordins.length, vd

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

Nếu bạn đang làm việc với FeatureCollection, nơi bạn có thể có một mảng tính năng, mỗi mảng chứa MultiPolygon, ví dụ:

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

Sau đó, bạn có thể sử dụng forEach để truy cập từng tính năng và sau đó truy cập từng Đa giác trong mỗi Đa giác chỉ bằng cách lặp qua mảng, như thứ nguyên đầu tiên của mảng tọa độ, là chỉ mục vào mỗi Đa giác. Lưu ý, bạn cũng có thể lưu các thuộc tính và gán chúng cho từng tính năng Đa giác mới.

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

Nếu bạn muốn một cái gì đó tinh vi hơn, bạn có thể xem xét sửa đổi lớp OpenLayers.Format.GeoJSON .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.