【Cesium】自定义标签弹窗,动态悬浮显示

1 篇文章 0 订阅

cesium 添加自定义标注显示

目标:通过ajax请求到后台数据做处理,并显示在地图上,弹出自定义弹框

开始

创建一个html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <link rel="stylesheet" href="./Cesium/Widgets/widgets.css" />
    <script src="./Cesium/Cesium.js"></script>
    <script src="./jquery.min.js"></script>
    <title>Document</title>
    <style>
      #cesiumContainer {
        width: 100%;
        height: 100vh;
      }
      .father{
          position: absolute;
          top: 100px;
          left: 100px;
      }
      .father li{
          list-style: none;
          line-height: 50px;
      }
      .father a{
          color: aliceblue;
      }
      //弹框基本样式
      .son{
          position: absolute;
          left: 1450px;
          top: 418px;
          background-color: rgb(148, 142, 142,0.5);
          color: rgb(253, 253, 253);
          border-radius: 10px;
          padding: 20px;
      }
    </style>
  </head>
  <body>
    <div>
      <div id="cesiumContainer"></div>
      <div class="father">
          <ul>
            <li onclick="addRain()"><a href="#" >城镇预报</a></li>
            <li onclick="detale()"><a href="#" >清除</a></li>
          </ul>
      </div>
      <div class="son" style="display: none;">弹框插槽</div>
    </div>
  </body>
  //需要在最后引入
  <script src="./index.js"></script>
  <script src="./arr.js"></script>
</html>

初始化地图

var viewer = new Cesium.Viewer("cesiumContainer", {
  infoBox: false,
  selectionIndicator: false,
  navigation: false,
  animation: false,
  timeline: false,
  baseLayerPicker: false,
  geocoder: false,
  homeButton: false,
  sceneModePicker: false,
  navigationHelpButton: false,
  shouldAnimate: false,
});

具体功能


let handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);
// 清除实体
function detale() {
  viewer.entities.removeAll();
  // 清除移动事件
  handler.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE);
}

// 请求数据
function addRain() {
  detale();
  var todo = [];
  $.ajax({
    url: "", //	请求的地址
    type: "POST",
    headers: {
      "X-Requested-With": XMLHttpRequest,
    },
    success: function (result) {
      console.log(result);
      //数据处理
      result.forEach((item) => {
        console.log(item);
        let obj = {};
        //实体的经纬度(必须)
        obj.lon = item.lon;
        obj.lat = item.lat;
        //以下看个人需求
        obj.stationName = item.stationName;
        obj.maxTemp = item.maxTemp;
        obj.minTemp = item.minTemp;
        obj.stationId= item.stationId;
        obj.rain = item.rain;
        obj.windS = item.windS;
        obj.windV = item.windV;
        obj.windD = item.windD;
        obj.weather = item.weather;//
        obj.color = item.color;//颜色
        todo.push(obj);
      });
      todo.forEach((item) => {
        addLabel(item);//调用创建实体的方法
        addbounced(); //为实体添加事件
      });
    },
    error: function (error) {
      console.log("error", error);
    },
  });
}


// 添加实体
function addLabel(item) {
  viewer.entities.add({
    id: item.stationId,
    name: item.stationName,//地图显示的名称
    show: true,
    position: Cesium.Cartesian3.fromDegrees(item.lon, item.lat),//实体位置(经纬度)
    description: item, //将实体需要弹出的信息储存在这里
    label: {
      text: item.stationName,
      fillColor: Cesium.Color.WHITE,
      scale: 0.5,
      font: "normal 40px MicroSoft YaHei",
      verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
      style: Cesium.LabelStyle.FILL_AND_OUTLINE,
      pixelOffset: new Cesium.Cartesian2(0, 30),
      outlineWidth: 20,
      outlineColor: Cesium.Color.BLACK,
    },
    billboard: {
      image: "./weather/weatherDay/" + Math.floor(item.minTemp) + ".gif",//为实体添加图片
      verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
    },
  });
}

// 移动事件
function addbounced() {
  var scene = viewer.scene;
  var num = {};
  // 创建移动事件
  handler.setInputAction(function (movement) {
    if (scene.mode !== Cesium.SceneMode.MORPHING) {
      var pickedObject = scene.pick(movement.endPosition);
      if (
        scene.pickPositionSupported &&
        Cesium.defined(pickedObject) &&
        pickedObject.id !== ""
      ) {
        $(".son").html("");//每次弹出时先清空
        var windowPosition = movement.startPosition;//获取屏幕坐标
        num.x = windowPosition.x + 50;
        num.y = windowPosition.y + 50;
        //获取弹出框需要显示的内容,为创建时的 description 属性
        var todo = pickedObject.id._description._value;
        //修改弹出框
        $(".son").css("display", "block");
        $(".son").css("left", num.x);
        $(".son").css("top", num.y);
        // 内容
        //es6模板字符串
        var addHtml = `<p>
        <img src="./weather/weatherDay/${Math.floor(
          todo.maxTemp
        )}.gif" style="width: 40px;margin-left: 40px;">
        </p>
		 <span style="width:20px;"></span>${todo.windV}</p>
        <p>最小雨量:${todo.minTemp}</p>
         <p>最大雨量:${todo.maxTemp}</p>`;
        $(".son").append(addHtml);
      } else {
        $(".son").html("");
        $(".son").css("display", "none");
      }
    }
  }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
}

这个是自己写的一个小功能,还不够完善,需要的话直接拿去用

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

如一一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值