2015-10-17 129 views
1

我有幾個重疊的形狀。我希望能夠在包含所有較小形狀的最大形狀上打孔。這些孔將代表較大形狀內的較小形狀。在GeoJson Shapes中打洞 - clipperLib

樣本圖像: enter image description here

我使用ClipperLib的C#版本:

const double precisionFactor = 1000000000000000.0; 

      //precondition: all your polygons have the same orientation 
      //(ie either clockwise or counter clockwise) 
      Polygons polys = new Polygons(); 

      multiPolygon.ForEach(x => 
      { 
       Polygon polygon = x.First().Select(y => new IntPoint() 
       { 
        X = (long)(y[0] * precisionFactor), 
        Y = (long)(y[1] * precisionFactor) 
       }).ToList(); 

       polys.Add(polygon); 
      }); 

      Polygons solution = new Polygons(); 
      Clipper c = new Clipper(); 
      c.AddPaths(polys, PolyType.ptSubject,true); 
      c.Execute(ClipType.ctDifference, solution, 
       PolyFillType.pftNonZero, PolyFillType.pftNonZero); 

      var coordinates = solution.SelectMany(x => x.Select(y=> (IList<double>)new List<double>() 
      { 
       y.X/precisionFactor, 
       y.Y/precisionFactor 
      }).ToList()) .ToList(); 

      return coordinates; 

但被返回的形狀在上面的圖片中最大的形狀。

GeoJSON的文件: http://s000.tinyupload.com/download.php?file_id=62259172894067221043&t=6225917289406722104327028

+0

你有沒有解決過這個問題? 我想我有同樣的問題 – Dodgson86

+0

http://stackoverflow.com/questions/40148301/clipperlib-issue-cutting-geojson-polygons – Dodgson86

回答

1

當你指出你「希望能夠使在最大形狀洞」,我想你是誤會了快船庫管理/定義多邊形區域的方式。在Clipper中,多邊形由一系列閉合路徑和指定的多邊形filling rule定義 - 最常見的是EvenOdd或非零填充。 (多邊形是這樣的圖形展示文庫幾乎總是定義。)

與上述數據

因此,由於您使用的填充爲非零,則「洞」路徑必須在相反方向被定向的定向的容器外部路徑。如果內部路徑與外部容器的方向相同,則使用非零填充執行「差異」裁剪操作將正確忽略內部路徑。作爲一個側面說明,當對一組多邊形執行裁剪操作時(即,當沒有裁剪路徑時),由於主體路徑是「聯合」編輯,所以執行'聯合'操作更直觀是剪輯路徑)之前剪切操作主體和剪輯區域之間。