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

Я оновив свою посаду з двома функціями
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 - можливо, вам доведеться використовувати інше унікальне властивість у своїй функції, а не ідентифікатор.


Дякую за відповідь. Я думаю, це може бути хорошим рішенням. Я забуваю якийсь код, але я застряг у тому, що подія onFeatureUnselect не спрацьовує, коли вибір втрачено. Тож на якій події я видаляю функції клонів? Дивіться мою оригінальну публікацію.
Boedy

@Boedy див. Оновлену відповідь. Вам, мабуть, слід зробити все у функції вибору. Виберіть один раз, щоб вибрати, і знову скасувати вибір.
географіка

Дуже дякую! Допомогла перевірка, якщо функція знаходиться у вибраному шарі. Зараз у мене просто проблема зі стилем, але я думаю, що я можу це зрозуміти сам.
Boedy

0

З моїх експериментів ( http://ian01.geog.psu.edu/geoserver/www/wfs/wfs-sld2.html ) здається, що вибір та стиль слід підтримувати в масштабі.


У вашому випадку це працює. Але ваш код не використовує: resFactor: 1 і співвідношення: 1. що викликає перемальовування при зміні масштабу. Ваш приклад не викликає перерисування.
Боеді

добре, що звужує проблему для вас тоді
Ян Тертон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.