『Cesium 基础』 点位聚合(十四)

实现效果

 

实现方式

  • 通过 new Cesium.EntityCluster(options) 接口对象实现

  • 而 new Cesium.DataSource() 有成员变量 clustering

  • clustering 类型是 EntityCluster

代码实现,基于 vue 前端框架

  • 这里使用的是 cesium 沙盒演示中自带的数据进行实现

  • 加载数据

    1getKMLDTSource() {
    2    let options = {
    3      camera: this._viewer.scene.camera,
    4      canvas: this._viewer.scene.canvas
    5    };
    6    return Cesium.KmlDataSource.load(this.url, options);
    7  },
  • 添加到 viewer.dataSources

    1let dataSourcePromise = this._viewer.dataSources.add(this.getKMLDTSource());
  • 根据得到的 DataSource 对象配置聚合

     1dataSourcePromise.then((_dataSource) => {
    2    vm.dataSource = _dataSource;
    3    let pixelRange = 15,
    4        minimumClusterSize = 3,
    5        enabled = true;
    6    _dataSource.clustering.enabled = enabled;
    7    _dataSource.clustering.pixelRange = pixelRange;
    8    _dataSource.clustering.minimumClusterSize = minimumClusterSize; 
    9    _dataSource.clustering.pixelRange = 0;
    10    _dataSource.clustering.pixelRange = pixelRange;
    11    vm.customStyle();
    12});
  • 自定义聚合样式

     1 customStyle() {
    2  let vm = this; 
    3    vm.removeListener = vm.dataSource.clustering.clusterEvent.addEventListener(
    4      function(clusteredEntities, cluster) {
    5        cluster.label.show = false;
    6        cluster.billboard.show = true;
    7        cluster.billboard.id = cluster.label.id;
    8        cluster.billboard.verticalOrigin = Cesium.VerticalOrigin.BOTTOM;
    9        if (clusteredEntities.length >= 50) {
    10          cluster.billboard.image = vm.pins["pin50"];
    11        } else if (clusteredEntities.length >= 40) {
    12          cluster.billboard.image = vm.pins["pin40"];
    13        } else if (clusteredEntities.length >= 30) {
    14          cluster.billboard.image = vm.pins["pin30"];
    15        } else if (clusteredEntities.length >= 20) {
    16          cluster.billboard.image = vm.pins["pin20"];
    17        } else if (clusteredEntities.length >= 10) {
    18          cluster.billboard.image = vm.pins["pin10"];
    19        } else {
    20          let singleDigitPins = vm.pins["single"];
    21          cluster.billboard.image =
    22            singleDigitPins[clusteredEntities.length - 2];
    23        }
    24      }
    25    );
    26
    27},
  • 初始化图标

     1 createPints() {
    2  this.pins = {};
    3  var pinBuilder = new Cesium.PinBuilder();
    4  var pin50 = pinBuilder.fromText("50+", Cesium.Color.RED, 48).toDataURL();
    5  this.pins["pin50"] = pin50;
    6  var pin40 = pinBuilder
    7    .fromText("40+", Cesium.Color.ORANGE, 48)
    8    .toDataURL();
    9  this.pins["pin40"] = pin40;
    10  var pin30 = pinBuilder
    11    .fromText("30+", Cesium.Color.YELLOW, 48)
    12    .toDataURL();
    13  this.pins["pin30"] = pin30;
    14  var pin20 = pinBuilder
    15    .fromText("20+", Cesium.Color.GREEN, 48)
    16    .toDataURL();
    17  this.pins["pin20"] = pin20;
    18  var pin10 = pinBuilder.fromText("10+", Cesium.Color.BLUE, 48).toDataURL();
    19  this.pins["pin10"] = pin10;
    20  var singleDigitPins = new Array(8);
    21  for (var i = 0; i < singleDigitPins.length; ++i) {
    22    singleDigitPins[i] = pinBuilder
    23      .fromText("" + (i + 2), Cesium.Color.VIOLET, 48)
    24      .toDataURL();
    25  }
    26  this.pins["single"] = singleDigitPins;
    27},
posted @ 2022-10-24 09:27  A影子放風箏  阅读(2038)  评论(0)    收藏  举报
// 侧边栏目录 // https://blog-static.cnblogs.com/files/douzujun/marvin.nav.my1502.css