Как получить все ранее выбранные объекты в слое карты OpenLayers? - PullRequest
0 голосов
/ 18 октября 2018

У меня есть карта OpenLayers 4 с взаимодействием одним щелчком мыши и соответствующим обработчиком события для события «select», которое меняет стиль выбранных объектов.

let clickInteraction = new olInteractionSelect({
  layers: function (layer: any) {
    return layer.get('selectable') == true;
  },
  condition: olEventCondition.singleClick,
  filter: (feature: any, layer: any) => {

    let shouldReturn: boolean = false;

    switch (layer.get(this.LAYER_PROPERTY_ID)) {
      case this.LAYER_ID_POINTS:
        this.onPointClick(feature.getId());
        shouldReturn = true;
        break;
      case this.LAYER_ID_AREAS:
        this.onAreaClick(feature.getId());
        shouldReturn = true;
        break;
      default:
        break;
    }
    return shouldReturn;
  }
});

let __this = this;

clickInteraction.on('select', function (evt: any) {
  let selected = evt.selected;
  let deselected = evt.deselected;

  //Select and set style for newly selected features
  if (selected.length) {
    selected.forEach(function (feature: any) {
      if (feature.get(__this.FEATUREKEY_SELECTEDSTYLEID)) {
        feature.setStyle(__this.createStyleFnFeatureSelected(feature.get(__this.FEATUREKEY_SELECTEDSTYLEID)));
      }
    });
  } else {
    deselected.forEach(function (feature: any) {
      if (feature.get(__this.FEATUREKEY_STYLEID)) {
        feature.setStyle(__this.createStyleFn(feature.get(__this.FEATUREKEY_STYLEID)));
      }
    });
  }
});

this.map.addInteraction(clickInteraction);

Каждый раз, когда выбирается новая функция, я хочуустановить стиль всех ранее выбранных функций.Что я не могу понять, так это когда при взаимодействии с кликом вызывается событие select, как получить коллекцию всех ранее выбранных объектов на слое карты?

На карте несколько тысяч объектов.поэтому перебор всех функций невозможен с точки зрения производительности.Чего я хочу добиться, так это получить только те функции, которые были выбраны ранее, а не те, которые были выбраны или отменены в текущем событии взаимодействия с кликами.

1 Ответ

0 голосов
/ 18 октября 2018

Вы можете просто поддерживать очередь выбранных объектов, и при выборе новых объектов они добавляются в очередь.Обработка очереди может быть необязательной, но должна быть выполнена до добавления новых функций

let prevSelection = [];

clickInteraction.on('select', function (evt: any) {
  let selected = evt.selected;
  let deselected = evt.deselected;

  //Restyle previously selected features now if desired (or leave until next time)
  if (myCondition) {
    prevSelection.forEach(
      ...
    )
    prevSelection = [];
  }

  //Append newly selected features to queue for next time 
  prevSelection = prevSelection.concat(selected);

  //Select and set style for newly selected features
  if (selected.length) {
...