【openlayers系统学习】3.6-3.7添加可视化选择器,手动选择可视化的图像源

news2024/11/20 13:18:02

六、添加可视化选择器(选择可视化的图像类型)

在前面的示例中,我们已经看到了同一Sentinel-2图像的真彩色合成、假彩色合成和NDVI渲染。如果能让用户从这些可视化中选择一个或更多,而不必每次都更改我们的代码,那就太好了。为此,我们将创建一个可用可视化的列表,并在页面中添加一个 <select>​ 元素,让用户选择要显示的内容。

除了真彩色、假彩色和NDVI可视化之外,我们还将添加一个新的归一化差异水指数(NDWI)。这与归一化差异植被指数类似,不同之处在于它可用于监测水体的变化。

NDWI = (GREEN - NIR) / (GREEN + NIR)

正如我们所看到的,每个可视化都需要有一个 sources​ 数组(这些是单波段或多波段GeoTIFF的URL),一个可选的 max​ 值用于缩放GeoTIFF值,一个可选的 style​ 用于渲染图层。此外,我们将为每个可视化提供给予一个 name​ ,以便显示给用户。

编辑您的 main.js​ 以包含以下可视化数据:

const visualizations = [
  {
    name: 'True Color',
    sources: ['TCI'],
  },
  {
    name: 'False Color',
    sources: ['B08', 'B04', 'B03'],
    max: 5000,
  },
  {
    name: 'NDVI',
    sources: ['B04', 'B08'],
    max: 10000,
    style: {
      color: [
        'interpolate',
        ['linear'],
        ['/', ['-', ['band', 2], ['band', 1]], ['+', ['band', 2], ['band', 1]]],
        ...getColorStops('earth', -0.5, 1, 10, true),
      ],
    },
  },
  {
    name: 'NDWI',
    sources: ['B03', 'B08'],
    max: 10000,
    style: {
      color: [
        'interpolate',
        ['linear'],
        ['/', ['-', ['band', 1], ['band', 2]], ['+', ['band', 1], ['band', 2]]],
        ...getColorStops('viridis', -1, 1, 10, true),
      ],
    },
  },
];

现在,我们需要一个函数来在用户选择可视化时创建这些,而不是一次性创建GeoTIFF源和层。这个函数将接受一个 base​ URL和一个 visualization​ ,并返回一个 layer​ 。编辑您的 main.js​ 以删除源和层定义,并包含此函数:

function createLayer(base, visualization) {
  const source = new GeoTIFF({
   //使用map函数遍历可视化配置中的每个数据源ID
    sources: visualization.sources.map((id) => ({
      url: `${base}/${id}.tif`,
      max: visualization.max,
    })),
  });

  return new TileLayer({
    source: source,
    style: visualization.style,
  });
}

接下来,我们可以更改 main.js​ 中的地图定义,使其根本不包含任何图层(这些图层将在用户选择可视化时添加):

const map = new Map({
  target: 'map-container',
});

现在,我们需要一种方法来让用户选择要显示的可视化。为此,我们将在 <script>​ 标记之前的 index.html​ 中添加一个 <select>​ 元素:

<div id="controls">
  <select id="visualization"></select>
</div>

要让这个 <select>​ 元素显示在地图的右上角,请将以下块添加到 index.html​ 中的 <style>​ 标签:

#controls {
  position: absolute;
  top: 20px;
  right: 20px;
}

有了 <select>​ 元素,我们需要为每个可视化名称填充一个 <option>​ 。要做到这一点,请将以下内容添加到 main.js​ 数组下面的某个位置:

const visualizationSelector = document.getElementById('visualization');
visualizations.forEach((visualization) => {
  const option = document.createElement('option');
  option.textContent = visualization.name;
  visualizationSelector.appendChild(option);
});

最后,我们将创建一个函数,根据选定的可视化使用新层更新地图。我们将在 <select>​ 元素上添加这个函数作为 change​ 侦听器,并调用它来初始化我们的应用:

function updateVisualization() {
  const visualization = visualizations[visualizationSelector.selectedIndex];
  const base =
    'https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/21/H/UB/2021/9/S2B_21HUB_20210915_0_L2A';

  const layer = createLayer(base, visualization);
  map.setLayers([layer]);

}

visualizationSelector.addEventListener('change', updateVisualization);
updateVisualization();
map.setView(layer.getSource().getView());

现在,http://localhost:5173/应该显示一个可视化浏览器。

image

Visualization chooser 可视化选择器

好极了!现在,用户可以选择要呈现的可视化类型。但是如果能改变图像来源不是很好吗?下一个。

七、可视化选择器(选择可视化的图像源)

最后一个缺失部分是使用户可以选择图像源。添加图像处理器并不需要做太多的工作。我们开始吧!

首先,我们需要列出应该显示的图像列表。对于每个图像,我们希望在 <select>​ 元素中显示一个名称供用户选择,并且我们需要有一个 GeoTIFF URL 的base​。因此,我们将在 main.js ​中添加类似以下内容的代码:

