Nano Hash - криптовалюты, майнинг, программирование

Openlayers 4 - изменение взаимодействия и нескольких объектов в одной координате

У меня включено взаимодействие изменения на векторном слое с несколькими функциями. Это нормально, чтобы переместить элемент в новое положение. Однако, если на одной координате есть больше объектов, то все они перемещаются одновременно. См. пример на codepen.

var raster = new ol.layer.Tile({
    source: new ol.source.OSM()
  });

var data = new ol.Collection();

  data.push(new ol.Feature({
    geometry: new ol.geom.Point([0, 0])
  }));

  var f = new ol.Feature({
    geometry: new ol.geom.Point([0, 0])
  });
  f.setStyle(new ol.style.Style({
                image: new ol.style.Circle({
                    radius: 10,
                    fill: new ol.style.Fill({
                        color: [255, 255, 255, 0.5]
                    }),
                    zIndex: Infinity
                }),
            }));

  data.push(f);

  var vector = new ol.layer.Vector({
    source: new ol.source.Vector({
      features: data
    })
  });


  var modify = new ol.interaction.Modify({
    features: data
  });

  var map = new ol.Map({
    interactions: ol.interaction.defaults().extend([modify]),
    layers: [raster, vector],
    target: 'map',
    view: new ol.View({
      center: [0, 0],
      zoom: 12
    })
  });

Есть ли способ избежать этого? Единственные решения, которые я нашел:

  1. У меня есть выбор, чтобы выбрать эту функцию
  2. Используйте взаимодействие с переводом, чтобы переместить одну из функций

or

  1. При событии перемещения указателя определите, находится ли одна или несколько функций в координатах, а затем выберите одну из них
  2. Добавить выбранный объект, чтобы изменить векторный слой и переместить его

Любым другим путем?

Regrads RM

23.08.2017

  • У вас уже есть 2 решения. Какая-то конкретная причина, по которой вы ищете другое решение? 24.08.2017
  • Первое решение требует дополнительного щелчка (щелчка выбора), которого я хочу избежать. При перемещении функции с одного уровня на другой требуется резервирование, что усложняет код, и я надеюсь, что смогу сохранить код простым. Вот почему я искал другие решения. 24.08.2017

Ответы:


1

Есть другой способ. Вы можете зарегистрировать обработчик 'pointermove' на карте, в котором вы получаете самую верхнюю функцию, и установить его как единственную функцию в источнике, с которой работает взаимодействие «Изменить». См. Полный пример https://codepen.io/ahocevar/pen/YxjyRd.

Помимо кода, вы подключите взаимодействие «Изменить» к источнику вместо коллекции, и этот источник (modifySource) отделен от источника векторного слоя и изначально пуст. В обработчике pointermove вы добавляете к этому источнику только одну функцию:

function pointermove(e) {
  if (e.dragging) {
    return;
  }
  var features = map.getFeaturesAtPixel(e.pixel, {
    layerFilter: function(l) {
      return l == vector;
    }
  });
  if (features && features[0] != modifySource.getFeatures()[0]) {
    modifySource.clear();
    modifySource.addFeature(features[0]);
  }
}
map.on("pointermove", pointermove);

Также обратите внимание, что этот обработчик должен быть зарегистрирован до того, как на карту будет добавлено взаимодействие «Изменить».

24.08.2017
  • Привет, ахосевар Спасибо за ответ. Я заставил его работать. Разве нельзя изменять стиль элементов в событии modifystart? Я получаю ту же ошибку, что и в ссылке, однако если я сначала изменю стиль в изменить событие, как показано ниже, оно сработало: ‹code› modify.on (modifystart ', function (e) {foreach (e.features, function (elem, ...) {elem.once (change, function (event) {elem .target.setStyle (...)}}}) ‹/code›, если я изменил.on (modifystart ', function (e) {e.features [0] .setStyle (...)}), я получил ошибка. Есть идеи, почему? 20.10.2017
  • Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..