Openlayers 2. z轴和选择控制

时间:2015-02-10 23:28:59

标签: javascript z-index openlayers

我有几个矢量图层,其中一个有多边形,一个有线条。我们需要在连接到多边形的线图层上添加线条(数据库过程需要多边形ID,这些ID存储在多边形的属性中)

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

我可能从错误的角度接近这个,所以我愿意接受建议。如果矢量图层上有一个像getFeatureByPosition(position)这样的函数,我可以抓住sketchStarted上的位置,并绘制SketchEnded事件并进行查询,但到目前为止我一直无法找到类似的东西。

我现在不在我的开发盒上,万一有人想知道为什么没有代码。希望从工作中发布此信息,但基本网络在显示登录页面时出现问题(由于我认为是ssl)

1 个答案:

答案 0 :(得分:0)

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

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开始,他们改变了#e; 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);

希望在类似的情况下这会帮助其他人。