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 с непредсказуемыми результатами.