2016-08-23 372 views
0

我有一个OpenLayers控件在我的地图上绘制一条线。这工作正常。 现在我添加了一个表单,其中显示了该行的坐标。用户应该能够在那里编辑坐标,并在提交表单时更新行。OpenLayers DrawFeature生成一个新层

问题是,我结束了两行可见。经过一些调试后,我发现,虽然我为DrawFeature指定了要使用的图层,但处理程序会创建一个名为“OpenLayers.Handler.Path”的新图层。因此,我用鼠标绘制的所有东西都绘制在该图上,而通过提交表单创建的线则绘制在“我的图层”上。

我有以下代码:

layer = new OpenLayers.Layer.Vector("My Layer"); 
geoExtMap.map.addLayer(layer); 

Control = { 
    line: new OpenLayers.Control.DrawFeature(layer, 
     OpenLayers.Handler.Path, { 
      callbacks: { 
       "point": pointHandler, 
       "done": doneHandler 
      }, 
      handlerOptions: { 
       persist: true, 
       maxVertices: 2, 
       freehand: false, 
       layerOptions: { 
        styleMap: styleMapControls 
       } 
      } 
     }) 
}; 

geoExtMap.map.addControl(Control.line); 


var points = new Array(
    new OpenLayers.Geometry.Point(x1, y1).transform(EPSG, projectData.crs), 
    new OpenLayers.Geometry.Point(x2, y2).transform(EPSG, projectData.crs) 
); 

var line = new OpenLayers.Geometry.LineString(points); 
var lineFeature = new OpenLayers.Feature.Vector(line, null, sketchSymbolizersControls.Line); 

layer.removeAllFeatures(); 
layer.addFeatures([lineFeature]); 

那么,为什么处理程序创建一个新层,而不是使用指定的一个?

回答

0

DrawFeature控件使用指定的图层,而OpenLayers.Handler.Path每次创建一个新的图层被激活。

这个新图层被评论为“临时图层”。

您可以尝试覆盖OpenLayers.Handler.Path的activate和deactivate方法,强制它使用指定的图层,但可能会出现一些意外问题。 https://github.com/openlayers/ol2/blob/master/lib/OpenLayers/Handler/Point.js#L156(Handler.Path扩展Handler.Point)

因此,我会尝试,而不是解决与形式的问题。您没有发布“表单代码”,所以我不能更具体,但可以尝试更新两个功能(在两个图层上),或者您可以尝试在表单编辑期间停用绘图控制/处理程序。

+1

感谢您的解释。我已经认为这样的事情正在发生,但并不确定。我通过切换控制按钮两次来解决我的问题,即删除临时线路但保持控制活动。 – Matthieu