GEE:多面板同步缩放查看多源数据,并实现交互选点构建NDVI曲线

一. 目标

①构建三个面板,分别显示不同来源数据;

②面板1显示哨兵数据+面版2显示谷歌高清数据+面板3实现用户任意交互选点,并以该点为中心构建正方形,随后生成该正方形的区域NDVI平均值长时序曲线;

③保证前两个面板可以同步缩放查看数据。

二.代码

// 定义研究区域
var aoi = ee.FeatureCollection('你的aoi链接').geometry(); 
// 获取Sentinel-2影像集合
var sentinelCollection = ee.ImageCollection('COPERNICUS/S2').filterBounds(aoi).filterDate('2020-01-01', '2020-12-31').filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20)) // remove clouds.select(['B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B7', 'B8', 'B8A', 'B9', 'B10', 'B11', 'B12']);// 获取特定日期的影像
var image1 = sentinelCollection.filterDate('2020-04-01', '2020-04-30').median().clip(aoi);
var image2 = sentinelCollection.filterDate('2021-04-01', '2021-04-30').median().clip(aoi);// 定义可视化参数
var visParams = {bands: ['B4', 'B3', 'B2'],min: 0,max: 3000,gamma: 1.4// change luminance
};// 创建地图
var map1 = ui.Map().setOptions('Hybrid').setZoom(4);
var map2 = ui.Map().setOptions('SATELLITE').setZoom(4);// 监听 map1 的缩放级别变化:将 map2 的缩放级别设置为 map1 缩放级别加 2;将 map3 的缩放级别设置为 map1 缩放级别加 5
map1.onChangeZoom(function(zoom){zoom = parseInt(zoom); // 转换为整数类型map2.setZoom(zoom);
});map2.onChangeZoom(function(zoom){zoom = parseInt(zoom);map1.setZoom(zoom);
});// 当在一个地图上平移时,其他两个地图会同步平移。
var linker = ui.Map.Linker([map1, map2], 'change-center');// 添加图层到地图面板
map1.addLayer(image1, visParams, 'April 2020');
map2.addLayer(image2, visParams, 'April 2021');// 获取MODIS影像集合
var modisCollection = ee.ImageCollection('MODIS/006/MOD13Q1').filterBounds(aoi).filterDate('2020-01-01', '2020-12-31'); // 修正日期范围// 创建时间序列面板
var chartPanel = ui.Panel({style: {width: '34%'}
});// 创建时间序列图表
var plotNDVI = function(geometry, title) {// ee.Reducer.mean() 计算该区域内像素值的平均值var timeSeries = ui.Chart.image.series({imageCollection: modisCollection.select('NDVI'),region: geometry,reducer: ee.Reducer.mean(),scale: 500,xProperty: 'system:time_start'}).setOptions({title: title,vAxis: {title: 'NDVI'},hAxis: {title: 'Date'},lineWidth: 1,pointSize: 3});chartPanel.clear();chartPanel.add(timeSeries);
};// 添加绘制工具到 map1 和 map2
function addDrawingTools(map, mapTitle) {var drawingTools = map.drawingTools();drawingTools.addLayer([], 'geometry');drawingTools.setShape('point');drawingTools.draw();// 绘制正方形function onClickToDrawRectangle() {var point = drawingTools.layers().get(0).getEeObject();drawingTools.layers().reset();// 创建一个以该点为中心的500米的正方形var buffer = point.buffer(250); // 500米边长的正方形边长的一半是250米var square = buffer.bounds();//ee.Image() 创建一个空的影像对象;//toByte() 方法将影像的像素值转换为字节类型,使它们适合绘制和显示//paint() 方法用于将几何形状或特征绘制到影像上var square_display = ee.Image().toByte().paint({featureCollection:square,color:111112,width:1.5});map1.layers().set(1, ui.Map.Layer(square_display));将矢量边界空心显示在网页上,设置颜色map2.layers().set(0, ui.Map.Layer(square_display));map.centerObject(point, 15); // 设置地图中心到选择的点plotNDVI(square, mapTitle);drawingTools.draw();}drawingTools.onDraw(onClickToDrawRectangle); // 启用绘图工具
}addDrawingTools(map1, 'Map 1 NDVI Time Series');
addDrawingTools(map2, 'Map 2 NDVI Time Series');// 创建水平分割面板(宽度为整个用户界面的66%),其中 map1 和 map2 分别位于左侧和右侧
var split1 = ui.Panel(ui.SplitPanel({firstPanel: map1,secondPanel: map2,orientation: 'horizontal',wipe: false,
}), null, {width: '66%', height:'100%'});// 创建水平分割面板(宽度为整个用户界面的34%),其中 chartPanel 位于map1和map2的右侧
var split2 = ui.Panel(ui.SplitPanel({firstPanel: split1,secondPanel: chartPanel,orientation: 'horizontal',wipe: false,
}), null, {width: '100%', height: '100%'});ui.root.clear(); // 清空当前用户界面上的所有内容
ui.root.insert(0, split2); // 将新的布局 split2 插入到用户界面的根容器中,位置索引为 0(即第一个位置)

