2010-04-08 3 views
3

OpenLayers를 사용 중이며 내지도 용 레이어와 단일 벡터 레이어가 있습니다. 이 벡터 레이어에서 DrawFeature 컨트롤을 사용하여 사각형을 그립니다. 나는, 내 layer.features.size을 검사 할 때OpenLayers eraseFeatures가지도 화면에서 지형지 물을 지우지 않습니다.

polygonLayer.events.register("beforefeatureadded", feature, function(evt){ 
     console.log("Clearing existing polygons"); 
     console.log(polygonLayer.features.length); 
     polygonLayer.destroyFeatures(); 
     polygonLayer.redraw(); 
     });//end attempt at events registration 

: 나는 청취자는 기능이 추가 될 때까지 대기 한 다음, (나는 한 번에 하나의 사각형을 원하는) 기존 기능을 삭제과 같이가 기대했던 것처럼 항상 1이라는 것을 알 수 있지만 화면의 사각형은 계속 표시됩니다. 레이어에서 .redraw()를 호출하더라도 사각형은 그대로 있습니다.

누락 된 추가 단계가 있습니까?

편집 : http://pastie.org/909644

편집 : 그냥 실현 : 당신은 여기 내 코드를 찾을 수 있습니다 나는 기존의 좌표에서 사각형을 그리면을, 나는 그것이 잘 지울 수 있습니다. 컨트롤러에서 그린 정사각형 인 것 같습니다.

답변

0

가 여기에 우리가 레가토에서 사용하고있는 코드입니다 :

Legato.Control.DrawFeature = OpenLayers.Class(OpenLayers.Control.DrawFeature, { 
    mode :1, 
    callback :null, 
    handlerConstructor :OpenLayers.Handler.Point, 
    initialize : function(layer, options) { 
    OpenLayers.Control.DrawFeature.prototype.initialize.apply(this, [ layer, 
     this.handlerConstructor, options ]); 

    }, 
    destroy : function() { 
    OpenLayers.Control.DrawFeature.prototype.destroy.apply(this, arguments); 
    }, 
    setMap : function(map) { 
    OpenLayers.Control.DrawFeature.prototype.setMap.apply(this, arguments); 
    }, 
    drawFeature : function(geometry) { 
    var feature = new OpenLayers.Feature.Vector(geometry); 
    var proceed = this.layer.events.triggerEvent("sketchcomplete", { 
     feature :feature 
    }); 
    if (proceed !== false) { 
     feature.state = OpenLayers.State.INSERT; 
     if (this.mode == 1) { 
     this.layer.addFeatures([ feature ]); 
     this.featureAdded(feature); 
     this.events.triggerEvent("featureadded", { 
      feature :feature 
     }); 
     } 
     if (this.mode == 2) { 
     this.layer.destroyFeatures(); 
     this.layer.addFeatures([ feature ]); 
     this.featureAdded(feature); 
     this.events.triggerEvent("featureadded", { 
      feature :feature 
     }); 
     } 
    } 
    if (Legato.Lang.ObjectUtils.isFunction(this.callback)) { 
     this.callback(geometry); 
    } 
    }, 

    CLASS_NAME :'Legato.Control.DrawFeature' 
}); 
Legato.Control.DrawFeature.MODE_ADD_FEATURE = 1; 
Legato.Control.DrawFeature.MODE_REPLACE_FEATURE = 2; 
2

좋아, 나는이 알아 낸 것 같아요. 규칙적으로 그려지면 사각형을 지울 수 있다는 것을 깨달았습니다. 문제는 이전에 작성한 코드에 있음을 깨닫게했습니다. 나는 정사각형을 지우는 것을 끝내었고, 확실하게 버튼에서 수동으로 청취했을 때, 그들은 사라져 버렸다.

따라서 기능을 추가하는 동안 모든 기능을 지우려고하는 것이 문제였습니다.

"featureadded"를 사용한 다음 제거 할 기능 목록에서 해당 기능을 제거하면됩니다. 매력처럼 작동합니다.

ClearMap.clearMapControl = function() { 
    var control = new OpenLayers.Control.Button(); 
    Map.map.addControl(control); 
    return control; 
}; 

은 다음 다음

ClearMap.newClearMapButton = function() { 
    var button = new OpenLayers.Control.Button({ 
     id : 'clearMapButton', 
     type : 1, 
     title : 'Clear Map', 
     displayClass : 'clearMapButton', 
     trigger : clearControlActivate, 
    }); 
    return button; 
} 

당신이 계층 명확 활성 버튼의 조치가 필요한 ClearMapControl

를 활성화하기 위해 버튼을 필요

 polygonLayer.events.register("featureadded", feature, function(evt){ 
     //only one circle at a time 
       points = evt.feature.geometry.getVertices(); 
     console.log("Erasing old features: "); 
     console.log(evt.feature); 
     if(polygonLayer.features.length > 1){ 
     polygonLayer.destroyFeatures(polygonLayer.features.shift()); 
     }; 
     });//end after feature 
6

당신은 컨트롤을 만드는 첫 번째 필요 정보 또는 특징들

var clearControlActivate = function(){ 
    for(var i=0; map.popups.length; i++) { 
     map.removePopup(map.popups[i]);   
    } 

    for(var j=0; j < map.layers.length; j++){ 
     if(map.layers[j].__proto__.CLASS_NAME == "OpenLayers.Layer.Vector"){ 
      map.layers[j].removeAllFeatures(); 
     } 
    } 
} 

나는 그것이 당신에게 봉사 희망 미안 내 영어

벡터 레이어에서 기능을 삭제하면, 모든지도에 적용해야 후
+0

대답을 확인하는 것을 잊지 마십시오. –

1

...

map.layers[1].removeAllFeatures(); 

한 내 벡터의 참조입니다 레이어!

관련 문제