Vue.js2+Cesium1.103.0 十五、绘制视锥,并可实时调整视锥姿态

news2024/9/21 16:30:38

Vue.js2+Cesium1.103.0 十五、绘制视锥,并可实时调整视锥姿态

Demo

<template>
  <div
    id="cesium-container"
    style="width: 100%; height: 100%;"
  />
</template>

<script>
/* eslint-disable no-undef */
/* eslint-disable new-cap */
/* eslint-disable no-unused-vars */
/**
 * 根据两个坐标,计算连接的线段与正北的夹角
 *
 */
import * as turf from '@turf/turf'
export default {
  data() {
    return {}
  },
  computed: {},
  watch: {},
  mounted() {
    window.$InitMap()
    viewer.camera.flyTo({
      destination: Cesium.Rectangle.fromDegrees(100, 10, 120, 70)
    })

    const altitude = 100000
    const distance = 1000
    const pointO = {
      longitude: 116.407387,
      latitude: 39.904179,
      altitude: altitude
    }
    const pointN = {
      label: 'N 0°',
      longitude: turf.rhumbDestination(
        turf.point([pointO.longitude, pointO.latitude]),
        distance,
        0
      ).geometry.coordinates[0],
      latitude: turf.rhumbDestination(
        turf.point([pointO.longitude, pointO.latitude]),
        distance,
        0
      ).geometry.coordinates[1],
      altitude: altitude
    }
    const pointE = {
      label: 'E 90°',
      longitude: turf.rhumbDestination(
        turf.point([pointO.longitude, pointO.latitude]),
        distance,
        90
      ).geometry.coordinates[0],
      latitude: turf.rhumbDestination(
        turf.point([pointO.longitude, pointO.latitude]),
        distance,
        90
      ).geometry.coordinates[1],
      altitude: altitude
    }
    const pointS = {
      label: 'S 180°',
      longitude: turf.rhumbDestination(
        turf.point([pointO.longitude, pointO.latitude]),
        distance,
        180
      ).geometry.coordinates[0],
      latitude: turf.rhumbDestination(
        turf.point([pointO.longitude, pointO.latitude]),
        distance,
        180
      ).geometry.coordinates[1],
      altitude: altitude
    }
    const pointW = {
      label: 'W 270°',
      longitude: turf.rhumbDestination(
        turf.point([pointO.longitude, pointO.latitude]),
        distance,
        270
      ).geometry.coordinates[0],
      latitude: turf.rhumbDestination(
        turf.point([pointO.longitude, pointO.latitude]),
        distance,
        270
      ).geometry.coordinates[1],
      altitude: altitude
    }
    const list = [pointN, pointE, pointS, pointW]
    for (let index = 0; index < list.length; index++) {
      const point = list[index]
      viewer.entities.add(
        new Cesium.Entity({
          position: Cesium.Cartesian3.fromDegrees(
            point.longitude,
            point.latitude,
            point.altitude
          ),
          label: {
            font: '14px sans-serif',
            text: point.label,
            fillColor: new Cesium.Color.fromCssColorString('#fff'),
            outlineColor: new Cesium.Color.fromCssColorString('#fff'),
            outlineWidth: 1,
            // verticalOrigin: Cesium.VerticalOrigin.CENTER,
            // horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
            showBackground: true
          },
          polyline: {
            positions: Cesium.Cartesian3.fromDegreesArrayHeights([
              pointO.longitude,
              pointO.latitude,
              pointO.altitude,
              point.longitude,
              point.latitude,
              point.altitude
            ]),
            width: 10,
            material: new Cesium.PolylineArrowMaterialProperty(
              new Cesium.Color.fromCssColorString('#fff').withAlpha(1)
            )
          }
        })
      )
    }

    const lines = [
      [
        {
          longitude: 112.9634812162806,
          latitude: 36.97040252777073,
          altitude
        },
        {
          longitude: 119.32663938454708,
          latitude: 42.26995861317594,
          altitude
        }
      ],
      [
        {
          longitude: 117.9592990653408,
          latitude: 38.38163978720803,
          altitude
        },
        {
          longitude: 123.42464237870345,
          latitude: 33.296977534577685,
          altitude
        }
      ],
      [
        {
          longitude: 111.53663125569267,
          latitude: 30.989726449061138,
          altitude
        },
        {
          longitude: 93.66207819341395,
          latitude: 42.32870629780615,
          altitude
        }
      ],
      [
        {
          longitude: 90.91200448882437,
          latitude: 40.709266162020185,
          altitude
        },
        {
          longitude: 109.04284513782429,
          latitude: 28.780767151167282,
          altitude
        }
      ]
    ]
    for (let index = 0; index < lines.length; index++) {
      const line = lines[index]
      const angle = turf.rhumbBearing(
        turf.point([line[0].longitude, line[0].latitude]),
        turf.point([line[1].longitude, line[1].latitude])
      )
      viewer.entities.add(
        new Cesium.Entity({
          position: Cesium.Cartesian3.fromDegrees(
            line[1].longitude,
            line[1].latitude,
            line[1].altitude
          ),
          label: {
            font: '14px sans-serif',
            text: `${angle.toFixed(0)}°`,
            fillColor: new Cesium.Color.fromCssColorString('#fff'),
            outlineColor: new Cesium.Color.fromCssColorString('#fff'),
            outlineWidth: 1,
            verticalOrigin: Cesium.VerticalOrigin.CENTER,
            horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
            showBackground: true
          },
          polyline: {
            positions: Cesium.Cartesian3.fromDegreesArrayHeights([
              line[0].longitude,
              line[0].latitude,
              line[0].altitude,
              line[1].longitude,
              line[1].latitude,
              line[1].altitude
            ]),
            width: 10,
            material: new Cesium.PolylineArrowMaterialProperty(
              new Cesium.Color.fromCssColorString('#fff').withAlpha(1)
            )
          }
        })
      )
    }

    const handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas)
    handler.setInputAction(function (event) {
      // 平面坐标系转笛卡尔空间直角坐标系
      /**
        position: Cartesian2 {x: 683.0753784179688, y: 512.71826171875}
        转
        Cartesian3{x: -2174106.926252774, y: 4386734.375324652, z: 4074136.167795586}
       */
      console.log(
        '平面坐标系转笛卡尔空间直角坐标系',
        viewer.scene.pickPosition(event.position)
      )

      // 空间直角坐标系转经纬度
      const earthPosition = viewer.camera.pickEllipsoid(
        event.position,
        viewer.scene.globe.ellipsoid
      )
      const cartographic = Cesium.Cartographic.fromCartesian(
        earthPosition,
        viewer.scene.globe.ellipsoid,
        new Cesium.Cartographic()
      )
      const longitude = Cesium.Math.toDegrees(cartographic.longitude)
      const latitude = Cesium.Math.toDegrees(cartographic.latitude)
      console.log(
        '空间直角坐标系转经纬度',
        longitude,
        latitude,
        cartographic.height
      )
    }, Cesium.ScreenSpaceEventType.LEFT_CLICK)
  },
  methods: {}
}
</script>

<style></style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1440996.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flink从入门到实践(一):Flink入门、Flink部署

文章目录 系列文章索引一、快速上手1、导包2、求词频demo&#xff08;1&#xff09;要读取的数据&#xff08;2&#xff09;demo1&#xff1a;批处理&#xff08;离线处理&#xff09;&#xff08;3&#xff09;demo2 - lambda优化&#xff1a;批处理&#xff08;离线处理&…

深入解析Linux中HTTP代理的工作原理

亲爱的Linux探险家们&#xff0c;准备好一起探索HTTP代理背后的神秘面纱了吗&#xff1f;在这个数字世界里&#xff0c;HTTP代理就像是一个神秘的中间人&#xff0c;默默地在你和互联网之间穿梭&#xff0c;为你传递信息。那么&#xff0c;这个神秘的中间人到底是如何工作的呢&…

github拉取项目,pycharm配置远程服务器环境

拉取项目 从github上拉取项目到pycharmpycharm右下角选择远程服务器上的环境 2.1. 如图 2.2. 输入远程服务器的host&#xff0c;port&#xff0c;username&#xff0c;password连接 2.3. 选择服务器上的环境 链接第3点 注&#xff1a;如果服务器上环境不存在&#xff0c;先创建…

【动态规划】【C++算法】2188. 完成比赛的最少时间

作者推荐 【动态规划】【前缀和】【C算法】LCP 57. 打地鼠 本文涉及知识点 动态规划汇总 LeetCode2188. 完成比赛的最少时间 给你一个下标从 0 开始的二维整数数组 tires &#xff0c;其中 tires[i] [fi, ri] 表示第 i 种轮胎如果连续使用&#xff0c;第 x 圈需要耗时 fi…

微策略爆买3万枚!

号外&#xff1a;教链内参2.7《内参&#xff1a;美股续创新高》 日前&#xff0c;因囤积比特币&#xff08;BTC&#xff09;而知名的美股上市公司微策略&#xff08;Microstrategy&#xff09;放出了2023四季度财报。看了这篇财报&#xff0c;才发现在2024年初现货ETF通过之前&…

【分布式】雪花算法学习笔记

雪花算法学习笔记 来源 https://pdai.tech/md/algorithm/alg-domain-id-snowflake.html概述 雪花算法是推特开源的分布式ID生成算法&#xff0c;以划分命名空间的方式将64位分割成多个部分&#xff0c;每一个部分代表不同的含义&#xff0c;这种就是将64位划分成不同的段&…

