charts3D地球--添加航线

要在地球视角下画出海运路线图

方案

  1. 添加 globl 地球
  2. 创建geo地理坐标系
  3. 创建canvas对象用于承载地图世界地图this.worldChart
//初始化canvas节点
      let cav = document.createElement("canvas");
      this.$echarts.registerMap("world", geoJson);
      this.worldChart = this.$echarts.init(cav, null, {
        width: 4096,
        height: 2048,
      });
      this.worldChart.setOption(this.worldChartOption);
  1. 设置globl 的baseTexture为this.worldChart
  2. 添加lines3D飞线效果
    在这里插入图片描述

上组件源码

<template>
  <div>
    <div id="box" @click="showAll"></div>
  </div>
</template>
<script>
import geoJson from "./mapJson.js";
import { nameMap, startPoint, changKu, chuan, gongChang } from "./data.js";
import { points, line } from "./lines.js";
export default {
  data() {
    return {
      worldChart: null,
      // map贴图配置
      worldChartOption: {
        backgroundColor: "rgba(3,28,72,1)",
        // backgroundColor: "transparent",
        geo: {
          type: "map",
          map: "world",
          nameMap: nameMap,
          left: 0,
          top: 0,
          right: 0,
          bottom: 0,
          boundingCoords: [
            [-180, 90],
            [180, -90],
          ],
          zoom: 0,
          roam: true,
          itemStyle: {
            areaColor: "#174f87", //地图区域的颜色
            color: "#fff", //图形的颜色
            borderColor: "#2578cb",
            opacity: 0.9,
          },
          emphasis: {
            //高亮状态下的多边形和标签样式
            itemStyle: {
              areaColor: "#31deff",
              color: "#174f87",
              borderColor: "#318ED2",
              borderWidth: 2,
              shadowColor: "#15629A",
              shadowBlur: 1,
              shadowOffsetX: 3,
              shadowOffsetY: 5,
            },
          },
          label: {
            fontSize: 28,
          },
        },
        series: [],
      },
      globleChart: null,
      // 地球配置
      globleChartOption: {
        globe: {
          show: true,
          globeRadius: 120,
          globeOuterRadius: 150,
          // baseTexture: require("./assets/earth.jpg"),
          // environment: require("@/assets/img/bg.png"),
          environment: require("./assets/starfield.jpg"),
          shading: "lambert",
          zlevel: 10,
          light: {
            ambient: {
              // 设置环境光
              intensity: 1,
            },
            main: {
              // 设置主光源
              intensity: 1.6,
              shadow: false, // 开启阴影
            },
          },
          atmosphere: {
            show: true,
            offset: 6,
            color: "rgba(61,149,248,0.6)",
            glowPower: 5,
            innerGlowPower: 8,
          },

          viewControl: {
            distance: 240,
            autoRotate: true,
            // 开启球体自旋转
            // 设置地球的自转速度: 单位为 度/秒,默认值为10,也就是36秒转一圈!
            autoRotateSpeed: 5,
            // 在鼠标停止操纵后,球体恢复自转的事件
            autoRotateAfterStill: 5,
          },
        },
        series: [],
      },
    };
  },
  mounted() {
    this.initData();
  },
  methods: {
    // 绘制图表
    initData() {
      //初始化canvas节点
      let cav = document.createElement("canvas");
      this.$echarts.registerMap("world", geoJson);
      this.worldChart = this.$echarts.init(cav, null, {
        width: 4096,
        height: 2048,
      });

      this.worldChart.setOption(this.worldChartOption);
      this.globleChart = this.$echarts.init(document.getElementById("box"));

      // // 指定图标的配置项和数据
      this.globleChartOption.globe.baseTexture = this.worldChart;
      this.globleChart.setOption(this.globleChartOption, true);
      // 初始化点和路线
      this.addLines(line);
      this.addPoint(points);
      this.worldChart.on("click", (params) => {
        console.log(params);
      });
      this.globleChart.on("click", (params) => {
        console.log(params);
      });
    },
    // 添加路线
    addLines(list) {
      // 路线
      // 获取飞线两端点
      let flyLineList = [];
      list.forEach((li) => {
        for (let index = 0; index < li.coords.length - 1; index++) {
          flyLineList.push({
            coords: [li.coords[index], li.coords[index + 1]],
            // 数据值
            value: "",
          });
        }
      });
      const luxian = {
        type: "lines",
        // type: "lines3D",
        id: "line",
        coordinateSystem: "geo",
        // coordinateSystem: "globe",
        blendMode: "lighter",
        polyline: true,
        zlevel: 10,
        effect: {
          show: true,
          period: 4, //速度
          trailLength: 0.2, //尾部阴影
        },
        lineStyle: {
          //航线的视图效果
          color: "#CCA343",
          width: 4,
          curveness: 0.5,
          opacity: 0.4,
        },

        // convertData
        data: list,
        // data: flyLineList,
      };
      // 路线上的点
      let startPoint = []; // 取第一个点作为仓库
      let endPoint = []; // 取最后一个作为起工厂
      let chuanPoint = []; // 取中间点作为轮船
      list.forEach((el) => {
        el.coords.forEach((em, i) => {
          if (i === 0) {
            const haveSamePoint = startPoint.find(
              (item) => item && item.name == el.name.split("-")[0]
            );
            if (!haveSamePoint) {
              startPoint.push({
                name: el.name.split("-")[0],
                value: em,
                symbolSize: 30,
                symbol: changKu,
              });
            }
          } else if (i === el.coords.length - 1) {
            const haveSamePointEnd = endPoint.find(
              (item) => item && item.name == el.name.split("-")[1]
            );
            if (!haveSamePointEnd) {
              endPoint.push({
                name: el.name.split("-")[1],
                value: em,
                symbolSize: 30,
                symbol: gongChang,
              });
            }
          } else {
            chuanPoint.push({
              name: "",
              value: em,
              symbolSize: 60,
              symbol: chuan,
            });
          }
        });
      });
      const linePoint = {
        // type: "scatter3D",
        // type: "effectScatter",
        type: "scatter",
        id: "onlinePoint",
        coordinateSystem: "geo",
        zlevel: 16,
        rippleEffect: {
          brushType: "stroke",
        },
        label: {
          fontSize: 16,
          show: true,
          position: "right",
          formatter: "{b}",
        },
        itemStyle: {
          normal: {
            color: "#f5f802",
          },
        },
        data: [...startPoint, ...endPoint, ...chuanPoint],
      };
      console.log([...startPoint, ...endPoint, ...chuanPoint], 787);

      // this.updataGlobleSerise("line", luxian);

      this.updataSerise("line", luxian);
      this.updataSerise("onlinePoint", linePoint);

      setTimeout(() => {
        this.updataChart();
      }, 10);
    },
    // 添加标点
    addPoint(list) {
      const areaPion = {
        type: "effectScatter",
        // type: "scatter3D",
        // type: 'scatter',
        id: "areaPoint",
        coordinateSystem: "geo", //globe
        zlevel: 11,
        symbol: startPoint,
        rippleEffect: {
          brushType: "stroke",
        },
        label: {
          fontSize: 18,
          show: true,
          position: "right",
          formatter: "{b}",
        },
        itemStyle: {
          normal: {
            color: "#f5f802",
          },
        },
        data: list,
      };
      this.updataSerise("areaPoint", areaPion);
      // this.updataGlobleSerise("areaPoint", areaPion);

      setTimeout(() => {
        this.updataChart();
        this.changeView();
      }, 10);
    },
    updataGlobleSerise(id, item) {
      let ind = this.globleChartOption.series.findIndex((el) => el.id === id);
      if (ind > -1) {
        this.globleChartOption.series[ind] = item;
      } else {
        this.globleChartOption.series.push(item);
      }
    },
    updataSerise(id, item) {
      let ind = this.worldChartOption.series.findIndex((el) => el.id === id);
      if (ind > -1) {
        this.worldChartOption.series[ind] = item;
      } else {
        this.worldChartOption.series.push(item);
      }
    },

    // 更新
    updataChart() {
      this.worldChart.setOption(this.worldChartOption);
      this.globleChart.setOption(this.globleChartOption, true);
    },
    showAll() {
      this.$emit("no-act");
    },
    // 切换视角依据国家名称
    changeViewByCountry(country) {
      const targ = points.find((el) => el.name == country);
      if (targ) {
        this.changeView(targ.value);
      }
    },
    // 切换视角
    changeView(point) {
      // 定位到北京
      let coord = point || [116.46, 39.92];
      this.globleChartOption.globe.viewControl.targetCoord = coord;
      this.globleChart.setOption(this.globleChartOption);
    },
    resize() {
      this.worldChart.resize();
      this.globleChart.resize();
    },
  },
  watch: {},
  created() {},
};
</script>

