在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);
当我在地图上查看此图层时,如果points1和points2定义的多边形重叠,我会看到一个洞:
polygon hole http://www.jackhollow.co.uk/misc/polygon.png
我看到&#34; xor&#34;在两个多边形中,我想看到&#34;或&#34;相反,即在中间填充绿色的洞。
我该怎么做?我确定它只是Openlayers中的一个显示问题,但我无法在任何地方找到控制它的标志。
原始的两个多边形如下:
polygon hole http://www.jackhollow.co.uk/misc/polygon2.png
如果在单个图层上一起显示它们重叠,但Openlayers没有填充相交的部分。
答案 0 :(得分:2)
问题是您要将两个LinearRings添加到同一个Polygon。所有环在第一个环之后被定义为多边形的内环(即内部孔),这解释了您所看到的奇怪的交叉行为 - 试图绘制内环,实际上并不在内部。请参阅documentation中的组件。要解决您的问题,您需要创建两个单独的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对象,具有不可预测的结果。