使用cesium给地图实例添加精灵图图标

前置条件:
1,将精灵图存放在本地文件中;
在这里插入图片描述

2,拿到对应的声明文件(该文件中存放了每一个类型的地图实例对应的图标在精灵图中的位置),我这里是json文件
在这里插入图片描述

这是某一个实例模型对应的数据;

我的做法是,系统登录之后,就掉接口获取到该json文件,并存储在本地存储中,然后需要用到的时候,直接从localstorage中去拿;
在这里插入图片描述
将精灵图存储在本地:
在这里插入图片描述
准备完成,接下来需要在数据来的时候进行渲染即可;
这里用的方法是,将拿到的每一个模型数据处理成cesium所使用的czml格式数据:

绘制图标关键代码:

drawPoint(itemParam) {
    let svgUrl = ''  //存储图标路径
    // 存在阵营信息及存在精灵图json数据
    if (!library.isNull(itemParam.BasicInfo.CS_ForceSide) && !library.isNull(library.getData('modelTypeAndImageContent'))) {
      var modelTypeJson = JSON.parse(library.getData('modelTypeAndImageContent'))
      Object.keys(modelTypeJson).forEach(key => { //key为json文件中的键名
        // console.log('key',key);
        if (key.includes(itemParam.BasicInfo.modelUUID) && key.includes(itemParam.BasicInfo.CS_ForceSide)) {  //匹配键名及阵营信息(1红/2蓝)
          let canvas = document.createElement('canvas'); //创建canvas,
          canvas.width = 120;
          canvas.height = 120;
          let canvastext = canvas.getContext('2d') //获取上下文
          canvastext.drawImage(imageSprite, -modelTypeJson[key].x, -modelTypeJson[key].y); //将精灵图中对应位置的图标在canvas中绘制
          svgUrl = canvas.toDataURL() 
          //toDataURL()是canvas对象的一种方法,用于将canvas对象转换为base64位编码;
          //将图片转换为base64位编码后,图片会跟随代码(html、css、js)一起请求加载,不会再单独进行请		求加载;可以防止由于图片路径错误导致图片加载失败的问题
        }
      })
    }
    let czml = [{
      id: 'document',
      version: '1.0'
    }, {
      id: itemParam.BasicInfo.id,
      name: itemParam.BasicInfo.CS_EntityName,
      label: {
        fillColor: {
          rgba: [255, 255, 255, 255]
        },
        font: '24px Helvetica',
        scale: 0.75,
        horizontalOrigin: 'LEFT',
        outlineColor: {
          rgba: [100, 0, 100, 200]
        },
        outlineWidth: 2,
        pixelOffset: {/* 实体名称-在现有位置向右移动20 */
          cartesian2: [20, 0]
        },
        style: 'FILL_AND_OUTLINE',
        text: itemParam.BasicInfo.CS_EntityName + ''// 字符串类型
      },
      billboard: {
        image: svgUrl, //使用路径
        scale: 0.3
      },
      position: {
        cartographicDegrees: [itemParam.Position.Longitude, itemParam.Position.Latitude, itemParam.Position.Altitude]
      }
    }]
    return czml
  },

每次数据来到之后,
调用该方法,然后将实例添加到数据源中,即可完成渲染

  		  let czml = RealTimeMode.drawPoint(item); // 实时绘制-实体图标元素
          var DataSource = new Cesium.CzmlDataSource();
          window.viewer.dataSources.add(DataSource.load(czml));//viewer实例在其他地方已创建

效果:
在这里插入图片描述
封装后的方法:

// 精灵图位置
const imageSprite = new Image();
imageSprite.src = '../../static/images/sprite.png'


// 精灵图图标绘制
  drawIcon(modelId,side){
    const modelTypeJson = JSON.parse(
      library.getData("modelTypeAndImageContent")
    );
    let svgUrl = "";
    Object.keys(modelTypeJson).forEach((key) => {
      //key为json文件中的键名
      if (
        key.includes(modelId) &&
        key.includes(side) 
      ) {
        //匹配键名及阵营信息(1红/2蓝)
        let canvas = document.createElement("canvas"); //创建canvas,
        canvas.width = 120;
        canvas.height = 120;
        let canvastext = canvas.getContext("2d"); //获取上下文
        canvastext.drawImage(
          imageSprite,
          -modelTypeJson[key].x,
          -modelTypeJson[key].y
        ); //将精灵图中对应位置的图标在canvas中绘制
        svgUrl = canvas.toDataURL();
      }
    });
    return svgUrl;
  }

直接调用这个方法,传入json文件中的id和对应的阵营信息即可渲染对应颜色的图标
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值