Cesium.js基础使用(vue)

news2024/11/23 8:30:56

如何通过Cesium创建一个地图:

1、npm安装(这里使用1.95.0版本)

npm i cesium@1.95.0 -s
或
yarn add cesium@1.95.0 -s

2、组件引入

import * as Cesium from "cesium/Cesium";

3、容器创建

<div id="cesiumContainer" />

4、核心类Viewer创建

在Cesium中Viewer是一切的开端,通过newCesium.Viewer(container, options)来创建一个Viewer对象,可以把该对象理解为三维虚拟地球,在Viewer对象上的所有操作,可以看作是对三维虚拟地球的操作。

const viewer = new Viewer("cesiumContainer", {
        infoBox: false,
        animation: false, // 是否显示动画控件
        homeButton: false, // 是否显示home键
        geocoder: false, // 是否显示地名查找控件
        baseLayerPicker: false, // 是否显示图层选择控件
        timeline: false, // 是否显示时间线控件
        fullscreenButton: false, // 是否全屏显示
        infoBox: false, // 是否显示点击要素之后显示的信息
        sceneModePicker: false, // 是否显示投影方式控件  三维/二维
        navigationInstructionsInitiallyVisible: false,
        navigationHelpButton: false, // 是否显示帮助信息控件
        orderIndependentTranslucency: false,
        shouldAnimate: true,
        scene3DOnly: false, // 每个几何实例将只能以3D渲染以节省GPU内存
        selectionIndicator: false, // 取消点击有绿框
        // imageryProvider: false, // 不提供地图
        baseLayerPicker: true, //是否显示图层选择控件
      });

5、 设置初始位置(经纬度、缩放比例)

    viewer.camera.flyTo({
        destination: Cesium.Cartesian3.fromDegrees(
          113.764043,
          34.005325,
          8000000
        ),
      });

此时,一个地球就出现了!!!

cesium内置了一些图层供我们切换。

 还可以通过一些json数据给地图添加想要的区块图层

  • 通过阿里云数据可视化平台拿到相应地区的json数据DataV.GeoAtlas地理小工具系列
  • 使用Cesium.GeoJsondataSource.load添加
    //阿里云地理信息工具 数据获取
      viewer.dataSources.add(
        Cesium.GeoJsonDataSource.load(
          "https://geo.datav.aliyun.com/areas_v3/bound/100000_full.json"
        )
      );

我们还可以通过cesium对一些建筑物进行观察

但需要申请Cesium的令牌(token)

如何申请?

通过以下官网地址申请

 Cesium ion

 使用:

 Cesium.Ion.defaultAccessToken =       "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJmNDVhMjQ0Yi05MDg4LTRlNDYtYTIxMi00YmI4ZWYxOWMyNTgiLCJpZCI6MTQ5MzYwLCJpYXQiOjE2ODc3ODQ0OTh9.KlhT_LCnsEtYyawpEmJ_wx44_qTUbgze-SxGMRavbAM";

之后就可以访问高清页面;

完整代码

<template>
  <div id="cesiumContainer" @dragover="allowDrop" @drop="drop">
    <nav>
      <button @click="draw('point')">点绘制</button>
      <button @click="draw('polyline')">线绘制</button>
      <button @click="draw('polygon')">圆绘制</button>
      <button @click="clearDrawEntities">清空</button>
    </nav>

    
  </div>
</template>

<script>
import * as Cesium from "cesium/Cesium";
import { Viewer } from "cesium/Cesium";