<style scoped>
#box {
  width: 100vw;
  height: 100vh;
}
.tootipbox {
  position: fixed;
  left: 50%;
  top: 500%;
  z-index: 9999;

  background-image: url("../../../../assets/img/screen6/label_bg.png");
  background-repeat: no-repeat;
  background-size: 100% 100%;
  width: 200px;
  height: 125px;
  background-position: center center;
  padding: 10px 20px;
  font-size: 10px;
}
</style>

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

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

相关文章

【Linux】环境变量是什么?如何配置?详解

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

相同的树——java

给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1&#xff1a; 输入&#xff1a;p [1,2,3], q [1,2,3] 输出&#xff1a;true示例 2&…

C#高级编程笔记-泛型

本章的主要内容如下&#xff1a; ● 泛型概述 ● 创建泛型类 ● 泛型类的特性 ● 泛型接口 ● 泛型结构 ● 泛型方法 目录 1.1 泛型概述 1.1.1 性能 1.1.2 类型安全 1.1.3 二进制代码的重用 1.1.4 代码的扩展 1.1.5 命名…

SpringBootWeb 篇-深入了解请求响应(服务端接收不同类型的请求参数的方式)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 请求响应概述 1.1 简单参数 1.2 实体参数 2.3 数组集合参数 2.4 日期参数 2.5 json 参数 2.6 路径参数 3.0 完整代码 1.0 请求响应概述 当客户端发送不同的请求参…