const images = [
  {
    name: 'Buenos Aires',
    base: 'https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/21/H/UB/2021/9/S2B_21HUB_20210915_0_L2A',
  },
  {
    name: 'Minneapolis',
    base: 'https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/15/T/WK/2021/9/S2B_15TWK_20210918_0_L2A',
  },
  {
    name: 'Cape Town',
    base: 'https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/34/H/BH/2021/9/S2B_34HBH_20210922_0_L2A',
  },
];

接下来,我们将添加另一个 <select>​ 元素,让用户选择图像。在 index.html​ 中,调整控件,使其看起来像这样:

<div id="controls">
  <select id="image"></select>
  <select id="visualization"></select>
</div>

回到JavaScript,我们需要为每个图像源填充一个 <option>​ 元素。在您的 main.js​ 中添加以下内容:

const imageSelector = document.getElementById('image');
images.forEach((image) => {
  const option = document.createElement('option');
  option.textContent = image.name;
  imageSelector.appendChild(option);
});

现在,我们只需要对更新可视化的函数做一个小的调整,这样它就可以从选定的图像源中获取 base​ URL。在 main.js​ 中,编辑 updateVisualization​ 使base动态选择,并且设置如果基图改变,调整地图视图,使其看起来像这样:

let previousBase;
function updateVisualization() {
    // 获取当前选择的可视化选项和图像选项
  const visualization = visualizations[visualizationSelector.selectedIndex];
  const base = images[imageSelector.selectedIndex].base;
  const newBase = base !== previousBase;
  previousBase = base;

  const layer = createLayer(base, visualization);
  map.setLayers([layer]);

    // 如果是新的基图,则调整地图视图
  if (newBase) {
    map.setView(layer.getSource().getView());
  }
}

visualizationSelector.addEventListener('change', updateVisualization);
imageSelector.addEventListener('change', updateVisualization);
updateVisualization();

请注意,现在只有在用户选择了新的图像源时才更新视图。这比在选择新的可视化类型时缩放到完整范围更好。

重新加载 http://localhost:5173/。

image

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

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

相关文章

【热门话题】一文带你读懂公司是如何知道张三在脉脉上发了“一句话”的

按理说呢&#xff0c;A公司和脉脉属于不同的平台&#xff0c;而且脉脉上大家可以匿名发言&#xff0c;所以&#xff0c;即便我坐在你边上&#xff0c;我发了一句话上去&#xff0c;你也不知道是谁发的。但通过一些技术&#xff0c;我们却可以分析出&#xff0c;公司是如何知道张…

Git远程控制

文章目录 1. 创建仓库1.1 Readme1.2 Issue1.3 Pull request 2. 远程仓库克隆3. 推送远程仓库4. 拉取远程仓库5. 配置Git.gitignore配置别名 使用GitHub可以&#xff0c;采用Gitee也行 1. 创建仓库 1.1 Readme Readme文件相当于这个仓库的说明书&#xff0c;gitee会初始化2两份…

docker容器安装nexus3以及nexus3备份迁移仓库数据

一、安装步骤 1.搜索nexus3镜像 docker search nexus3 2.拉取镜像 docker pull sonatype/nexus3或者指定版本 docker pull sonatype/nexus3:3.68.0 3.查看拉取的镜像 docker images | grep "nexus3" 4.启动nexus服务 直接启动 docker run -d --name nexus3 -…

基于Django框架深度学习口罩检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 随着全球疫情的蔓延&#xff0c;口罩成为了重要的防护工具。然而&#xff0c;在实际场景中&am…

MySQL —— 复合查询

一、基本的查询回顾练习 前面两章节整理了许多关于查询用到的语句和关键字&#xff0c;以及MySQL的内置函数&#xff0c;我们先用一些简单的查询练习去回顾之前的知识 1. 前提准备 同样是前面用到的用于测试的表格和数据&#xff0c;一张学生表和三张关于雇员信息表 雇员信息…

qt 布局学习笔记

目录 管理信息列表源码 c版&#xff1a; pro文件&#xff1a; qt 设置水平布局&#xff0c;里面有两个按钮&#xff0c;每个按钮就变的很宽&#xff0c;怎么设置按钮的精确位置 设置固定大小&#xff1a; 使用弹性空间&#xff08;Spacer&#xff09; 使用布局比例&…

Apache Doris 基础(一) -- Getting Started

Apache Doris 开源、实时数据仓库 Apache Doris是一个用于实时分析的现代数据仓库。 它提供大规模闪电般的实时数据分析。 实时获取和存储 在一秒钟内基于推的微批处理和基于拉的流数据获取。实时更新&#xff0c;追加和预聚合的存储引擎闪电般的查询 使用列式存储引擎、MPP架构…

vue3封装ElementUI plus Dialog弹窗