三. 结果

使用最左侧面板的选点工具在图中点击后,即可得到下图,也就是最右侧的NDVI时间序列。

四. 参考

GEE中多视窗链接查看地图要素

这是本文实现的基础,十分感谢这位大佬~

完结撒花~

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

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

相关文章

19.延迟队列优化

问题 前面所讲的延迟队列有一个不足之处,比如现在有一个需求需要延迟半个小时的消息,那么就只有添加一个新的队列。那就意味着,每新增一个不同时间需求,就会新创建一个队列。 解决方案 应该讲消息的时间不要跟队列绑定&#xf…

ANR分析及解决方案

ANR分析及解决方案 首先,什么是ANR?那么,为什么会发生ANR?哪些场景会造成ANR?ANR触发机制如何避免ANR?发生ANR异常怎么处理? 首先,什么是ANR? ANR(Application Not responding)&…

27、美国国家冰雪中心(NSIDC)海冰密集度月数据下载与处理

文章目录 一、前言二、数据下载三、使用Ponply查看数据结构四、代码一、前言 处理美国国家冰雪中心(NSIDC)的海冰密集度月度数据时,坐标转换是一个重要的步骤。NSIDC提供的数据通常采用极地球面坐标系,需要将其转换为常用的地理坐标系(如经纬度)以便进行分析和可视化。 坐…

python debug怎么用

1.打开pycharm,新建一个python程序,命名为excel.py。 2.直接贴出代码,如果是hello world就不存调试的问题了! 3.介绍调试的菜单操作,在【菜单栏】选择【RUN】,下拉菜单里选择【debug excel.py】或者【Debug…

【C++】类与对象--初始化列表,类型转换,static,友元

文章目录 前言一、初始化列表1.1 初始化列表概述1.2 初始化列表注意事项初始化列表代码示例 二、类类型转换2.1 类类型转换2.2 代码示例 三.static成员3.1 静态成员变量3.2 代码示例 四.友元4.1友元概述4.2 友元特点4.3 友元代码示例 五.内部类5.1 内部类特点5.2 代码示例 六.匿…

掀桌子了!原来是咱们的大屏设计太酷,吓着前端开发老铁了

掀桌子了!原来是咱们的大屏设计太酷,吓着前端开发老铁了 艾斯视觉观点认为:在软件开发的世界里,有时候创意和设计的火花会擦得特别亮,以至于让技术实现的伙伴们感到既兴奋又紧张。这不,我们的设计团队刚刚…

利用AI能力实现一个生成掘金、CSDN文章的总结并生成思维脑图

背景 为了快速了解文章重点!! 设计思路 1、根据文章链接、获取文章内容 2、编写 prompt 3、利用 markmap 显示思维导图 实现 获取文章内容 利用爬虫技术,简单利用 axios 获取链接内容,然后通过 cheerio 获取相关元素。 编码…

靶机Metasploitable2的安装

Metasploitable2是一款基于Ubuntu Linux的操作系统。Metasploitable2是一个虚拟机文件,从网上下载解压之后就可以直接使用,无需安装。该系统本身设计作为安全工具测试和演示常见漏洞攻击的靶机,所以它存在大量未打补丁漏洞,并且开…

C语言中的IO控制流