【驱动】SPI

1、简介 SPI(Serial Peripheral interface)串行外设接口。 特点: 高速:最大几十M,比如,AD9361的SPI总线速度可以达到40MHz以上全双工:主机在MOSI线上发送一位数据,从机读取它,而从机在MISO线上发送一位数据,主机读取它一主多从:主机产生时钟信号,通过片选引脚选择…

微火全域外卖城市合伙人究竟是什么?详细介绍

随着外卖市场的蓬勃发展&#xff0c;微火全域外卖团购业务正逐渐崭露头角&#xff0c;成为商家与消费者之间的新桥梁。这种业务模式&#xff0c;也被称为全域合伙人&#xff0c;其魅力在于其独特的多平台销售策略和简便的管理系统。那么&#xff0c;这种全域外卖城市合伙人&…

N1077B keysight 是德 光/电时钟恢复设备,参数

Keysight N1077B是一款光/电时钟恢复设备&#xff0c;支持115 MBd至24 GBd的数据速率范围&#xff0c;适用于多模和单模光信号以及电信号。该设备能够处理PAM4和NRZ两种类型的数据信号&#xff0c;并提供符合标准的时钟恢复功能。 型 号&#xff1a;N1077B/A 名 称&#xff1a…

【教程向】从零开始创建浏览器插件(四)探索Chrome扩展的更多常用API

探索Chrome扩展的更多常用API 在Chrome扩展开发中&#xff0c;除了最基础的API外&#xff0c;Chrome还提供了一系列强大的API&#xff0c;允许开发者与浏览器的各种功能进行交互。本文将介绍其中几个常用的API&#xff0c;并提供详细的示例代码帮助您开始利用这些API。 书签…

【Spring】初识 Spring AOP(面向切面编程)

目录 1、介绍AOP 1.1、AOP的定义 1.2、AOP的作用 1.3、AOP的核心概念及术语 2、AOP实现示例 3、EnableAspectJAutoProxy注解 1、介绍AOP 1.1、AOP的定义 AOP&#xff08;Aspect Orient Programming&#xff09;&#xff0c;直译过来就是面向切面编程&#xff0c;AOP 是一…

大型模型技术构建本地知识库

