2015-02-10 84 views
0

我有几个矢量图层有一个多边形,一个有线。我们需要将线添加到附加到多边形的线层(数据库过程需要存储在多边形属性中的多边形ID)Openlayers 2. z轴和选择控制

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

我可能会从错误的角度来处理这个问题,所以我愿意提供建议。如果在矢量图层上有一个像getFeatureByPosition(position)这样的函数,我可以抓住sketchStarted上的位置,并对sketchEnded事件进行查询,但到目前为止,我一直无法找到类似的东西。

我现在不在我的开发箱中,以防万一有人想知道为什么没有代码。想要发布这个工作,但基地网络有问题显示登录页面(由于ssl我认为)

回答

0

所以我的解决方案需要几件事情。首先,我需要从OL 2.10升级到最新的2.13.1。大多数情况下,这是因为需要添加到2.11(我认为或者可能是2.12)的新事件,该事件是“特效”,可以在地图级别捕获,因此会在所有图层上触发,所以我没有与选择的Z索引。我从多边形图层中删除了选择控件,因为它不是必需的。

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); 

希望这会帮助别人,在类似的情况。