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

            }
        }
    );

@geographika

私の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

2つの機能で投稿を更新しました
Boedy

回答:


4

ズーム、パン、再描画全体でベクターの選択を維持する最も簡単な方法は、新しい空のベクターレイヤーをマップに追加し、フィーチャが選択されたらこのレイヤーにコピーを配置することです。

選択レイヤースタイルを明確に表示されるスタイルに設定できます。

選択ツールの強調表示機能で、選択時に機能のクローンを追加し、2回目に選択したときに削除します。

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、2011年

@Boedyは更新された回答を参照してください。おそらく、select関数ですべてを行う必要があります。一度選択すると選択され、もう一度選択すると選択解除されます。
geographika

どうもありがとう!フィーチャが選択したレイヤーにある場合のチェッキングが役立ちました。今、私はスタイリングの問題を抱えていますが、私はそれを自分で理解できると思います。
Boedy、2011年

0

私の実験(http://ian01.geog.psu.edu/geoserver/www/wfs/wfs-sld2.html)から、選択とスタイルはズームよりも維持する必要があるようです。


あなたの場合それは動作します。ただし、コードでは、resFactor:1およびratio:1を使用しません。これにより、ズームが変更されたときに再描画されます。あなたの例は再描画を引き起こしません。
Boedy、2011年

それはあなたのために問題を絞り込みます
Ian Turton
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.