如何在Openlayers中定义层顺序?


28

我有一个标记层,两个向量层和两个栅格层。标记层被两个栅格层覆盖。

有没有办法将标记层始终移到顶部?

编辑: Z索引的顺序在矢量层上效果很好,但是当我在地图上以较低Z索引添加另一个WMS栅格图层时,栅格层仍然覆盖了矢量层。

编辑:有人可以指出图层的“ LayerIndex”和“ Z-Index”方面的渲染顺序的差异吗?我认为图层索引处理矢量图层中的叠加顺序,而Zindex处理矢量图层中的要素顺序,对吗?


我认为layerindex和z-index是OpenLayers中的可互换术语。它们在文档的相同上下文中使用,例如:dev.openlayers.org/releases/OpenLayers-2.11/doc/apidocs/files/…–
Casey

您好@Casey我感谢您的榜样。但是,我认为layerindex和z-index是不可互换的。以我自己的经验,setZindex不起作用,但是setIndex有效。我注意到:1. openlayer中的Z-index示例适用于矢量层中的功能,并且由rendererOptions:{zIndexing:true}启用。2.从您的栅格图像图层示例中,您可以看到图层渲染顺序是基于您在地图控件上看到的,它取决于图层索引(作为您的答案代码)。3.层索引由我的新层添加的顺序(基于层为0 ...)中设置

1.我认为你是对的。2和3。对,但是您可以通过调用setLayerIndex方法来覆盖默认行为,该方法会调整图层的z-index。这将影响地图控件中图层的顺序和图层的绘制顺序。
凯西

Answers:


24

为每个图层设置z-index应该会有所帮助:http : //www.openlayers.org/dev/examples/ordering.html

已编辑

我最初链接的示例并不太有用。您要设置图层的layerindex / z-index,而不是图层内的制造商(如订购示例所示)。我放在一起的示例(基于本示例)显示了自定义图层索引。请注意,当您打开“加拿大栅格”时,“标记”层将保持在顶部。

以下是相关代码:

map.setLayerIndex(dm_wms, 0); //set the image overlay to the bottom
map.setLayerIndex(markers, 99); //set the marker layer to an arbitrarily high layer index

setLayerIndex代码的文档位于此处:http : //dev.openlayers.org/releases/OpenLayers-2.11/doc/apidocs/files/OpenLayers/Map-js.html#OpenLayers.Map.setLayerIndex


该示例链接到恶意软件。
Bazinga777 '18

8

如果您希望向量层始终以简单的代码开头,则可以执行此操作...

var vecLyr = map.getLayersByName('VectorLayer')[0];
map.raiseLayer(vecLyr, map.layers.length);

可能很容易!


4

上面的方法都不适合我,但是只要我添加一个新层就这样做,就可以使标记层保持在顶部:

myMarkerLayer.setZIndex(1001);


这也是对我有用的唯一答案。其他都不起作用。
马修·洛克

3

您可以考虑在现有图层之上放置新的图纸,从而在地图上添加图层。如果新工作表不是透明的,它将隐藏下面的所有内容。

不幸的是,OpenLayers没有一个insertLayerAt方法,因此插入后必须重新排序图层。解决方案是添加该层,然后将其向下移动到所需的深度,或者将所需的顶部移回顶部。

您可以按照以下步骤进行操作:

// add your wms as usual
var yourWMSLayer = new ....
map.addLayer(yourWMSlayer);

// you can do it both ways:
// 1. now move the markers to the top of the stack
var yourMarkers = map.getLayersByName("the marker layer name")[0];
map.setLayerIndex(yourMarkers, map.layers.length-1);

// 2. OR you move the WMS down
// this is more succint
map.setLayerIndex(yourWMSLayer, map.layers.length-2);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.