首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenLayers.Controls.DrawFeature激活/停用失败

OpenLayers.Controls.DrawFeature激活/停用失败
EN

Stack Overflow用户
提问于 2012-06-12 07:47:43
回答 1查看 7.1K关注 0票数 2

当我在回调函数的第一行中断并执行此操作时

代码语言:javascript
运行
复制
this.active --> true
this.deactivate() --> true
this.activate() --> true
this.deactivate() --> false

这怎么会发生呢?

让我解释一下发生这种情况的地方。

该地图有两个层,每个层都有一个与之关联的EditingToolbar。

当用户按下多边形绘制(在EditingToolbar中)时,它被绘制在"polygon_layer“上。

当用户按下line draw或point draw时,层被切换,用户现在在“矢量”层上绘制。

当我切换图层时,我需要激活EditingToolbar中的正确按钮,例如:

用户在"polygon_layer“中绘制多边形,现在他想绘制线条。他按下绘制线条按钮(在与polygon_layer关联的EditingToolbar中)。

我切换图层,并在EditingToolbar上激活该图层的绘制线条按钮。

过了一段时间,用户想要再次绘制多边形,所以我停用了这一层中的所有按钮,切换层,并在polygon_layer的EditingToolbar中激活了绘制多边形按钮。诸若此类。

现在,当我这样做足够多的次数(3个开关),我注意到按钮不再被停用。

所以我试着调试,得到了上面描述的完全意想不到的错误(在最上面)。

请告诉我我做错了什么。

我已经附加了我的代码,我将把ERROR HERE放在发生这种情况的地方。这段代码已经准备好运行了。您可以使用下面的HTML代码,只需更改对我提供的JavaScript文件的引用(我提供了JavaScript文件的内容)

