vue 中使用 cesium

我是在 vue 项目里面使用的 cesium,但是呢,有点问题,就是有些语法在js转vue的时候有些许的限制,比如说js中相对路径引入文件是一切OK的,vue 也能解决,但是呢,在引入的文件中又引用了其他的文件,vue 处理起来就不是特别的好用,所以说,我是直接在 vue 文件里面使用 iframe 标签引入的 html 文件来实现接入的,而vue和iframe之间的通信采用的 postMessage 方式实现,下面就稍微介绍一下。

vue项目引入cesium

这个相对来说简单,我也在之前的博客有介绍过,主要是下载cesiumjs包,然后这个包下载比较分时费力,所以说我整理了一下百度云盘存了起来。

百度云盘:链接:https://pan.baidu.com/s/1lf75yPi8XPPo5Y9YTvrVig
提取码:0c7s

如果有需要的可以在这里下载。

下载下来之后选择一个自己需要的版本,然后放进 public 文件夹下就可以。

编写 cesium 代码

开始已经说了,我是写了一个html文件,所有有关3D的东西全部在这个html文件里面实现的,所以说,最后需要我们将写的代码文件通过iframe标签引入到vue项目当中去,其中有几个注意的点,我来稍微强调一下。

首先第一个,这个html文件就是一个普通的html文件,按照官网的官方文档写响应的代码就可以了,但是呢,关键是怎么使用iframe标签嵌入进我们的vue项目,首先强调,我是用的是cli3创建的项目,其他方式创建可靠性不确定,且下面的代码都是在我发文之前编写demo测试通过的,截止到发文为止完全可靠!

编写iframe标签

这个就很简单了,无非就是在需要引入3D的地方不写详细的代码了, 然后就是单纯的写一个iframe标签,把编写具体3D代码的html文件引入进来就可以了。

下面是主要代码:

<iframe ref="iframeModel" src="/static/cesium.html" width="100%" height="100%" style="background-color: #070707;" frameborder="0">
</iframe>

ok,就是上面这一行代码就完事了,然后src写的就是我们具体详细代码的html文件,引入进来就行了。

注意!!! cli3 创建的vue项目,这个引入的本地 html 文件一定、是一定要放在 public/static 文件夹下面,放在其他的地方不可以!!!而且,使用iframe标签引入的时候,直接 /static/文件名.html 就可以,不这样整,可能引入会报错,也就是显示不出来!切记切记!

然后就是编写HTML文件了,这个没啥可以说的,正常编写就可以,没啥注意的。

在这个 html 文件中引入cesiumjs 包,文件路径写自己的哈,别直接粘,我们不一定一样。

  <link rel="stylesheet" href="../Cesium/Widgets/widgets.css"><script type="text/javascript" src="../Cesium/Cesium.js"></script>

然后就是很常规的操作,简单写一下关键代码哈,不全,根据实际需要得改一下哈。

   // 初始化3D地图viewer = new Cesium.Viewer('map', {baseLayerPicker: false,  // 影像切换animation: false,  //是否显示动画控件timeline: false, //是否显示时间线控件infoBox: false, //是否显示点击要素之后显示的信息geocoder: false, //是否显示地名查找控件navigationHelpButton: false, //是否显示帮助信息控件terrainProvider: new Cesium.CesiumTerrainProvider({   // 加载地形信息url: 'https://www.supermapol.com/realspace/services/3D-stk_terrain/rest/realspace/datas/info/data/path',requestVertexNormals: true}),})

自定义地图实例

// 添加mapbox自定义地图实例
var layer = new Cesium.MapboxStyleImageryProvider({url: 'https://api.mapbox.com/styles/v1',username: 'username',styleId: '这里是我的styleId',accessToken: '这个是我的accessToken',scaleFactor: true
});
viewer.imageryLayers.addImageryProvider(layer);

