Openlayers 2. z轴和select控件

Openlayers 2. z-axis and select control

我有几个矢量图层,一个是多边形,一个是直线。我们需要向附加到多边形的线层添加线(数据库程序需要多边形 ID,这些 ID 存储在多边形的属性中)

所以我在 lineLayer 上有一个 drawFeature 控件,在 polygonLayer 上有一个 selectFeature(它在悬停时存储 ID,而不仅仅是选择)。它实际上工作得很好,除了 linelayer 的 z 轴在添加时较低,所以它显示了在多边形下绘制的新线。宁愿让线显示在多边形上。我知道这是因为当 selectFeature 控件处于活动状态时,它会将多边形图层的 z-index 设置为高于 lineLayer。 我使用 lineLayer.setZIndex(800) 或其他方式手动将 linelayer 的 z-index 设置为高于多边形层,这肯定会使新线绘制在多边形上,但是 selectFeature 事件不会触发。 我已经考虑了几种解决方案,包括将 drawFeature 添加到我的多边形层,然后在完成后将特征移动到线层,但它仍在多边形下渲染,我什至在 "temporary" 样式上玩过 graphicZIndex多边形图层上的样式图。无济于事(我确实在多边形层上将 renderOptions zindexing 设置为 true)

我可能从错误的角度处理了这个问题,所以我愿意接受建议。如果矢量图层上有类似 getFeatureByPosition(position) 的函数,我可以在 sketchStarted 和 sketchEnded 事件上获取位置并查询它,但到目前为止我找不到类似的东西。

我现在不在我的开发箱中,以免有人想知道为什么没有代码。想 post 从工作中做到这一点,但基础网络在显示登录页面时遇到问题(我认为是由于 ssl)

所以我的解决方案需要一些东西。首先我需要从 OL 2.10 升级到最新的 2.13.1。这主要是由于需要添加到 2.11(我认为或者可能是 2.12)的新事件,该事件是 "featureover",可以在地图级别捕获,因此会在所有图层上触发,所以我不是与 select 的 Z-Index 战斗。我从多边形图层中删除了 select 控件,因为它不需要。

var featureOverHandler = function(event){
    if (event.feature.layer.id == polygonLayer.id) {
        selectedPolygonId = event.feature.attributes.POLYGON_ID;
        console.log("Selected Polygon Id: " + selectedPolygonId);
        map.events.unregister('featureover',map,featureOverHandler);
        map.events.register('featureout',map,featureOutHandler);
    }
};
var featureOutHandler = function (event) {
    if (event.feature.layer.id == polygonLayer.id) {
        selectedPolygonId = 0;
        console.log("Cleared Selected Polygon ID ");
        map.events.unregister('featureout', map, featureOutHandler);
        map.events.register('featureover', map, featureOverHandler);
    }
};

这些将捕获当前悬停的多边形。但后来我添加了事件来捕捉线条的开始和结束位置。从 2.11 开始,他们改变了 "sketchstarted" 事件的工作方式,您不能再使用它来捕获添加第一个点时指针位于哪个多边形上。我在矢量图层上使用了点回调。

var vDrawOptions = {
    callbacks: {
        "point": function (p) {
            if (p.parent.components.length == 2) {
                console.log("First Point added");
                startingPolygonId = selectedPolygonId;
            }
        }
    }
}
vectorAddControl = new OpenLayers.Control.DrawFeature(vectorLayer, OpenLayers.Handler.Path,vDrawOptions);

但是,"skecthcomplete" 仍可用于捕获终点(以及多边形)

function vSketchComplete(evt) {
    endingPolygonId = selectedPolygonId;
};
vectorLayer.events.register('sketchcomplete', vectorLayer, vSketchComplete);

希望这对处于类似情况的其他人有所帮助。