1f244194创建于 2024年12月9日历史提交
import Feature from '../../../../src/ol/Feature.js';
import Map from '../../../../src/ol/Map.js';
import View from '../../../../src/ol/View.js';
import Point from '../../../../src/ol/geom/Point.js';
import VectorLayer from '../../../../src/ol/layer/Vector.js';
import VectorSource from '../../../../src/ol/source/Vector.js';
import CircleStyle from '../../../../src/ol/style/Circle.js';
import Fill from '../../../../src/ol/style/Fill.js';
import Stroke from '../../../../src/ol/style/Stroke.js';
import Style from '../../../../src/ol/style/Style.js';
import Text from '../../../../src/ol/style/Text.js';

const center = [1825927.7316762917, 6143091.089223046];
const map = new Map({
  pixelRatio: 1,
  target: 'map',
  view: new View({
    center: center,
    zoom: 12.7,
  }),
});

const sourceBlue = new VectorSource();
sourceBlue.addFeatures([
  new Feature({
    geometry: new Point([center[0] + 1000 + 540, center[1] + 900 - 600]),
    text: 'top-blue',
  }),
]);
// on-top blue circle.
// shows that objects (red layer) will not serve as obstacles for layers on-top.
map.addLayer(
  new VectorLayer({
    zIndex: 4,
    declutter: true,
    source: sourceBlue,
    style: function (feature) {
      return new Style({
        image: new CircleStyle({
          radius: 10,
          stroke: new Stroke({
            color: 'blue',
            width: 8,
          }),
          declutterMode: 'declutter',
        }),
        text: new Text({
          text: feature.get('text'),
          font: 'italic bold 18px Ubuntu',
          textBaseline: 'bottom',
          offsetY: -15,
        }),
      });
    },
  }),
);

const sourceRed = new VectorSource();
sourceRed.addFeatures([
  new Feature({
    geometry: new Point([center[0] + 1000, center[1] + 1000 - 200]),
    text: 'c-red',
  }),
  new Feature({
    geometry: new Point([center[0] + 1000 - 540, center[1] + 1000]),
    text: 'w-red',
  }),
  new Feature({
    geometry: new Point([center[0] + 1000 + 540, center[1] + 1000 - 400]),
    text: 'e-red',
  }),
]);
// red circles are always drawn, but serve as obstacles.
// however, they cannot serve as obstacles for layers on-top (blue layer).
// texts are decluttered against each other and the circles.
map.addLayer(
  new VectorLayer({
    zIndex: 3,
    declutter: true,
    source: sourceRed,
    style: function (feature) {
      return new Style({
        image: new CircleStyle({
          radius: 10,
          stroke: new Stroke({
            color: 'red',
            width: 8,
          }),
          declutterMode: 'obstacle',
        }),
        text: new Text({
          text: feature.get('text'),
          font: 'italic bold 18px Ubuntu',
          textBaseline: 'bottom',
          offsetY: -15,
        }),
      });
    },
  }),
);

const sourceOrange = new VectorSource();
sourceOrange.addFeatures([
  new Feature({
    geometry: new Point([center[0], center[1]]),
    text: 'c-orange',
  }),
  new Feature({
    geometry: new Point([center[0] - 540, center[1]]),
    text: 'w-orange',
  }),
  new Feature({
    geometry: new Point([center[0] + 540, center[1]]),
    text: 'e-orange',
  }),
]);
// orange circles are always drawn.
// texts are decluttered against each other and the blue/red layer circles/texts.
map.addLayer(
  new VectorLayer({
    zIndex: 2,
    declutter: true,
    source: sourceOrange,
    style: function (feature) {
      return new Style({
        image: new CircleStyle({
          radius: 15,
          fill: new Fill({
            color: 'orange',
          }),
          declutterMode: 'none',
        }),
        text: new Text({
          text: feature.get('text'),
          font: 'italic bold 18px Ubuntu',
          textBaseline: 'bottom',
          offsetX: -25,
          offsetY: -17,
        }),
      });
    },
  }),
);

const sourceCyan = new VectorSource();
sourceCyan.addFeatures([
  new Feature({
    geometry: new Point([center[0] + 1000 - 700, center[1] - 100]),
    text: 'w-cyan',
  }),
  new Feature({
    geometry: new Point([center[0] + 1000, center[1] - 400]),
    text: 'c-cyan',
  }),
  new Feature({
    geometry: new Point([center[0] + 1000 + 700, center[1] - 700]),
    text: 'e-cyan',
  }),
]);
// cyan circles are always drawn.
// texts are decluttered against each others (and blue/red/orange layers).
// the circles of the orange layer and this layer are no obstactles for texts.
map.addLayer(
  new VectorLayer({
    zIndex: 1,
    declutter: true,
    source: sourceCyan,
    style: function (feature) {
      return new Style({
        image: new CircleStyle({
          radius: 15,
          fill: new Fill({
            color: 'cyan',
          }),
          declutterMode: 'none',
        }),
        text: new Text({
          text: feature.get('text'),
          font: 'italic bold 18px Ubuntu',
          textBaseline: 'middle',
          textAlign: 'right',
          offsetX: -19,
        }),
      });
    },
  }),
);

render({tolerance: 0.007});