这个地方我稍微多说两句哈,我们在做具体项目的时候吧,肯定不可能直接把默认的地图样式给渲染出来,因为设计不会这么简单就放过我们开发,对吧?所以说可能需要深色模式,或者是个性化的地图底层,这个就很难整,不好搞,百度地图和高德地图甚至是天地图,他们都可以设计个性化地图,但是这些个性化地图都只能在高德或者百度的产品里面使用,在cesium中用不了,所以说,这个时候有一个相当牛逼的网站,可以提供在cesium中使用的个性化地图,这个网站就是伟大的 —— mapbox。在这里面可以创建、设计、发布自己的个性化地图给cesium使用,超级牛掰,就是国外的打开可能有点慢,进去注册,然后怎么用,自己研究一下就可以了!


可以设置地图的颜色,文字等很多东西。创建好自己的个性化地图,就可以设置成公开的,然后就可以根据一些参数调用到这种设计好的个性化地图,很淫性!自己慢慢研究,上面代码就是我引入的例子,但是关键地方我隐掉了,换成你的就OK了!

然后是加载模型,找模型太费劲了,开发一星期,有半星期都在找模型上,那么没错,贴心的我也给各位准备了几个测试的军舰3D模型,均是gltf格式的,不需要转化,贴心吧?

百度云盘 链接:https://pan.baidu.com/s/1T1fYUBk-9J6VKmWA7r3Wag
提取码:63y7

不想要军舰?在推荐一个网址!操碎了心,稀碎啊!

sketchfab 进这个网站,模型收费很正常哈,不要抱怨,但是这里面也有很多免费的,可能不是很好,但是测试完全够用,注册账号,撒欢去吧!

    // 添加3D模型var scene = viewer.scenevar hpr = new Cesium.HeadingPitchRoll(Cesium.Math.toRadians(45), // 设置这个属性即可(顺时针旋转的角度值)Cesium.Math.toRadians(0),Cesium.Math.toRadians(0));  // 设置方向角var origin = Cesium.Cartesian3.fromDegrees(117.70901, 38.781056, 0.0);   // 设置位置var modelMatrix = Cesium.Transforms.headingPitchRollToFixedFrame(origin,hpr);var model = scene.primitives.add(new Cesium.Model.fromGltf({url: './models/rrv_rapid_response_vessel/scene.gltf', //gltf文件的URL// url: './models/ces1/scene.gltf', //gltf文件的URLmodelMatrix: modelMatrix,color: new Cesium.Color(0, 0.9, 0.8, 0.5),  // 设置模型的颜色以及透明度scale: 1000.0     //放大倍数}))

设置相机飞入角度

    // 设置相机飞入视角viewer.camera.flyTo({destination: new Cesium.Cartesian3.fromDegrees(117.80901, 38.481056, 15000.0),     //相机飞入点orientation: {heading: 0,pitch: -0.5,roll: 0.0}})

设置相机视角,和上边不要共用哈,不然冲突。

    // 设置相机角度// heading - 代表镜头左右方向, 正值为右, 负值为左, 360度和0度是一样的// pitch - 代表镜头上下方向, 正值为上, 负值为下.// roll - 代表镜头左右倾斜.正值, 向右倾斜, 负值向左倾斜viewer.scene.camera.setView({destination: Cesium.Cartesian3.fromDegrees(117.80901, 38.481056, 15000.0),orientation: {heading: Cesium.Math.toRadians(0),pitch: Cesium.Math.toRadians(-25),roll: Cesium.Math.toRadians(0)}});

完事!齐活!


当然了,我这是自己写的测试Demo,有点简陋有点丑,但是,只要你地图设置的好,模型找的漂亮,你就真她娘的是个天才~

vue postMessage 通信给 iframe

这个其实不是很难哈,直接百度就到手了,首先iframe向我最开始一样写,主要是有一个 ref

然后呢,直接上代码:

vue页面

