使用百度地图API整多覆盖物渲染的时候,老是会出现”A覆盖物遮住了B覆盖物导致无法触发A覆盖物的点击事件”这样的问题。高德地图里面几乎都有setZIndex这样的方法供开发者设置覆盖物图层,百度地图API里面只有TileLayerOptions、CanvasLayerOptions、Label和Marker有。那么其他的覆盖物要怎么设置层级呢?
答案是先绘制的在下面,后绘制的在上面
this.map.addOverlay(circle);
this.map.addOverlay(marker);
this.map.addOverlay(polyline);
像这样的一段代码,代表先画circle,再画marker,最后画polyline。这样的话circle就在最底层,marker在circle的上面,polyline在marker的上面。如果marker正好和polyline重合,且marker的宽度没有polyline的宽度大,那么这个时候点击marker的位置是触发不了marker的监听事件的。
同理,如果是这样一段代码
this.map.addOverlay(marker);
this.map.addOverlay(polyline);
this.map.addOverlay(circle);
代表最后画circle,那么circle就在所有覆盖物的上面。如果正好polyline或者marker处于circle覆盖区域,那么polyline和marker这俩覆盖物都无法触发它们自己的监听。
值得一提的是,在百度地图API里,map似乎永远是最上层,我们通过dom似乎也能看到这个结果。这就造成了触发任意覆盖物的监听如click时也必定会触发map的监听。我们可以通过map监听回调函数入参中的overlay属性来判断是否该事件是否有其他覆盖物参与。比如click监听的情况下,如果map的监听回调参数中overlay有值,代表该次点击点到了其他的覆盖物上。我们可以通过return直接结束掉本次监听来避免多余逻辑的产生。