2015-10-17 3 views
1

У меня есть несколько перекрывающихся форм. Я хочу иметь возможность делать отверстия в самой большой форме, содержащей все более мелкие фигуры. отверстия будут представлять меньшие формы в большей форме.Выполнение отверстий в фигурах GeoJson - clipperLib

образец изображения: enter image description here

Я использую C# версии ClipperLib:

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 управляет/определяет многоугольник регионы. В Clipper полигоны определяются рядом замкнутых путей вместе с указанным полигоном filling rule - чаще всего либо заполнением EvenOdd, либо NonZero. (Полигоны почти всегда определяется таким образом, в библиотеках графического дисплея.)

Следовательно, с вашими данными выше, так как вы используете отличную от нуля начинки, то «дырка» пути должны быть ориентированы в противоположном направления ориентации внешнего пути контейнера. Если внутренние дорожки имеют ту же ориентацию, что и внешний контейнер, то выполнение операции отсечения «разности» с использованием заполнения NonZero будет правильно игнорировать внутренние пути.

В качестве побочного примечания при выполнении операции отсечения на одном наборе полигонов (т. Е. Когда нет обтравочных контуров) более интуитивно понятно выполнение операции объединения, поскольку пути объекта являются «union»-ed (as являются дорожками клипов) перед любым отсечением op между областями субъекта и клипа.