getFeaturesAtPixel () для включения удаленных (скрытых) функций - PullRequest
0 голосов
/ 09 января 2019

Есть ли способ получить все элементы в одном слое на одном конкретном пикселе, включая скрытые из-за растрескивания? В настоящее время при вызове Map.getFeaturesAtPixel() (или Map.forEachFeatureAtPixel()) эти функции опускаются.

Ответы [ 2 ]

0 голосов
/ 20 января 2019

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

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

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

0 голосов
/ 10 января 2019

getFeaturesAtPixel предназначен для отчета о том, что именно отображается на карте. Если вы хотите получить все объекты в определенном месте, вы можете использовать метод ol/source/Vector getFeaturesInExtent для небольшого буфера (например, 2 пикселя) вокруг интересующей вас координаты:

import {boundingExtent, buffer} from 'ol/extent';

map.on('click', function(e) {
  const extent = boundingExtent([e.coordinate]);
  buffer(extent, 2 / view.getResolution());
  matches = source.getFeaturesInExtent(extent);
});

Когда вы работаете с векторными плитками, вы можете добиться того же, сначала получив плитку

const tileGrid = vectorTileSource.getTileGrid();
const tileCoord = tileGrid.getTileCoordForCoordAndResolution(coordinate, view.getResolution());
const tile = vectorTileSource.getTile(tileCoord);

, а затем получить только функции в вашем буфере экстента:

import {intersects} from 'ol/extent';

const features = tile.getFeatures();
const matches = [];
for (let i = 0, ii = features.length; i < ii; ++i) {
  const feature = features[i];
  if (intersects(extent, feature.getGeometry().getExtent()) {
    matches.push(feature);
  }
}
...