因为ElementuiPlus的dialog弹框的初始样式不太好看,而公司要求又要好看,本来是已经实现了,但是后来想想了发现封装完dialog的其他功能也要,所以特此记录一下 方案一 思路:封装一个组件,将所有新增的参数引入el-dialog 参数中,实现参数共用 新建一个组件,将官网暴露的属性全部引…

达梦数据库详解

达梦认证是指针对中国数据库管理系统&#xff08;DBMS&#xff09;厂商达梦公司所推出的数据库产品&#xff0c;即达梦数据库&#xff08;DMDB&#xff09;&#xff0c;进行的一种官方认证体系。达梦认证旨在验证数据库管理人员对达梦数据库产品的掌握程度&#xff0c;及其在数…

【AD936X】 SDR 版图 欣赏

DIE : 4336x4730 um 的 65 nm 芯片 在顶部金属上&#xff0c;您可以看到 PLL 的电感器和日期代码 - 芯片在推出前两年就已准备就绪&#xff1a; 右下角是主数字块&#xff0c;应该是 128 抽头 FIR 滤波器。在最大放大倍率下&#xff0c;我们可以看到一排排标准单元。它们的放置…

[深度学习]基于yolov8+bytetrack+pyqt5实现车辆进出流量统计+车辆实时测速实现

以前使用过yolov5deepsort实现过车辆进出流量统计车辆实时测速&#xff0c;可以看我往期视频&#xff0c;这回改成yolov8bytetrack实现&#xff0c;实时性更好&#xff0c;原理和原来一样。车流量进出统计车速测量优点&#xff1a; 使用目标检测算法考虑bbox抖动&#xff0c;解…

绿联NAS DXP系列发布:内网穿透技术在私有云的应用分析

5月23日&#xff0c;绿联科技举行了“新一代存储方式未来已来”发布会&#xff0c;发布了绿联NAS私有云DXP系列&#xff08;包括两盘位到八盘位的九款新品&#xff09;以及由绿联科技自研的全新NAS系统UGOS Pro。此次绿联发布的DXP系列九款产品&#xff0c;共有两盘位、四盘位、…

Windows DNS 服务器配置转发器

DNS服务器转发器 在企业中由于自身条件的限制&#xff0c; 可能本身的DNS新能并不是很好&#xff0c;这个时候通过使用转发器功能&#xff0c; 将收到的DNS请求转发给另外一台高性能的DNS服务器&#xff0c;让其做后面的迭代查询。 1. 选择DNS服务器&#xff0c; 右击选择属性…

【LeetCode:496. 下一个更大元素 I + 单调栈】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

windows2008修改远程桌面端口,如何果断修改远程桌面端口,确保系统安全无忧!

在数字化时代的浪潮中&#xff0c;Windows 2008系统以其卓越的稳定性和可靠性&#xff0c;赢得了众多企业和个人的青睐。然而&#xff0c;随着网络安全问题的日益严峻&#xff0c;如何确保远程桌面连接的安全&#xff0c;成为了摆在我们面前的一道难题。今天&#xff0c;我将为…

MySQL的ODBC驱动下载、安装以及配置数据源

下载地址&#xff1a;odbc官方下载地址 MySQL :: Download Connector/ODBC 下载安装ODBC驱动 配置MySQL ODBC 数据源 进入控制面板->系统和安全->Windows工具 Data Source Name填写需要生成的ODBC数据源的名称。Description选填。如果使用远程数据库服务器&a…

我怎么使用AI大语言模型学英语

今天已经是我开始英语拉练任务的第39天了&#xff0c;一直在笃定的、雷打不动的、机械笨拙的重复做一件事&#xff0c;那就是使用AI工具&#xff0c;将我想要说的话翻译成英文&#xff0c;生成语音文件&#xff0c;每天朗读三小时&#xff0c;最终整个背下来。我也在思考&#…

使用分水岭算法进行图像分割

文章目录 理论代码 原文路径:opencv-4.6.0\doc\py_tutorials\py_imgproc\py_watershed 目标 在这一章当中&#xff0c; 我们将学习使用分水岭算法使用基于标记的图像分割我们将看到&#xff1a;cv.watershed() 理论 任何灰度图像都可以被视为地形表面&#xff0c;其中高强度…

【面经】单片机

1、单片机IO口工作方式 输入 模拟输入&#xff08;GPIO_Mode_AIN&#xff09;&#xff1a;关闭施密特触发器&#xff0c;将电压信号传送到片上外设模块&#xff0c;通常用于连接模拟信号源。浮空输入&#xff08;GPIO_Mode_IN_FLOATING&#xff09;&#xff1a;在浮空输入状态…

element ui 的密码输入框点击显示隐藏密码时,图标随之改变

场景图&#xff1a; 原理&#xff1a; 通过修改el-input框的type属性&#xff0c;来设置显示或者隐藏。从而改变图标地址。 <el-input class"passwordinput" :type"pwdObj.pwdType" ref"pwdInput" placeholder"密码"v-model"…