Vue.js2+Cesium1.103.0 十五、计算方位角

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>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI大模型学习笔记之五:监督学习--数据如何驱动决策

监督学习&#xff0c;又称为监督式机器学习&#xff0c;是机器学习和人工智能领域的一个重要分支。 其基本原理是利用带有标签的数据集来训练算法&#xff0c;以实现精确分类数据或预测结果的目标。 在监督学习中&#xff0c;通过将数据输入模型&#xff0c;并不断调整数据权…

嵌入式Linux中系统调试常用命令

在 Linux 中&#xff0c;获取系统信息和监控系统资源的操作是非常常见的任务。以下是一些常用的命令和工具&#xff0c;以及一些相关的系统文件&#xff0c;用于获取 Linux 系统信息和监控系统资源。 1. 基本系统信息 uname 命令 uname 命令用于显示系统信息。 查看内核版本&…

AcWing 122 糖果传递(贪心)

[题目概述] 有 n 个小朋友坐成一圈&#xff0c;每人有 a[i] 个糖果。 每人只能给左右两人传递糖果。 每人每次传递一个糖果代价为 1。 求使所有人获得均等糖果的最小代价。 输入格式 第一行输入一个正整数 n&#xff0c;表示小朋友的个数。 接下来 n 行&#xff0c;每行一个…

揭秘2024春晚刘谦魔术——代码还原

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、魔术大概流程 二、代码实现各个步骤 2.1 partition&#xff08;对半撕牌&#xff09; 2.2 bottom&#xff08;将 n 张牌置底…

Hive3.1.2——企业级调优

前言 本篇文章主要整理hive-3.1.2版本的企业调优经验&#xff0c;有误请指出~ 一、性能评估和优化 1.1 Explain查询计划 使用explain命令可以分析查询计划&#xff0c;查看计划中的资源消耗情况&#xff0c;定位潜在的性能问题&#xff0c;并进行相应的优化。 explain执行计划…

力扣---通配符匹配

题目描述&#xff1a; 给你一个输入字符串 (s) 和一个字符模式 (p) &#xff0c;请你实现一个支持 ? 和 * 匹配规则的通配符匹配&#xff1a; ? 可以匹配任何单个字符。 * 可以匹配任意字符序列&#xff08;包括空字符序列&#xff09;。 判定匹配成功的充要条件是&#xff…

GPT-4影响高度创新思维的领域(一)

GPT-4的应用范围不再局限于对现有信息的检索、整理和复述&#xff0c;而是进一步拓展到了诸如文学创作、科学假设生成、教育辅导、商业策略建议等需要高度创新思维的领域。这种独立思考和创新能力赋予了GPT-4作为虚拟助手时更加丰富多元的角色定位&#xff0c;使其成为一种强大…

VBAR设置方法

Uboot源码&#xff1a; /** Setup vector:* (OMAP4 spl TEXT_BASE is not 32 byte aligned.* Continue to use ROM code vector only in OMAP4 spl)*/ #if !(defined(CONFIG_OMAP44XX) && defined(CONFIG_SPL_BUILD))/* Set V0 in CP15 SCTLR register - for VBAR to …

SelfAttention|自注意力机制ms简单实现

自注意力机制学习有感 观看b站博主的讲解视频以及跟着他的pytorch代码实现mindspore的自注意力机制&#xff1a;up主讲的很好&#xff0c;推荐入门自注意力机制。 import mindspore as ms import mindspore.nn as nn from mindspore import Parameter from mindspore import …

LeetCode 0987.二叉树的垂序遍历:遍历时存节点信息,遍历完自定义排序

【LetMeFly】987.二叉树的垂序遍历&#xff1a;遍历时存节点信息&#xff0c;遍历完自定义排序 力扣题目链接&#xff1a;https://leetcode.cn/problems/vertical-order-traversal-of-a-binary-tree/ 给你二叉树的根结点 root &#xff0c;请你设计算法计算二叉树的 垂序遍历…

前端秘法进阶篇之事件循环