监听接受

   mounted() {window.addEventListener('message', function (event) {//此处执行事件console.log('监听到iframe数据--------> ', event.data)})},

发送

   this.$nextTick(() => {this.$refs.iframeModel.contentWindow.postMessage({type: 'full'}, '*')})

iframe 页面

window.addEventListener('message', function (e) {const da = e.data;console.log("接收到的数据---->> ", da )});

齐活了!

vue 中使用 cesium相关推荐

  1. Cesium 开发笔记-Vue 中使用 Cesium(vue-cli-plugin-cesium)

    Cesium 开发笔记-Vue 中使用 Cesium(vue-cli-plugin-cesium) 通常情况下,我们要在 Vue 中使用 Cesium,首先要安装 Cesium,然后要在 vue-cl ...

  2. Vue中使用Cesium.js的库

    点击进入 Vue Cesium官网 //vc-navigation <template><el-row ref="viewerContainer" class=& ...

  3. vue中使用Cesium

    npm准备 npm i cesium -D vue.config.js const CopyWebpackPlugin = require('copy-webpack-plugin') const w ...

  4. VUE中实现三维地图Cesium加载全国地质管地质地图

    1.Vue中使用脚手架npm安装Cesium,安装命令:npm install cesium,加载三维地图Cesium,下载Cesium相关文件,安装成功后如下图所示: <div id=&quo ...

  5. 怎么将vue模板转换为html,vue中自定义html文件的模板

    如果默认生成的 HTML 文件不适合需求,可以创建/使用自定义模板. 一是通过 inject 选项,然后传递给定制的 HTML 文件.html-webpack-plugin 将会自动注入所有需要的 C ...

  6. props写法_简单理解vue中Props属性

    本文实例为大家解析了vue中Props的属性,供大家参考,具体内容如下 使用 Props 传递数据 组件实例的作用域是孤立的.这意味着不能并且不应该在子组件的模板内直接引用父组件的数据.可以使用 pr ...

  7. vue ts 设置tslint提示_Typescript 在 Vue 中的实践(包含2.x、3.x)

    1 使用 typescript 的优势 聊到 ts 时有一个不能规避的问题:为什么要使用 ts ,相比 js 有什么优势吗?下面我从两个方面试着回答一下这个问题: 1.1 项目开发时的便利 避免低级 ...

  8. VUE中使用Echarts绘制地图迁移

    踩坑说明 很久以前写jsp时使用过echarts的china.js插件,不过echarts是2.0的,目前vue项目中使用echarts3.8.5,直接将china.js插件引入,代码复制,运行一看, ...

  9. vue中动态样式不起作用? scoped了解一下

    vue中style标签使用属性scoped的注意事项 style上添加属性scoped可以实现样式私有化,但是在使用动态样式时,样式会不起作用.可以先去掉scoped 转载于:https://www. ...

最新文章

  1. 分析 JDK 源码丨Java Thread
  2. Spring源码解析:自定义标签的解析过程
  3. flink和kafka区别_Apache Flink和Kafka入门
  4. java异步线程池同时请求多个接口数据
  5. JAVAEWEB实现文件的上传案例
  6. linux安装步骤_图解 Debian 10(Buster)安装步骤 | Linux 中国
  7. i219v微星 驱动_适用于WinPE的I219V英特尔驱动程序
  8. python 共享文件_通过 Python 快速实现局域网内文件共享
  9. 电路仿真软件用matlab,基于MATLAB的电路仿真软件设计.doc
  10. 加密的pdf文件如何解密?
  11. kettle怎么复制资源库的job_kettle插件更新:定时执行资源库及文件的ktr和kjb作业...
  12. 小马哥----高仿苹果6s 主板型号S106s 更换内核 刷机拆机主板图与开机识别图
  13. 虚拟研讨会:如何设计好的RESTful API?
  14. 设置单选框只能选择一个
  15. 生成式对抗网络GAN(一)—基于python实现
  16. 蓝牙第一章:概述、无线技术协议和基带协议
  17. 系统稳定性指标计算器
  18. mysql vip切换未重连问题_改良版本的使用keepalived构建高可用mysql-HA
  19. Java实现21点多人游戏(期末作业)
  20. operator理解

热门文章

  1. cmd 组合命令和管道命令的使用
  2. OPTIONS预检请求
  3. CookieSession会话技术
  4. 他被称为中国第一程序员,一人之力单挑微软,如今拜入武当修道
  5. [数据结构]二叉树的结构及实现
  6. UI设计师有哪些就业方向选择?
  7. App详细测试流程及测试点
  8. 14_python笔记-正则表达式
  9. wordpress采集插件支持任意wordpress主题
  10. [BUUCTF]PWN——[HarekazeCTF2019]baby_rop2