import Map from "ol/Map";
import View from "ol/View";
import TileLayer from "ol/layer/Tile";
import XYZ from "ol/source/XYZ";
import { transform, getTransform } from "ol/proj";
// import { selectNodesForSpecifiedRegion } from "../../utils/gis/commonMethods";
export default {
  name: "cesiumView",
  data() {
    return {
      // map: null,
      cesiumContainer: null,
      mapViewer: null,
      tempEntities: [],
      activeNames: [],
    };
  },
  mounted() {
    this.initMap();
  },
  methods: {
    handleChange() {},

    //init
    initMap() {
      // 此应用程序正在使用 Cesium 的默认 ion 访问令牌,请在使用 Ceisum API 调用之前先注册一个你自己的 Cesium ion 访问令牌
      Cesium.Ion.defaultAccessToken =
        "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJmNDVhMjQ0Yi05MDg4LTRlNDYtYTIxMi00YmI4ZWYxOWMyNTgiLCJpZCI6MTQ5MzYwLCJpYXQiOjE2ODc3ODQ0OTh9.KlhT_LCnsEtYyawpEmJ_wx44_qTUbgze-SxGMRavbAM";
      const viewer = new Viewer("cesiumContainer", {
        infoBox: false,
        animation: false, // 是否显示动画控件
        homeButton: false, // 是否显示home键
        geocoder: false, // 是否显示地名查找控件
        baseLayerPicker: false, // 是否显示图层选择控件
        timeline: false, // 是否显示时间线控件
        fullscreenButton: false, // 是否全屏显示
        infoBox: false, // 是否显示点击要素之后显示的信息
        sceneModePicker: false, // 是否显示投影方式控件  三维/二维
        navigationInstructionsInitiallyVisible: false,
        navigationHelpButton: false, // 是否显示帮助信息控件
        orderIndependentTranslucency: false,
        shouldAnimate: true,
        scene3DOnly: false, // 每个几何实例将只能以3D渲染以节省GPU内存
        selectionIndicator: false, // 取消点击有绿框
        // imageryProvider: false, // 不提供地图
        baseLayerPicker: true, //是否显示图层选择控件
      });
      //设置初始位置
      viewer.camera.flyTo({
        destination: Cesium.Cartesian3.fromDegrees(
          113.764043,
          34.005325,
          3000
        ),
      });

      // entities 默认点位
      // const entity = viewer.entities.add({
      //   position: Cesium.Cartesian3.fromDegrees(116.39, 39.91, 400),
      //   point: {
      //     pixelSize: 50,
      //     color: new Cesium.Color(0, 1, 0, 1),
      //   },
      // });
      // //将摄像头设置到远点处
      // viewer.trackedEntity = entity;

      //阿里云地理信息工具 数据获取
      // viewer.dataSources.add(
      //   Cesium.GeoJsonDataSource.load(
      //     "https://geo.datav.aliyun.com/areas_v3/bound/100000_full.json"
      //   )
      // );

      // Viewer.scene.globe.show = false;
      // logo去除
      viewer.cesiumWidget.creditContainer.style.display = "none";

      this.mapViewer = viewer;

      window.viewer = viewer;

      console.log(viewer, "viewer");
    },
    // deleteRectangle() {},

    //获取经纬度
    getPosition(viewer) {
      let handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
      handler.setInputAction(function (event) {
        let cartesian = viewer.scene.pickPosition(event.position);
        let cartographic = Cesium.Cartographic.fromCartesian(cartesian);
        let lng = Cesium.Math.toDegrees(cartographic.longitude); // 经度
        let lat = Cesium.Math.toDegrees(cartographic.latitude); // 纬度
        let alt = cartographic.height; // 高度
        let coordinate = {
          longitude: Number(lng.toFixed(6)),
          latitude: Number(lat.toFixed(6)),
          altitude: Number(alt.toFixed(2)),
        };
        console.log(coordinate,'coordinate');
      }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
    },
    /**
     * Role map drop
     * Desc 元素拖入地图放置事件
     */
    drop(e) {
      e.preventDefault();

      this.getPosition(window.viewer);
      // console.log(e, "eeeeeeeeee");
      // const pos = transform(this.map.getEventCoordinate(e), "EPSG:3857", "EPSG:4326");
      // console.log(pos, "pos");

      // const pos = ol.proj.transform(pos, 'EPSG:3857', 'EPSG:4326');
      // const data = e.dataTransfer.getData("Text");
      // console.log(data,'data')
    },
    //图标拖动效果
    drag(event, item) {
      console.log(event, item, "---------------");
    },
    /**
     * Role dragover
     * Desc 在可拖动的元素或者被选择的文本被拖进一个有效的放置目标时(每几百毫秒)触发,
     *      允许元素拖入地图
     */
    allowDrop(e) {
      e.preventDefault();
      // event.preventDefault
    },
    draw(type) {
      //点绘制
      let _this = this;
      let viewer = this.mapViewer;
      let tempEntities = this.tempEntities;
      let position = [];
      let tempPoints = [];

      /**
       * Role  depthTestAgainstTerrain 开启地形深度检测
       * desc  开启地形检测后,会计算其他地理要素和地形之间的遮挡关系。未开启时,将会出现场景变化时,地物位置显示不正确。
       */
      viewer.scene.globe.depthTestAgainstTerrain = true;

      /**
       * Role ScreenSpaceEventHandler
       * type => canvas
       * default => Document
       * desc 处理用户输入事件。可以添加自定义功能以在以下位置执行当用户输入输入时。
       */
      let handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);

      switch (type) {
        case "point":
          //监听 鼠标左键
          handler.setInputAction(function (movement) {
            // 从相机位置通过windowPosition 世界坐标中的像素创建一条射线。返回Cartesian3射线的位置和方向。
            let ray = viewer.camera.getPickRay(movement.position);
            // 查找射线与渲染的地球表面之间的交点。射线必须以世界坐标给出。返回Cartesian3对象
            position = viewer.scene.globe.pick(ray, viewer.scene);
            let point = _this.drawPoint(position);
            tempEntities.push(point);

            /**
             * Role ScreenSpaceEventType
             * Desc 此枚举类型用于对鼠标事件进行分类:向下,向上,单击,双击,按住按钮时移动。
             */
          }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
          // 左键双击停止绘制
          handler.setInputAction(function () {
            handler.destroy(); //关闭事件句柄
            handler = null;
          }, Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);
          // 右击单击停止绘制
          handler.setInputAction(function () {
            handler.destroy(); //关闭事件句柄
            handler = null;
          }, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
          break;
        case "polyline":
          //鼠标移动事件
          handler.setInputAction(function (movement) {},
          Cesium.ScreenSpaceEventType.MIDDLE_CLICK);
          //左键点击操作
          handler.setInputAction(function (click) {
            //调用获取位置信息的接口
            let ray = viewer.camera.getPickRay(click.position);
            position = viewer.scene.globe.pick(ray, viewer.scene);
            tempPoints.push(position);
            let tempLength = tempPoints.length;
            //调用绘制点的接口
            let point = _this.drawPoint(tempPoints[tempPoints.length - 1]);
            tempEntities.push(point);
            if (tempLength > 1) {
              let pointline = _this.drawPolyline([
                tempPoints[tempPoints.length - 2],
                tempPoints[tempPoints.length - 1],
              ]);
              tempEntities.push(pointline);
            } else {
              // tooltip.innerHTML = "请绘制下一个点,右键结束";
            }
          }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
          //右键点击操作
          handler.setInputAction(function (click) {
            tempPoints = [];
            handler.destroy(); //关闭事件句柄
            handler = null;
          }, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
          break;
        case "polygon":
          //鼠标移动事件
          handler.setInputAction(function (movement) {},
          Cesium.ScreenSpaceEventType.MOUSE_MOVE);
          //左键点击操作
          handler.setInputAction(function (click) {
            //调用获取位置信息的接口
            let ray = viewer.camera.getPickRay(click.position);
            position = viewer.scene.globe.pick(ray, viewer.scene);
            tempPoints.push(position);
            let tempLength = tempPoints.length;
            //调用绘制点的接口
            let point = _this.drawPoint(position);
            tempEntities.push(point);
            if (tempLength > 1) {
              let pointline = _this.drawPolyline([
                tempPoints[tempPoints.length - 2],
                tempPoints[tempPoints.length - 1],
              ]);
              tempEntities.push(pointline);
            } else {
              // tooltip.innerHTML = "请绘制下一个点,右键结束";
            }
          }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
          //右键点击操作
          handler.setInputAction(function (click) {
            let cartesian = viewer.camera.pickEllipsoid(
              click.position,
              viewer.scene.globe.ellipsoid
            );

            if (cartesian) {
              let tempLength = tempPoints.length;
              if (tempLength < 3) {
                alert("请选择3个以上的点再执行闭合操作命令");
              } else {
                //闭合最后一条线
                let pointline = _this.drawPolyline([
                  tempPoints[tempPoints.length - 1],
                  tempPoints[0],
                ]);
                tempEntities.push(pointline);
                _this.drawPolygon(tempPoints);
                tempEntities.push(tempPoints);
                handler.destroy(); //关闭事件句柄
                handler = null;
              }
            }
          }, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
          break;
      }
    },
    drawPoint(position, config) {
      let viewer = this.mapViewer;
      let config_ = config ? config : {};
      return viewer.entities.add({
        name: "点几何对象",
        position: position,
        point: {
          color: Cesium.Color.SKYBLUE,
          pixelSize: 10,
          outlineColor: Cesium.Color.YELLOW,
          outlineWidth: 3,
          disableDepthTestDistance: Number.POSITIVE_INFINITY,
          heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
        },
      });
    },
    drawPolyline(positions, config_) {
      let viewer = this.mapViewer;
      if (positions.length < 1) return;
      let config = config_ ? config_ : {};
      return viewer.entities.add({
        name: "线几何对象",
        polyline: {
          positions: positions,
          width: config.width ? config.width : 5.0,
          material: new Cesium.PolylineGlowMaterialProperty({
            color: config.color
              ? new Cesium.Color.fromCssColorString(config.color)
              : Cesium.Color.GOLD,
          }),
          depthFailMaterial: new Cesium.PolylineGlowMaterialProperty({
            color: config.color
              ? new Cesium.Color.fromCssColorString(config.color)
              : Cesium.Color.GOLD,
          }),
          clampToGround: true,
        },
      });
    },
    drawPolygon(positions, config_) {
      let viewer = this.mapViewer;
      if (positions.length < 2) return;
      let config = config_ ? config_ : {};
      return viewer.entities.add({
        name: "面几何对象",
        polygon: {
          hierarchy: positions,
          material: config.color
            ? new Cesium.Color.fromCssColorString(config.color).withAlpha(0.2)
            : new Cesium.Color.fromCssColorString("#FFD700").withAlpha(0.2),
        },
      });
    },
    //清除实体
    clearDrawEntities() {
      let viewer = this.mapViewer;
      this.tempEntities = [];
      // 清除之前的实体
      const entitys = viewer.entities._entities._array;
      let length = entitys.length;
      // 倒叙遍历防止实体减少之后entitys[f]不存在
      for (let f = length - 1; f >= 0; f--) {
        if (
          entitys[f]._name &&
          (entitys[f]._name === "点几何对象" ||
            entitys[f]._name === "线几何对象" ||
            entitys[f]._name === "面几何对象")
        ) {
          viewer.entities.remove(entitys[f]);
        }
      }
    },
  },
};
</script>

<style lang="less" scoped>
#cesiumContainer {
  width: 100vw;
  height: 100vh;
  position: relative;
  header {
    position: absolute;
    top: 0;
    width: 100%;
    height: 50px;
    background: rgba(0, 0, 0, 0.5);
  }
  .leftBar {
    width: 250px;
    height: 50%;
    position: absolute;
    top: 30%;
    z-index: 999;
    .el-collapse-item__content {
      display: flex;
      justify-content: space-between;
      // flex-wrap: wrap;
    }
    .collapseItems {
      // display: block;
      width: 100%;
      height: auto;
      .ivu-icon {
        display: block;
      }
      b {
        display: block;
        text-align: center;
      }
    }
  }
  nav {
    position: absolute;
    left: 20px;
    top: 20px;
    width: 150px;
    height: 180px;
    // background: rgba(0, 0, 0, 0.5);
    z-index: 999;
    display: flex;
    flex-direction: column;
    justify-content: space-between;
    button {
      width: 100%;
      height: 30px;
      cursor: pointer;
    }
  }
}
</style>

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

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

相关文章

创业项目分享 - 想赚大钱得学会偷懒

想创业赚钱&#xff0c;就不能偷懒&#xff0c;得卷死你的同行才行&#xff0c;为何今天话锋突转呢?请放心&#xff0c;这篇不是标题党&#xff0c;而是想要强调&#xff0c;在不同的阶段&#xff0c;对“偷懒”的定义是不一样的&#xff0c;因为不同的阶段&#xff0c;我们的…

ESP32(MicroPython) LCD1602 显示通过Socket通信接收的数据

本程序 实现了通过LCD1602 显示通过Socket通信接收的数据。由于外设驱动有滚动显示的特性并且每次显示要清除之前显示的内容&#xff0c;在显示字符前通过空格和换行清除之前显示的数据&#xff0c;并判断字符串长度&#xff0c;一行显示不下时分两行显示。 代码如下 #导入Pi…

C#对字符串的常用处理总结C#控制台

目录 C#用空格分隔的字符串string转换成字符数组string[]&#xff1b;字符串数组string[]转换成整型数组int[] 1、将用console.readline()获取的用空格分隔的string转换成string[] 2、将string[]转换成int[]&#xff08;c#3.0&#xff09; 截取指定字符串 C#RichTextBox截断…

ModaHub魔搭社区:Milvus 数据迁移工具 – MilvusDM

目录 Milvus 数据迁移工具 — MilvusDM 简介 功能介绍 Faiss to Milvus Milvus 数据迁移工具 — MilvusDM 简介 MilvusDM 是一款针对 Milvus 研发的数据迁移工具&#xff0c;支持 Milvus 数据传输以及数据文件的导入与导出&#xff1a; Faiss to Milvus&#xff1a;将未…

基于Transformer视觉分割综述

基于Transformer视觉分割综述 SAM &#xff08;Segment Anything &#xff09;作为一个视觉的分割基础模型&#xff0c;在短短的 3 个月时间吸引了很多研究者的关注和跟进。如果你想系统地了解 SAM 背后的技术&#xff0c;并跟上内卷的步伐&#xff0c;并能做出属于自己的 SAM…

获取齐治堡垒机任意用户登录权限

他一个人呆呆地坐在禾场边上&#xff0c;望着满天的星星&#xff0c;听着小河水朗朗的流水声&#xff0c;陷入了一种说不清楚的思绪之中。这思绪是散乱而飘浮的&#xff0c;又是幽深而莫测的。他突然感觉到&#xff0c;在他们这群山包围的双水村外面&#xff0c;有一个辽阔的大…

spring之BeanFactory

spring之BeanFactory DefaultListableBeanFactory示例代码类继承实现结构 BeanFactory是Bean工厂&#xff0c;所以很明显&#xff0c;BeanFactory会负责创建Bean&#xff0c;并且提供获取Bean的API。 DefaultListableBeanFactory 在Spring源码中&#xff0c;BeanFactory接口存…

ULTRAMAT 23红外气体分析仪

后面板接口图 485通信接口 7脚和9脚 模拟量接口 选装接口 635430034211014569720.pdf (chem17.com)https://img64.chem17.com/2/20140807/635430034211014569720.pdf 特此记录 anlog 2023年7月3日

redis从零开始(6)----分布式锁

场景 修改时&#xff0c;经常需要先将数据读取到内存&#xff0c;在内存中修改后再存回去。在分布式应用中&#xff0c;可能多个进程同时执行上述操作&#xff0c;而读取和修改非原子操作&#xff0c;所以会产生冲突。增加分布式锁可以解决这个问题 基本原理 同步锁&#xf…

14.PWM输出

1.通用定时器PWM概述&#xff1a; 2.PWM工作过程&#xff1a; 2.PWM模式1&PWM模式2&#xff1a; 3.向上计数配置&#xff1a; 4.PWM模式&#xff1a; 5.自动重载的预装载寄存器&#xff1a; 6.STM32定时器3输出通道引脚&#xff1a; 7.PWM输出库函数&#xff1a; PWM输出…

java 单元测试覆盖率调研

1、覆盖率工具对比 根据网上的资料搜索发现&#xff0c;现在常用的 java 单元测试覆盖率工具主要有&#xff1a; EmmaCoberturaJacocoClover(商用&#xff09; 工具JacocoEmmaCobertura原理使用 ASM 修改字节码修改 jar 文件&#xff0c;class 文件字节码文件基于 jcoverage,…

Squid代理服务器配置及CDN简介

Squid代理服务器配置及CDN简介 一、Squid介绍1、代理的工作机制2、代理服务器的概念3、代理服务器的作用4、Squid代理的类型 二、Squid搭建1、安装Squid服务2、构建传统代理服务器3、构建透明代理服务器4、ACL访问控制5、Squid日志分析6、Squid反向代理 三、CDN1、CDN简介2、CD…

vue项目打包后css js 加载不进来,路径不对的问题

问题描述&#xff1a;本地运行都是正常的&#xff0c;打包后出现css js 加载不进来&#xff0c;路径不对&#xff0c;接口调用地址不对出现undefined字段&#xff0c;如图&#xff1a; 网上差了很多资料&#xff0c;试了很多方法都不行&#xff0c;也有说是 publicPath: ./ 配置…

【Matlab】智能优化算法_正余弦优化算法SCA

【Matlab】智能优化算法_正余弦优化算法SCA 1.背景介绍2.数学模型3.文件结构4.详细代码及注释4.1 func_plot.m4.2 Get_Functions_details.m4.3 initialization.m4.4 main.m4.5 SCA.m 5.运行结果6.参考文献 1.背景介绍 尽管需要更多的函数评估&#xff0c;但文献表明&#xff0c…

【花雕】全国青少年机器人技术一级考试试卷(实操真题之三)

随着科技的不断进步&#xff0c;机器人技术已经成为了一个重要的领域。在这个领域中&#xff0c;机械结构是机器人设计中至关重要的一部分&#xff0c;它决定了机器人的形态、运动方式和工作效率。对于青少年机器人爱好者来说&#xff0c;了解机械结构的基础知识&#xff0c;掌…

MyBatis-Plus学习3 Wrapper条件构造器

组装查询Wrapper Testpublic void test01() {// 查询用户名包含a&#xff0c;年龄在20-30之间&#xff0c;邮箱信息不为null的用户信息QueryWrapper<User> queryWrapper new QueryWrapper<>();queryWrapper.like("name", "a").between("…

Linux Shell脚本中的变量和流程控制

Linux Shell脚本中的变量和流程控制 Linux Shell脚本是一种方便的自动化工具&#xff0c;它可以帮助我们完成各种复杂任务。在本文中&#xff0c;我们将详细介绍Shell脚本中的变量和流程控制语句&#xff0c;以及如何使用它们编写高效、可读性强的脚本。 变量 在Shell脚本中&…

【LeetCode热题100】打卡第31天:买卖股票的最佳时机二叉树中的最大路径和

文章目录 【LeetCode热题100】打卡第31天&#xff1a;买卖股票的最佳时机&二叉树中的最大路径和⛅前言 买卖股票的最佳时机&#x1f512;题目&#x1f511;题解 二叉树中的最大路径和&#x1f512;题目&#x1f511;题解 【LeetCode热题100】打卡第31天&#xff1a;买卖股票…

Hello Vue3

一、为什么要学vue3 vue官网&#xff1a;https://cn.vuejs.org/api/ 这是vue官网的简介&#xff0c;说vue2在23年年底就停止维护了&#xff0c;将来会拥抱vue3,这是事务发展的一个必然趋势。 二、vue3相比于vue2做了哪些方面的改进和优化 以下是Vue3相比于Vue2的一些改进和…

DAY37:贪心算法(四)跳跃游戏+跳跃游戏Ⅱ

文章目录 55.跳跃游戏思路完整版总结 45.跳跃游戏Ⅱ思路完整版为什么next覆盖到了终点可以直接break&#xff0c;不用加上最后一步逻辑梳理 总结 55.跳跃游戏 给定一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃…