openlayers полигон отображает разницу не союз

В OpenLayers я создаю многоугольник, состоящий из двух объектов LinearRing, используя код формы (это в Java+GWT, но тот же принцип применим к JS):

List<LinearRing> linearRingList = new ArrayList<LinearRing>();

List<Point> points1 = new ArrayList<Point>();
... populate points1 ...;
linearRingList.add(new LinearRing(points1.toArray(new Point[points.size()])));

List<Point> points2 = new ArrayList<Point>();
... populate points2 ...;
linearRingList.add(new LinearRing(points2.toArray(new Point[points.size()])));

Polygon poly = new Polygon(linearRingList.toArray(new LinearRing[linearRingList.size()]));
VectorFeature feature = new VectorFeature(poly);
myLayer.addFeature(feature);

Когда я рассматриваю этот слой на карте, если многоугольники, определенные точками 1 и 2, перекрываются, я вижу дыру:

http://www.jackhollow.co.uk/misc/polygon.png

Я вижу "xor" двух полигонов, где я хочу вместо них видеть "или", то есть с той дырой в середине, заполненной зеленым цветом.

Как мне это сделать? Я уверен, что это просто проблема отображения в Openlayers, но я не могу найти флаг, чтобы контролировать его где-либо.

Исходные два полигона имеют вид:

http://www.jackhollow.co.uk/misc/polygon2.png

если они отображаются вместе на одном слое, они перекрываются, но Openlayers не заполняет пересекающиеся части.

1 ответ

Решение

Проблема в том, что вы добавляете оба LinearRings в один и тот же полигон. Все кольца, после первого, определяются как внутренние кольца многоугольника (т.е. внутренние отверстия), что объясняет странное поведение пересечения, которое вы видите - попытку нарисовать внутреннее кольцо, которого на самом деле нет внутри. Смотрите компоненты в документации. Чтобы решить вашу проблему, вам нужно создать два отдельных Geometry.Polygons и два отдельных Feature.Vectors и добавить оба из них в ваш Layer.Vector.

 var linearRing1 = new OpenLayers.Geometry.LinearRing(pointList1);
 var feature1 = new OpenLayers.Feature.Vector(
          new OpenLayers.Geometry.Polygon([linearRing1]));

 var linearRing2 = new OpenLayers.Geometry.LinearRing(pointList2);
 var feature2 = new OpenLayers.Feature.Vector(
          new OpenLayers.Geometry.Polygon([linearRing2]));


var layer = new OpenLayers.Layer.Vector("layername");
layer.addFeatures([feature1, feature2]);

где вы создаете свои списки точек, как и раньше. Вы также можете добавить атрибуты и стили к каждому вектору объектов или стиль к вектору слоя, но я оставил это для ясности.

В OpenLayers нет явной проверки правильности вашей геометрии, т. Е. Что внутренние кольца на самом деле находятся внутри внешнего кольца, поэтому, если вы передадите массив строк в конструктор многоугольника, будет сделана попытка преобразовать это в соответствующие объекты SVG или VML с непредсказуемыми результатами.

Другие вопросы по тегам