码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • vue3+Cesium 遇到的问题及解决办法(持续更新)


    我使用的版本:vue3 + vue/cli 5.0.6 + cesium1.95.0

    文章目录

          • 一、引入图片报错:Error loading image for billboard: [object Event]
          • 二、创建实体使用自定义材质时报错: export '文件名' (imported as 'Cesium') was not found in 'cesium/Cesium' (possible exports:
          • 三、使用自定义属性时报错:Cannot read properties of undefined
          • 四、鼠标放置实体的位置和点击位置不一致
        • **也许对你有帮助(以下都是我参考过并能成功运行的)**:

    一、引入图片报错:Error loading image for billboard: [object Event]

    解决办法:可以import或require引入一下再应用。


    二、创建实体使用自定义材质时报错: export ‘文件名’ (imported as ‘Cesium’) was not found in ‘cesium/Cesium’ (possible exports:

    解决办法:在引入的js文件或应用它的组件里(主要看报错的位置):
    将import * as Cesium from 'cesium/Cesium’改成let Cesium = require(‘cesium/Cesium’)。


    三、使用自定义属性时报错:Cannot read properties of undefined

    解决办法:在引入js文件时(用到了cesium),注意在cesium渲染之后在调用,不然会导致属性未定义或在cesium上找不到该属性。


    四、鼠标放置实体的位置和点击位置不一致

    我的情况是:我的地球视角并不是垂直地面的,是倾斜的,所以实体的放置位置如果是有高程的,那么看起来和鼠标点击位置就是会有差距的,如果放置位置使用pickEllipsoid(无高程),就是没差的。(我现在放置模型时,像飞机什么的就是有高程的,汽车这种就是没有高程的)。
    然后这个在我刚开始应用的时候真的很懵!!因为cesium获取点击处的位置信息api也太多了!像什么pick,drillPick,pickPosition,pickEllipsoid等等等,这里我根据自己理解总结一下:
    1、Scene:pick和drillPick主要用来获取实体对象,pick只能获取一个实体,drillPick可以获取点击位置处的多个实体(然后通过for循环遍历出来即可);pickPosition可以获取地球上点击位置对应的世界坐标,可用于模型表面位置的选取。
    2、camera:pickEllipsoid就是获取到地表即不含高程的位置坐标;getPickRay常和scene.globe.pick一起使用,适用于拾取有地形高程的点,但不可用于模型、倾斜摄影等表面高度。

    /*我用的window.viewer是因为我挂载到了window上*/
    
    //获取实体、删除实体
    var pick = window.viewer.scene.pick(e.position)
    if (Cesium.defined(pick)) {
          console.log(pick.id.id)
          window.viewer.entities.removeById(pick.id.id)
    }    
    
    //采用getPickRay和globe.pick获取笛卡尔坐标,并转换成经纬度(保留了四位小数)
    let ray = window.viewer.scene.camera.getPickRay(e.endPosition)              //获取相机射线
    let position = window.viewer.scene.globe.pick(ray, window.viewer.scene)     //根据射线和场景求出在球面中的笛卡尔坐标
        if (position) {
            let cartographicNew = Cesium.Cartographic.fromCartesian(position)
            let lon = Cesium.Math.toDegrees(cartographicNew.longitude).toFixed(4)           //获取经度,保留四位小数
            let lat = Cesium.Math.toDegrees(cartographicNew.latitude).toFixed(4)            //获取纬度
            let cameraHeight = Math.ceil(window.viewer.camera.positionCartographic.height)  //获取相机的高度
         }
         
    //从笛卡尔坐标获取经度
    function getLongitude(e) {
        const position = window.viewer.scene.pickPosition(e.position)
        const cartographicNew = Cesium.Cartographic.fromCartesian(position)
        const longitude = Cesium.Math.toDegrees(cartographicNew.longitude)
        return longitude
    }
    
    //获取纬度
    function getLatitude(e) {
        const position = window.viewer.scene.pickPosition(e.position)
        const cartographicNew = Cesium.Cartographic.fromCartesian(position)
        const latitude = Cesium.Math.toDegrees(cartographicNew.latitude)
        return latitude
    }
    
    //获取相机的高度
    function getCameraheight() {
        const cameraHeight = Math.ceil(window.viewer.camera.positionCartographic.height)
        return cameraHeight
    }
    
    //获取点击位置,返回在椭球上面的点的坐标(无高程)
    function getClickposition(e) {
        const earthPosition = window.viewer.camera.pickEllipsoid(e.position, window.viewer.scene.globe.ellipsoid)
        return earthPosition
    }
    
    //获取海拔高度
    function getHeight(e) {
        let cartesian = window.viewer.scene.globe.pick(window.viewer.camera.getPickRay(e.position), window.viewer.scene)
        let cartographic = window.viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian)
        let height = window.viewer.scene.globe.getHeight(cartographic)
        return height
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    ps:个人理解,欢迎指正或补充。


    也许对你有帮助(以下都是我参考过并能成功运行的):

    cesium官网
    cesium Github
    cesium中文api文档
    cesium实战系列总目录(详细实用)
    Cesium模型 旋转、缩放
    Cesium常用事件(点击、鼠标、相机移动)
    vue+Cesium实现画线测距,画面测面积(注释写的很清楚,在总代码里摘出相应的函数直接使用即可)

  • 相关阅读:
    【HTTP下】总结{重定向/cookie/setsockopt/流操作/访问网页/总结}
    背包问题——01—完全—多重—混合
    直方图均衡化
    SpringBoot整合Caffeine实现缓存
    数据异常问题分析方法
    Python算法于强化学习库之rlax使用详解
    TCP传输的三次握手、四次挥手策略是什么
    公司日常业务开发中,我是如何基于antd定制属于自己的主题
    【Python编程】【Jupyter Notebook】启动时报错:no available port could be found
    Spring加载后置处理器方式之模板方法
  • 原文地址:https://blog.csdn.net/Mo_olly/article/details/126172408
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号