openlayers polygon显示差异不联合

时间:2014-06-21 10:14:47

标签: openlayers polygon gwt-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);

当我在地图上查看此图层时,如果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没有填充相交的部分。

1 个答案:

答案 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对象,具有不可预测的结果。