代码语言:javascript
运行
复制
JS FILE:
var map;
var editing_toolbar_polygon=null;
var editing_toolbar_vector=null;
var drag_control=null;
var vectors;
var polygon_layer=null;
var epsg900913 = new OpenLayers.Projection('EPSG:900913');
var epsg4326 = new OpenLayers.Projection('EPSG:4326');
//var epsg900913 = new OpenLayers.Projection('EPSG:900913');
// var epsg4326 = new OpenLayers.Projection('EPSG:4326');
var line_control;
var polygon_control;
var renderer;
function initialize() {
    line_control, renderer=OpenLayers.Util.getParameters(window.location.href).renderer;
    renderer= (renderer) ? [renderer] : OpenLayers.Layer.Vector.prototype.renderers;
    // Create the map object
    map = new OpenLayers.Map('map');
     //Create a Google layer
    var gmap = new OpenLayers.Layer.Google(
        "Google Streets", // the default
        {
            numZoomLevels: 20,
            projection: new OpenLayers.Projection("EPSG:900913")
        }
    );
    var wms = new OpenLayers.Layer.WMS( "OpenLayers WMS",
             "http://vmap0.tiles.osgeo.org/wms/vmap0?", {layers: 'basic',
    projection: new OpenLayers.Projection("EPSG:4326")});

    var mystyle=new OpenLayers.StyleMap({
        "default": new OpenLayers.Style({
             fillColor: "#66ccff",
             strokeColor: "#3399ff",
             graphicZIndex: 2,
             strokeWidth: 5,
         }),
        "temporary": new OpenLayers.Style({
             fillColor:"#3399ff",
             strokeColor: "#3399ff",
             strokeWidth:5,  
             pointRadius:10

         })        
    });
    polygon_layer=new OpenLayers.Layer.Vector(
        "Polygon Layer",
        {
            //renderers:renderer,
        }
    );

    vectors= new OpenLayers.Layer.Vector(
        "Vector Layer",
        {
            //renderers:renderer,
        }
    );

    editing_toolbar_polygon=new OpenLayers.Control.EditingToolbar(polygon_layer);
    editing_toolbar_vector=new OpenLayers.Control.EditingToolbar(vectors);
    map.addLayers([gmap,wms,vectors,polygon_layer]);
    map.addControl(new OpenLayers.Control.LayerSwitcher());
    //map.addControl(new OpenLayers.Control.MousePosition());
    map.addControl(editing_toolbar_polygon); 
    map.addControl(editing_toolbar_vector); 
    editing_toolbar_vector.deactivate();
    //for the drag control to work you need to activate it
    drag_control=new OpenLayers.Control.DragFeature(vectors);
    map.addControl(drag_control);
    find_control(editing_toolbar_polygon.getControlsByClass(new RegExp(".*DrawFeature")),"Point").events.register("activate",null,function(e){
      //ERROR HERE
        this.deactivate();
        var picked_button=find_same_control(editing_toolbar_vector.controls,e.object);
        change_layer(polygon_layer,vectors);
        change_control(editing_toolbar_polygon,editing_toolbar_vector);
        picked_button.activate();
    });
    find_control(editing_toolbar_polygon.getControlsByClass(new RegExp(".*DrawFeature")),"Path").events.register("activate",null,function(e){
      //ERROR HERE
        this.deactivate();
        var picked_button=find_same_control(editing_toolbar_vector.controls,e.object);
        change_layer(polygon_layer,vectors);
        change_control(editing_toolbar_polygon,editing_toolbar_vector);
        picked_button.activate();
    });
    find_control(editing_toolbar_vector.getControlsByClass(new RegExp(".*DrawFeature")),"Polygon").events.register("activate",null,function(e){
      //ERROR HERE
        this.deactivate();
        var picked_button=find_same_control(editing_toolbar_polygon.controls,e.object);
        change_layer(vectors,polygon_layer);
        change_control(editing_toolbar_vector,editing_toolbar_polygon);
        picked_button.activate();
    });
    polygon_layer.events.register("beforefeatureadded",null,function(e){  
            polygon_layer.removeAllFeatures();
    });
   // line_control=new OpenLayers.Control.DrawFeature(vectors,OpenLayers.Handler.Path);
    //polygon_control=new OpenLayers.Control.DrawFeature(vectors,OpenLayers.Handler.RegularPolygon);
    //map.addControl(line_control);
    //line_control.activate();
    //map.addControl(polygon_control);
    //polygon_control.activate();
    // Zoom to Vancouver, BC
    map.setCenter(new OpenLayers.LonLat(-123.12, 49.28).transform(epsg4326, epsg900913), 13);         

}

function change_layer(current_layer,next_layer){
   current_layer.setVisibility(false);
   next_layer.setVisibility(true); 
}
function change_control(current_control,next_control){
   current_control.deactivate();
   map.addControl(next_control);
}

//use this when you want to find a specific control type:
// DrawFeature cntrol has many types, Line, Polygon, Point.
// So what you do is pass an array of DrawFeature controls and a type(string), lets say "Point",
// then this function will return a DrawFeature thats specifically for drawing points
function find_control(controls,type){
    var control;
    for(var x in controls){
        if(controls[x].displayClass.search(new RegExp(type+"$"))>0){
             return controls[x];
        }
    }
    return -1;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-12 20:33:55

我只是尝试了一个简单的测试。当您停用一个控制器时,您只需删除该控制器的事件。因此,对于OpenLayers.Control.LayerSwitcher,取消激活此控制器是无用的,因为没有任何变化,您仍然可以选择一个层。

我认为最好的方法是移除多边形的控制器,然后为线条添加控制器。

当您选择"polygon_layer“时:

代码语言:javascript
运行
复制
map.addControl(editing_toolbar_polygon); 
map.removeControl(editing_toolbar_vector); 

当您选择“矢量”时:

代码语言:javascript
运行
复制
map.addControl(editing_toolbar_vector); 
map.removeControl(editing_toolbar_polygon); 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10988888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档