文章目录 一、什么是C语言中的IO控制流二、open函数 1.使用open函数创建文件2.使用使用open函数打开文件三、文件的权限四、文件的描述符五、read函数六、write函数七、lseek函数八、close函数 一、什么是C语言中的IO控制流 在linux系统中一切皆文件,C语言中的IO控…

13.2 MongoDB

13.2 MongoDB 1. 概述2. docker安装3. SpringBoot整合MongoDB3.1 依赖3.2 配置连接1. 基于`yml`配置2. 基于配置类配置3.3 启动项坑1坑23.4 新增业务1. 实体类映射2. 数据层3. 业务层4. 控制层5. 测试结果3.5 单条记录查询业务1. 数据层2. 业务层3. 控制层4. 断点测试3.6 分页查…

【Rust光年纪】极致性能与灵活选择:Rust语言数学优化库详解

Rust语言中的数学优化:六大利器汇总 前言 在当今信息时代,数据处理和数学优化成为了各行各业中不可或缺的重要环节。为了满足对高效、快速计算的需求,Rust语言逐渐成为了许多开发者的首选,因其性能优越、并发安全等特点。本文将…

【C语言】指针的爱恨纠葛:常量指针vs指向常量的指针

目录 常量指针和指向常量的指针有什么区别?1. 指向常量的指针(Pointer to Constant)声明方式:示例:解释: 2. 常量指针(Constant Pointer)声明方式:示例:解释&…

zookeeper子结点方式实现分布式锁(阻塞,非阻塞)

一,阻塞式和非阻塞式 “阻塞”和“非阻塞”只是一个人为的概念,“阻塞”说的是一个线程去尝试获取锁,如果失败,就阻塞在这里,监听到持有锁的线程释放,再次去尝试获取。 而“非阻塞”是我尝试一次失败了&am…

泛域名绑定到wordpress网站二级目录

要将WordPress的泛域名绑定到二级目录&#xff0c;你需要在你的服务器上修改Apache或Nginx配置文件。以下是两种最常见的服务器配置的示例&#xff1a; Apache服务器 编辑你的虚拟主机配置文件&#xff0c;通常位于/etc/apache2/sites-available/目录下。 <VirtualHost *…

2024 暑假友谊赛-热身1

[ABC102D] Equal Cut - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路:找在区间[2,n-1]中找到i,j,k三个点,把序列分割成4个区间:[1,i],[i1,j],[j1,k],[k1,n] 暴力的做法是枚举i,j,k加上前缀和是o(n^3)的 key:"考虑枚举处于中间的j&#xff0c;然后用i平衡左两个区间,…

【踩坑系列-JS】iframe中的url参数获取

Author&#xff1a;赵志乾 Date&#xff1a;2024-07-24 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 1. 问题描述 系统A的页面中以iframe的方式嵌入了系统B的页面&#xff0c;并需要将A页面url中的参数传递给B页面。 最初的实现方式是&am…

【es】elasticsearch 自定义排序-按关键字位置排序

一 背景 要求es查询的结果按关键字位置排序&#xff0c;位置越靠前优先级越高。 es版本7.14.0&#xff0c;项目是thrift&#xff0c;也可以平替springboot&#xff0c;使用easyes连接es。 二 easyes使用 配easyes按官方文档就差不多了 排序 | Easy-Es 主要的一个问题是easy…

Lua实现面向对象以及类的继承

0.简单前言 1、面向对象主要四个特征&#xff1a;封装&#xff0c;继承&#xff0c;多态&#xff0c;抽象 2、Lua是种简单精致小巧的语言&#xff0c;其本质是个表&#xff08;table&#xff09;&#xff0c;变量和方法皆可看作为该表的元素。 P.S. 该博客和代码为个人编写习…

Golang零基础入门课_20240726 课程笔记

视频课程 最近发现越来越多的公司在用Golang了&#xff0c;所以精心整理了一套视频教程给大家&#xff0c;这个只是其中的第一部&#xff0c;后续还会有很多。 视频已经录制完成&#xff0c;完整目录截图如下&#xff1a; 课程目录 01 第一个Go程序.mp402 定义变量.mp403 …

【工具类】Java DES加密解密

package com.util;import java.security.Key; import java.security.SecureRandom;import javax.crypto.Cipher; import javax.crypto.KeyGenerator;import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; /*** DES算法*/ SuppressWarnings("restriction")…