使用大型模型技术构建本地知识库是一个复杂的过程&#xff0c;涉及到数据科学、机器学习和软件工程等多个领域的知识。以下是构建本地知识库的一般步骤。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.需求分析&#xff1a; 确定知…

软件工程经济学--期末复习资料

软件工程经济学--期末复习资料 前言第一章 绪论第二章 软件工程经济学基础第三章 软件的成本管理与定价分析第四章 软件工程项目评价方法与经济效果评价第五章 软件生产函数、效益分析及不确定性分析第六章 软件工程项目进度计划的制定结尾总结 前言 软件工程经济学&#xff0…

书生作业:XTuner

作业链接&#xff1a; https://github.com/InternLM/Tutorial/blob/camp2/xtuner/homework.md xtuner: https://github.com/InternLM/xtuner 环境配置 首先&#xff0c;按照xtuner的指令依次完成conda环境安装&#xff0c;以及xtuner库的安装。 然后&#xff0c;我们开始尝试…

VBA信息获取与处理第四节:获取唯一非重复值返回数组的代码

《VBA信息获取与处理》教程(版权10178984)是我推出第六套教程&#xff0c;目前已经是第一版修订了。这套教程定位于最高级&#xff0c;是学完初级&#xff0c;中级后的教程。这部教程给大家讲解的内容有&#xff1a;跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互…

scanf留下的那一片云彩

【题目描述】 给出一个由O和X组成的串&#xff08;长度为1&#xff5e;80&#xff09;&#xff0c;统计得分。每个O的得分为目前连续出现的O的个数&#xff0c;X的得分为0。例如&#xff0c;OOXXOXXOOO的得分为1200100123。 输入第一行表示有n个字符串&#xff0c;后续是n行字…

【matlab基础知识代码】(十八)无约束最优化问题

min下面的x称为优化向量或者是决策变量 匿名函数法 >> f(x)(x(1)^2-2*x(1))*exp(-x(1)^2-x(2)^2-x(1)*x(2)); x0[0; 0]; [x,b,c,d]fminsearch(f,x0), x 0.6111 -0.3056 b -0.6414 c 1 d 包含以下字段的 struct: iterations: 72 funcCount: 137 algor…

Hive SQL-DML-insert插入数据

Hive SQL-DML-insert插入数据 1. 插入静态数据 可以直接插入具体的值到Hive表中&#xff1a; INSERT INTO TABLE tablename (column1, column2, column3) VALUES (value1, value2, value3),(value4, value5, value6),...;2. 插入查询结果 将一条查询的结果直接插入到另一个表中…

软件工程基础知识,软考选择题的重点

本篇知识来自&#xff1a;软件设计师考试同步辅导 ---考点。。。。。&#xff0c;钟彩华 博伟玉 清华出版社&#xff0c;那本书。仅供学习。以下理解都是本人自己认为的。仅供参考。 本书的第132页&#xff0c;第五章知识。 目录 软件工程叙述 软件的生命周期 软件过程 软…

android studio配置Http Proxy

1、问题描述&#xff1a; Error:Unable to tunnel through proxy. Proxy returns “HTTP/1.1 400 Bad Request” 解决&#xff1a;HTTP Proxy设置 1.File→Settings…→System Settings → HTTP Proxy → Auto-detect proxy settings”&#xff1b; 2.勾选下方“Automatic prox…

Codigger:Vim的革新者,提升开发体验和功能性

深知Vim在编程和文本编辑领域的卓越地位&#xff0c;因此&#xff0c;在设计和开发过程中&#xff0c;Codigger始终将保留Vim的核心功能和高度定制能力作为首要任务。然而&#xff0c;Vim的复杂性和高度定制性也让很多新用户望而却步。为了降低这种使用门槛&#xff0c;Codigge…

常用Linux命令详细总结

一、文档编辑、过滤、查看命令 1、cp 复制文件和目录 -a 复制文件并保持文件属性 -d 若源文件为链接文件&#xff0c;则复制链接文件属性而非文件本身 -i 覆盖文件前提示&#xff0c;如果不要提示&#xff0c;在命令前加上\ -r 递归复制&#xff0c;通常用于目录的复制 …