【JavaWeb】头条新闻项目实现 基本增删改查 分页查询 登录注册校验 业务功能实现 第二期

文章目录 一、为什么使用token口令二、登录注册功能2.1 登录表单提交后端代码&#xff1a; 2.2 根据token获取完整用户信息代码实现&#xff1a; 2.3 注册时用户名占用校验代码实现&#xff1a; 2.4 注册表单提交代码实现&#xff1a; 三、头条首页功能3.1 查询所有头条分类3.2…

免费生成ios证书的方法(无需mac电脑)

使用hbuilderx的uniapp框架开发移动端程序很方便&#xff0c;可以很方便地开发出移动端的小程序和app。但是打包ios版本的app的时候却很麻烦&#xff0c;官方提供的教程需要使用mac电脑来生成证书&#xff0c;但是mac电脑却不便宜&#xff0c;一般的型号都差不多上万。 因此&a…

网络学习:数据链路层VLAN原理和配置

一、简介&#xff1a; VLAN又称为虚拟局域网&#xff0c;它是用来将使用路由器的网络分割成多个虚拟局域网&#xff0c;起到隔离广播域的作用&#xff0c;一个VLAN通常对应一个IP网段&#xff0c;不同VLAN通常规划到不同IP网段。划分VLAN可以提高网络的通讯质量和安全性。 二、…

彻底学会系列:一、机器学习之线性回归(一)

1.基本概念(basic concept) 线性回归&#xff1a; 有监督学习的一种算法。主要关注多个因变量和一个目标变量之间的关系。 因变量&#xff1a; 影响目标变量的因素&#xff1a; X 1 , X 2 . . . X_1, X_2... X1​,X2​... &#xff0c;连续值或离散值。 目标变量&#xff1a; …

C++Linux网络编程day02:select模型

本文是我的学习笔记&#xff0c;学习路线跟随Github开源项目&#xff0c;链接地址&#xff1a;30dayMakeCppServer 文章目录 select模型fd_set结构体 timeval结构体文件描述符的就绪条件带外数据与普通数据socket的状态 select模型 select是Linux下的一个IO复用模型&#xff…

用HTML5实现灯笼效果

本文介绍了两种实现效果&#xff1a;一种使用画布&#xff08;canvas&#xff09;标签/元素&#xff0c;另一种不用画布&#xff08;canvas&#xff09;标签/元素主要使用CSS实现。 使用画布&#xff08;canvas&#xff09;标签/元素实现&#xff0c;下面&#xff0c;在画布上…

Idea里自定义封装数据警告解决 Spring Boot Configuration Annotation Processor not configured

我们自定对象封装指定数据&#xff0c;封装类上面一个红色警告&#xff0c;虽然不影响我们的执行&#xff0c;但是有强迫症看着不舒服&#xff0c; 去除方式&#xff1a; 在pom文件加上坐标刷新 <dependency><groupId>org.springframework.boot</groupId><…

Android AOSP源码研究之万事开头难----经验教训记录

文章目录 1.概述2.Android源下载1.配置环境变量2.安装curl3.下载repo并授权4.创建一个文件夹保存源码5.设置repo的地址并配置为清华源6.初始化仓库7.指定我们需要下载的源码分支并初始化 2.1 使用移动硬盘存放Android源码的坑2.2 解决方法 3.Android源码编译4.Android源烧录 1.…

v-if 和v-for的联合规则及示例

第073个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使用&#xff0c;computed&a…

SpringBoot WebSocket客户端与服务端一对一收发信息

依赖 <!--websocket--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>配置类 Configuration public class WebSocketConfig {Bean //方法返回值交…

跟着小德学C++之TCP基础

嗨&#xff0c;大家好&#xff0c;我是出生在达纳苏斯的一名德鲁伊&#xff0c;我是要立志成为海贼王&#xff0c;啊不&#xff0c;是立志成为科学家的德鲁伊。最近&#xff0c;我发现我们所处的世界是一个虚拟的世界&#xff0c;并由此开始&#xff0c;我展开了对我们这个世界…

FATFA文件系统

一.文件系统基本知识 1.文件系统是什么&#xff1f; 文件系统是一种用于组织和存储计算机上的文件和目录的方法。它是操作系统中的一个重要组成部分&#xff0c;负责管理磁盘或其他存储介质上的文件&#xff0c;使其易于访问和使用。文件系统提供了一种结构化的方式来组织文件…

three.js 匀速动画(向量表示速度)

效果&#xff1a; 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div>1. 匀速动画(向量表示速度)</div…

RibbonOpenFeign源码(待完善)

Ribbon流程图 OpenFeign流程图