繁体   English   中英

Openlayers 2. z轴和选择控制

[英]Openlayers 2. z-axis and select control

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

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

我可能从错误的角度接近这个,所以我愿意接受建议。 如果矢量层上有可用的函数,例如getFeatureByPosition(position),我可以在sketchStarted和sketchEnded事件上获取位置并进行查询,但是到目前为止,我一直找不到这样的东西。

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

所以我的解决方案需要一些东西。 首先,我需要从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开始,它们更改了“ 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);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM