openlayers 添加视口范围内的矢量图层, 删除视口外的图层
import GeoJSON from 'ol/format/GeoJSON';
import { Vector as VectorLayer } from 'ol/layer';
import { Vector as SourceVec, Cluster, OSM, TileArcGISRest, TileWMS } from 'ol/source';
import { Style, Icon, Fill, Stroke, Text, Circle as CircleStyle } from 'ol/style';
import 'ol/ol.css';
import { createEmpty, extend, containsExtent, intersects } from 'ol/extent';
addVectorLayersFollowingViewport(map, dataList) {
let inlist = [];
let addList = [];
let outNamelist = [];
const viewportExtent = map.getView().calculateExtent(map.getSize());
var layers = map.getLayers().getArray();
for (let i = 0; i < dataList.length; i++) {
const element = dataList[i];
if (element.geojson) {
const format = new GeoJSON();
const features = format.readFeatures(element.geojson, {
featureProjection: map.getView().getProjection(),
});
const totalExtent = createEmpty();
features.forEach((feature) => {
extend(totalExtent, feature.getGeometry().getExtent());
});
const isInViewport = intersects(viewportExtent, totalExtent);
if (isInViewport) {
inlist.push(element);
} else {
outNamelist.push(element.layerName);
}
}
}
for (let i = 0; i < inlist.length; i++) {
const element = inlist[i];
for (let j = 0; j < layers.length; j++) {
const layer = layers[j];
if (layer.get('name') != element.layerName) {
addList.push(element);
}
}
}
if (addList.length > 0) {
addList.forEach((element) => {
if (element.geojson) {
let vectSec = new SourceVec({
features: new GeoJSON({
featureProjection: 'EPSG:4326',
}).readFeatures(element.geojson),
format: new GeoJSON(),
wrapX: true,
});
let layer = new VectorLayer({
source: vectSec,
name: element.layerName,
style: function (feature, resolution) {
return new Style({
stroke: new Stroke({
color: '#ff0000',
width: 3,
}),
fill: new Fill({
color: '#ff0000',
}),
text: new Text({
font: '12px 微软雅黑',
placement: 'line',
text: feature.get('NAME'),
fill: new Fill({
color: '#fff',
}),
stroke: new Stroke({
color: '#ff0000',
width: 3,
}),
overflow: true,
}),
});
},
});
map.addLayer(layer);
}
});
}
if (outNamelist.length > 0) {
for (let i = 0; i < layers.length; i++) {
const layer = layers[i];
if (outNamelist.includes(layer.get('name'))) {
map.removeLayer(layer);
}
}
}
}