目录 一.浏览器的进程模型 1.进程 2.线程 二.浏览器的进程和线程 1. 浏览器进程 2. 网络进程 3. 渲染进程 三.渲染主线程 四.异步 五.优先级 1. 延时队列&#xff1a; 2.交互队列&#xff1a; 3.微队列&#xff1a; 六.JS 的事件循环 附加:JS 中的计时器能做到精…

XMall 开源商城 SQL注入漏洞复现(CVE-2024-24112)

0x01 产品简介 XMall 开源电商商城 是开发者Exrick的一款基于SOA架构的分布式电商购物商城 前后端分离 前台商城:Vue全家桶 后台管理:Dubbo/SSM/Elasticsearch/Redis/MySQL/ActiveMQ/Shiro/Zookeeper等。 0x02 漏洞概述 XMall 开源商城 /item/list、/item/listSearch、/sys/…

【Android】使用Android Studio打包APK文件

文章目录 1. 新建项目2. 打包生成APK3. 安装APK 1. 新建项目 打包APK之前&#xff0c;首先需要新建项目&#xff0c;有基础的可以跳过。 无基础的可以参考&#xff1a;使用Android Studio运行Hello World项目 2. 打包生成APK 1.找到Build -> Generate Signed Bundle or …

【C/C++语法基础】2.输入与输出(✨新手推荐阅读)

前言 在C中&#xff0c;输入与输出是程序与用户进行交互的基本方式。C提供了多种方式进行数据的输入与输出&#xff0c;其中最常用的是printf、scanf、cin和cout。此外&#xff0c;我们还会讨论如何取消cin和cout的同步流&#xff0c;以及了解各种转义字符的用法。 1.printf函…

arkTS开发鸿蒙OS个人商城案例【2024最新 新年限定开发案例QAQ】

龙年前述 源码获取>文章下方二维码&#xff0c;回复关键字“鸿蒙OS商场源码” 前言 arkTS是华为自己研发的一套前端语言&#xff0c;是在js和ts技术的基础上又进行了升级而成&#xff01; 本篇文章会带领大家通过arkTSnode.jsmongoDB来完成一个鸿蒙OS版本的商城案例&…

flask cors 跨域问题解决

座右铭&#xff1a;怎么简单怎么来&#xff0c;以实现功能为主。 欢迎大家关注公众号与我交流 环境安装 pip install -U flask-cors 示例代码 from flask import Flask from flask_cors import CORS, cross_originapp Flask(__name__) CORS(app, supports_credentialsTrue)…

__attribute__ ---Compile

Section for attribute attribute_&#xff1f;嵌入式C代码属性怎么定义 https://www.elecfans.com/d/2269222.html section 属性的主要作用是&#xff1a;在程序编译时&#xff0c;将一个函数或者变量放到指定的段&#xff0c;即指定的section 中。 一个可执行文件注意由代…

AI算法初识之分类汇总

一、背景 AI算法的分类方式多种多样&#xff0c;可以根据不同的学习机制、功能用途以及模型结构进行划分。以下是一些主要的分类方式及相应的代表性算法&#xff1a; 1. 按照学习类型 - **监督学习**&#xff1a; - 线性回归&#xff08;Linear Regression&#xff09; …

学会如何备份u盘数据,让数据安全有保障

随着科技的发展&#xff0c;U盘已成为我们日常生活和工作中不可或缺的数据存储设备。然而&#xff0c;无论U盘的质量如何&#xff0c;数据丢失的风险始终存在。可能是硬件故障、意外删除、病毒感染或其他不可预见的原因。 尽管当前提供了多种数据恢复方案&#xff0c;然而没有一…

【Midjourney】解密Midjourney付费订阅:畅享全新体验!(详细流程与各版本一览)

一、Midjourney 付费订阅流程 1、在首页点击Purchase plan 2、进入到midjourney年月选择页面 3、这里续费一个最便宜的版本 , 按年付费 8 , 按月 10 4、输入银行卡信息 , 用的WildCard虚拟信用卡 &#xff0c;打开 5、填写完银行卡信息就订阅成功 二、Midjourney 各版本介绍…