Как представить функцию вне кластера OpenLayers 4? - PullRequest
0 голосов
/ 24 июня 2019

Я работаю с Угловая зависимость OpenLayers , на самом деле, я использую v4.1.1 и в настоящее время 'я не могу обновить его до последней версии.

У меня есть карта с ol.source.Cluster. Он группирует все мои ol.layer.Vector слои, которые состоят из функций канцелярской кнопки, аналогично в этом примере .

Функции в моем приложении могут быть выбраны пользователем. Это действие выделяет один указанный объект и увеличивает масштаб карты до объекта, чтобы сообщить пользователю, какой из них выбран. Моя проблема возникает, когда функция кластеризована; Мне бы хотелось, чтобы эта функция могла отображаться вне кластера и чтобы она могла быть снова добавлена ​​в кластер, когда она не выбрана. Это возможно легко? Я прочитал документацию участвующих классов, ol.source.Cluster и ol.source.Vector (я знаю, что они v4.6.5, но я не сделал найдите v4.1.1) и, возможно, я что-то пропускаю или, может быть, вы знаете способ сделать это.

Я пробовал два решения, но мне не очень нравится:

  • Измените свойство distance кластера, установив его на 0. Таким образом, кластеризация отключена, и все функции отображаются по отдельности. Это не лучший подход, потому что пользователь может уменьшить масштаб карты, и на карте может быть слишком много кнопок. Даже если я обрабатываю уровень масштабирования и включаю функцию кластеризации, когда масштабирование слишком низкое, выбранная метка также будет кластеризована, и это нежелательное поведение.
  • Чтобы использовать знакомый слой и представить там выбранную метку. Этот слой будет содержать в своем источнике только один объект, выбранный, и он будет удален, если он не выбран. Я должен признать, что я еще не реализовал этот пример, потому что он немного сложен (мне пришлось бы также обрабатывать видимость этого слоя вдоль слоев кластера и т. Д.), И у меня не так много времени, чтобы выполнить POC ,

    ОБНОВЛЕНИЕ: Я только что установил geometryFunction в параметрах источника кластера, который фильтрует кнопки и просто группирует те, которые не выбраны. Проблема в том, что выбранный не отображается, и поэтому мне нужен вспомогательный слой, чтобы передать ему выбранный объект, который будет представлен:

    let clusterSource = new ol.source.Cluster({
       distance: 40,
       source: vectorSource,
       geometryFunction: (feature) => {
           if (feature.get('selected')) {
               return null;
           }
           return feature.getGeometry() as ol.geom.Point;
       }
    });

Итак, подытожив, есть ли способ удалить элемент из кластера и представить его отдельно вместе с кластерами?

1 Ответ

0 голосов
/ 03 июля 2019

Наконец, поскольку я не нашел ничего в OpenLayers 4 API , чтобы легко достичь своей цели, я реализовал подход вспомогательного уровня.Как и в остальных случаях, я кластеризую все кнопки в одном источнике (эти кнопки представляют объекты разных типов, поэтому каждый тип может отображаться / скрываться индивидуально).Но когда я выбираю один объект, я прекращаю кластеризацию его через geometryFunction источника кластера и клонирую его в вспомогательном слое, отображая на карте его как один выбранный объект (с определенным стилем).

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

Чтобы достичь этого, я создал класс js, который наследуется от ol.layer.Vector для расширения его функциональности,чтобы добавить то, что мне нужно.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...