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];
}
Boedy
источник
Что находится в вашей функции onFeatureSelect?
география
Я обновил свой пост с двумя функциями
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.

geographika
источник
Спасибо за ответ. Я думаю, что это может быть хорошим решением. Я возился с некоторым кодом, но застрял в том моменте, что событие onFeatureUnselect не срабатывает, когда выбор потерян. Итак, на каком событии я должен удалить клоны объектов? Смотрите мой оригинальный пост.
Боэди
@Boedy см обновленный ответ. Вы, вероятно, должны делать все в функции выбора. Выберите один раз, чтобы выбрать, и еще раз, чтобы отменить выбор.
география
Большое спасибо! Помогла проверка, если функция находится в выбранном слое. Теперь у меня просто проблема со стилем, но держу пари, что сам смогу ее решить.
Боэди
0

Из моих экспериментов ( http://ian01.geog.psu.edu/geoserver/www/wfs/wfs-sld2.html ) кажется, что выбор и стиль должны поддерживаться при увеличении.

Ян Тертон
источник
В вашем случае это работает. Но ваш код не использует: resFactor: 1 и соотношение: 1. который вызывает перерисовку при изменении масштаба. Ваш пример не вызывает перерисовку.
Боэди
хорошо, что сужает проблему для вас тогда
Ian Turton