cesium实现二三维联动

记录项目中实现二三维地图联动

效果如下:

第一步:现在页面中加载二三维地图(地图的初始化已省略)

<template>
  <div>
    <div><button @click="show">二三维联动</button></div>
    <div>
      <div id="cesiumcontainer3D" @mouseenter="mouseleave3d"></div>
      <div id="cesiumcontainer2D" @mouseenter="mouseleave2d"></div>
    </div>
  </div>
</template>

<style lang="scss" scoped>
#cesiumcontainer3D {
  height: calc(100vh - 0px);
  width: 100%;
  margin: 0 0 0 0;
  padding: 0 0 0 0;
  float: left;
}
#cesiumcontainer2D {
  height: calc(100vh - 0px);
  width: 100%;
  margin: 0 0 0 0;
  padding: 0 0 0 0;
  float: right;
}
</style>

第二步:监听实现联动

    mouseleave3d() {
      window.is3d = true;
    },
    mouseleave2d() {
      window.is3d = false;
    },
    setView23D(is2D_show) {
      // 二维地图事件
      if (is2D_show == false) {
        window.removeChanged();
        map_2D.off("moveend");
      } else {
        map_2D.on("moveend", (event) => {
          if (window.is3d) return;
          const bounds = map_2D.getBounds();
          this.viewer.camera.flyTo({
            destination: Cesium.Rectangle.fromDegrees(
              bounds._southWest.lng,
              bounds._southWest.lat,
              bounds._northEast.lng,
              bounds._northEast.lat
            ),
            duration: 0.25,
          });
        });

        // 三维地图事件
        const fitBounds2d = () => {
          if (!window.is3d) return;
          let levelInfo = "级数:0级  ";
          let tileRender = this.viewer.scene._globe._surface._tilesToRender;
          if (tileRender && tileRender.length > 0) {
            levelInfo =
              "级数:" +
              this.viewer.scene._globe._surface._tilesToRender[0]._level +
              "级  ";
            console.log(levelInfo);
          }
          const rectangle = this.viewer.camera.computeViewRectangle();
          // 弧度转为经纬度
          const west = (rectangle.west / Math.PI) * 180;
          const north = (rectangle.north / Math.PI) * 180;
          const east = (rectangle.east / Math.PI) * 180;
          const south = (rectangle.south / Math.PI) * 180;
          map_2D.fitBounds([
            [south, west],
            [north, east],
          ]);
        };
        window.removeChanged =
          this.viewer.scene.camera.moveEnd.addEventListener(function () {
            fitBounds2d();
          });
      }
    },
    show() {
      this.is2D_show = !this.is2D_show;
      this.setView23D(this.is2D_show);
      if (this.is2D_show) {
        this.switchMapView("23D");
      } else {
        this.switchMapView("3D");
      }
    },
    // 切换地图视图
    switchMapView(type) {
      switch (type) {
        case "3D":
          document.getElementById("cesiumcontainer3D").style.width = "99.9%";
          document.getElementById("cesiumcontainer2D").style.width = "0.1%";
          break;
        case "23D":
          document.getElementById("cesiumcontainer3D").style.width = "50%";
          document.getElementById("cesiumcontainer2D").style.width = "50%";
          break;
      }
    },

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值