Openlayers-레이어 다시 그리기에서 선택 또는 스타일 손실


10

지도를 확대 / 축소하거나 이동하면 레이어가 다시 그려집니다. 한 번에로드 할 기능이 많기 때문에 이것이 내가 원하는 것입니다. 이것은 코드입니다.

    wfs = new OpenLayers.Layer.Vector("WFS", {
    strategies: [new OpenLayers.Strategy.BBOX({
                    resFactor: 1,
                    ratio:1
                })],
    protocol: new OpenLayers.Protocol.WFS({
              maxFeatures:1000,
              url:  myUrl,
              featureType: myFeatureType,
              featureNS: myFeaturedNS,
              version: "1.1.0"
              }),
      filter: setFilter(year, variant)
});

다음 코드는 선택 코드입니다. 이 모든 것은 내가 원하지 않는대로 작동합니다. 그러나 레이어를 다시 그리면 선택이 손실되고 onFeatureUnselect가 실행되지 않습니다 (필수). 선택이 실제로 손실되는지 또는 스타일이 재설정되었는지 확실하지 않습니다.

    selectCtrl = new OpenLayers.Control.SelectFeature(
        wfs,
        {
            clickout: true, toggle: false,
            multiple: false, hover: false,
            box: true,
            toggleKey: "shiftKey", // ctrl key removes from selection
            multipleKey: "shiftKey",
            eventListeners: {
                featurehighlighted: onFeatureSelect,
                featureunhighlighted: onFeatureUnselect

            }
        }
    );

geo

내 onFeatureSelect 및 onFeatureUnselect 기능 :

function onFeatureSelect(e) {
var feature = e.feature.attributes;
var featureclone = e.feature.clone();

var style = {
    pointRadius: 10,
    fillOpacity:0,
    strokeColor: "#000000"
    };

featureclone.style = style;

layer2.addFeatures([featureclone]);
selectedFeatures[featureclone.attributes.receptor_id] = featureclone;
}

function onFeatureUnselect(e) {
    var feature = e.feature.attributes;
    layer2.removeFeatures(selectedFeatures[feature.receptor_id]);   
    delete selectedFeatures[feature.receptor_id];
}

onFeatureSelect 기능에는 무엇이 있습니까?
geographika

두 기능으로 게시물을 업데이트했습니다
Boedy

답변:


4

확대 / 축소, 이동 및 다시 그리기에서 벡터 선택을 유지하는 가장 쉬운 방법은 맵에 새로운 빈 벡터 레이어를 추가하고 피처를 선택할 때이 레이어에 사본을 배치하는 것입니다.

레이어 선택 스타일을 선명하게 보이도록 설정할 수 있습니다.

선택한 도구 강조 기능에서 선택할 때 기능의 복제본을 추가하고 두 번째로 선택되면 제거하십시오.

onFeatureSelect(feat){
  //check if the feature is in the select layer
  var cloned_feat = selectionLayer.getFeatureById(feat.id); 
  //or a getFeatureBy with a unique property

  if(cloned_feat){
      selectionLayer.removeFeatures([cloned_feat]);
  }
  else {
      var featCopy = feat.clone();
      this.sketchLayer.addFeatures([featCopy]);
  }
}

이것은 약간 단순화되고 테스트되지 않았습니다. 선택 레이어를 선택 도구의 속성으로 저장하고 싶을 것입니다.

또한 getFeatureById 함수를 확인하십시오. ID가 아닌 기능에 다른 고유 특성을 사용해야 할 수도 있습니다.


답장을 보내 주셔서 감사합니다. 나는 이것이 좋은 해결책이라고 생각합니다. 일부 코드를 사용하고 있지만 선택이 손실되면 onFeatureUnselect 이벤트가 시작되지 않는 시점에 붙어 있습니다. 그러면 어떤 이벤트에서 기능 복제본을 제거합니까? 내 원래 게시물을 참조하십시오.
Boedy

@Boedy는 업데이트 된 답변을 참조하십시오. 선택 기능에서 모든 작업을 수행해야합니다. 한 번 선택하고 선택을 취소하십시오.
geographika

많은 감사합니다! 선택한 레이어에 기능이 있는지 확인하면 도움이됩니다. 이제 스타일링 문제가 있지만 그 자체를 알아낼 수 있습니다.
Boedy

0

내 실험 ( http://ian01.geog.psu.edu/geoserver/www/wfs/wfs-sld2.html )에서 선택과 스타일을 확대하여 유지해야합니다.


귀하의 경우에는 효과가 있습니다. 그러나 코드는 resFactor : 1 및 ratio : 1을 사용하지 않습니다. 확대 / 축소가 변경되면 다시 그리기가 발생합니다. 귀하의 예는 다시 그리기를 트리거하지 않습니다.
Boedy

그럼 당신을 위해 문제를 좁 힙니다
Ian Turton
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.