OpenLayers. Как работает оператор intersects в функции filter?
Я создаю инструмент для выборки объектов карты через полигоны, созданные функцией Draw
и при попытке использования оператора intersects
в функции filter
ничего не меняется, ошибок программа не выдает, но продолжает выделять объекты внутри extent
'а созданного вокруг полигона, т.е. фильтр будто бы просто игнорируется. Помогите разобраться с фильтрацией ибо на официальном сайте про это практически ничего не сказано.
// Импорт используемых ресурсов
import {Map, View} from 'ol';
import VectorSource from 'ol/source/Vector.js';
import GeoJSON from 'ol/format/GeoJSON.js';
import VectorImageLayer from 'ol/layer/VectorImage.js';
import {Fill, Stroke, Style} from 'ol/style.js';
import {DragBox, Select} from 'ol/interaction.js';
import Draw from 'ol/interaction/Draw.js';
import * as olExtent from 'ol/extent';
import {all, platformModifierKeyOnly} from 'ol/events/condition.js';
import Intersects from 'ol/format/filter/Intersects.js';
import {useGeographic} from 'ol/proj.js';
useGeographic();
// Добавляем слой с субъектами РФ:
const SourceSubjectsRF = new VectorSource({ // Источник с субъектами РФ
url: "./source/SubjectsRF.geojson",
format: new GeoJSON(),
});
const SubjectsRF = new VectorImageLayer({ // Слой карты с субъектами РФ
title: "Субъекты РФ",
source: SourceSubjectsRF,
style: new Style({
fill: new Fill({
color: 'transparent',
}),
stroke: new Stroke({
width: '2.5',
color: '#008080 '
})
}),
});
// Добавляем слой с МО РФ
const SourceRaionRF = new VectorSource({ // Источник с МО РФ
url: "./source/RaionRF.geojson",
format: new GeoJSON(),
});
const RaionRF = new VectorImageLayer({ // Слой с МО РФ
title: "Муниципальные районы РФ",
visible: true,
source: SourceRaionRF,
style: new Style({
fill: new Fill({
color: 'transparent',
}),
stroke: new Stroke({
width: '1.5',
color: '#20B2AA'
})
}),
});
const selectedFeatures = new VectorSource; // Источник с выделенными объектами
const SelectFeatures = new VectorImageLayer({ // Слой с выделенными объектами
title: "Выделенные объекты",
visible: true,
source: selectedFeatures,
style: new Style({
fill: new Fill({
color: '#E0FFFF ',
}),
stroke: new Stroke({
color: '#00CED1',
width: 2.5,
}),
}),
});
// Добавляем карту
const map = new Map({
layers: [SelectFeatures,SubjectsRF],
target: 'map',
view: new View({
center: [37.617520, 55.755865 ],
zoom: 5,
constrainRotation: 16,
}),
});
// Функция выборки, основанная на нарисованном полигоне
const DrawSource = new VectorSource; // Источник с нарисованными объектами
const Polygon = new Draw({
condition: platformModifierKeyOnly,
type: 'Polygon',
geometryName: 'DrawPolygon', // Название нарисованных полигонов
source: DrawSource,
});
map.addInteraction(Polygon);
DrawSource.on('addfeature', function () {
console.log(DrawSource.getFeatures());
const PolyExtent = DrawSource.getExtent(); // Охват нарисованного объекта
const ExtentFeatures = SourceSubjectsRF.getFeaturesInExtent(PolyExtent) // Объекты карты, попавшие в охват (массив)
.filter((feature) => // "feature" - текущий обрабатываемый элемент полученного массива
new Intersects(feature, 'DrawPolygon',),
);
selectedFeatures.addFeatures(ExtentFeatures);
console.log(selectedFeatures);
})
// Добавление счетчика выделенных объектов
const FCounter = document.getElementById('FCounter'); // Счетчик выделенных объектов из html
selectedFeatures.on(['addfeature','removefeature'], function () {
FCounter.innerHTML = ' ' +selectedFeatures.getFeatures().length+ " выделенных объектов";
console.log(FCounter);
})
// Очистка выделения
Polygon.on('drawstart', function () {
selectedFeatures.clear();
DrawSource.clear();
});