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

news2024/12/23 10:00:07

一. 目标

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

②面板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.coloradmin.cn/o/1953635.html

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

相关文章

第 3 章 数据和 C

目录 3.1 示例程序 3.1.1 程序中的新元素 3.2 变量与常量数据 3.3 数据: 数据类型关键字 3.3.1 整数和浮点数 3.3.2 整数 3.3.3 浮点数 3.4 C 语言基本数据类型 3.4.1 int 类型 1. 声明 int 变量 2. 初始化变量 3. int 类型常量 4. 打印 int 值 5. 八进制和十六进…

找工作准备刷题Day8 二叉树 (卡尔41期训练营 7.22)

第一题:Leetcode235. 二叉搜索树的最近公共祖先 题目描述 题解1——递归法 class Solution { public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if (root nullptr)return nullptr;if (root->val > p->val &&…

01、爬虫学习入门

爬虫:通过编写程序,来获取获取互联网上的资源 需求:用程序模拟浏览器,输入一个网址,从该网址获取到资源或内容 一、入门程序 #使用urlopen来进行爬取 from urllib.request import urlopen url "http://www.ba…

网络地址转换-NAT

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 一、相关知识 网络地址转换(Network Address Translation,NAT)的基本作用是实现内网 IP 地址与外网 IP 地址的转换…

求职学习day11背八股

本质上我和早睡早上起来玩一早上的游戏没有区别,甚至学习状态更差。得想个办法 12 点睡觉。 第三次 hr 面,为德科和华为的工作效率感到无语。 下周一两场面试。真是要死,这五天时间基本没学什么。八股、项目、手撕。。没一个有能力的感觉。…

代码随想录算法训练营第22天-leetcode-回溯算法part01:

#回溯算法理论基础 能解决的问题: 组合问题:N个数里面按一定规则找出k个数的集合切割问题:一个字符串按一定规则有几种切割方式子集问题:一个N个数的集合里有多少符合条件的子集排列问题:N个数按一定规则全排列&…

[023-2].第2节:SpringBoot中接收参数相关注解

我的后端学习大纲 SpringBoot学习大纲 1.1.基本介绍: SpringBoot接收客户端提交的数据、参数会使用的一些注解: 1.PathVarible2. RequestHeader3.RequestParam4.CookieValue5.RequestBody6.RequestAttribute 1.2.接收参数相关注解与应用实例:…

VirtualBox7.0.18报: IPv6 prefix is not unicast.

VirtualBox7.0.18 报: IPv6 prefix is not unicast. VirtualBox7.0.18 在设置 “NAT网络(Nat Network)” 的IPv6时, 报 IPv6 prefix x::x is not unicast. IPv6 prefix x::x is not unicast. 意思是 x::x 不是IPv6的单播地址 解决办法是: 改为 fcxx 或 fdxx 开头, 如 fc00 ,…

QT Creator下载安装详细教程(保姆级教程)

qt下载安装 1.下载网址 通过清华大学开源软件镜像站进行下载:链接: https://mirrors.tuna.tsinghua.edu.cn/qt/development_releases/online_installers/ 这里我选的是4.4版本的,也可以选择4.7版本,问题不大。 根据电脑系统选择下载linux…

一天一个Harmony Next APP

历史的车轮已经来到太平洋东海岸。 此时如果还不会撸Harmony APP,注定要被碾压。 鸿蒙开发正在如火如荼的开展,抽空看一看吧。 一看就会,一做就废。 这里是一个看废的demo。 主要通过arkts实现鸿蒙关系数据库的封装,实现数据…

搭建自己的金融数据源和量化分析平台(一):系统架构设计

0x00 前言 由于某得的数据实在是太贵,某花顺免费版又不提供专业的数据分析工具,Tushare也开始收费,因此决定基于python和MySQL搭建一个自己的金融数据库。期望做到仅依靠交易所、巨潮资讯网等官方的公开数据实现,尽量不依靠某花顺…

Java中线程池的基本使用

参考这个课程,讲的非常详细 27.线程池使用步骤总结_哔哩哔哩_bilibili 应用场景 商品秒杀 文件上传 订票系统 自定义线程池(让我们了解底层逻辑的) 构造方法 饱和机制 就是我们的队列饱和后我们该怎么处理 是拒绝这个任务还是啥…

API 技术开发分享:连接电商平台数据获取的桥梁

在当今数字化的时代,API(Application Programming Interface,应用程序编程接口)技术成为了实现不同系统之间通信和数据交换的关键。它就像是一座无形的桥梁,使得各种应用能够相互协作,共享资源,…

网页突然被恶意跳转或无法打开?DNS污染怎么解决?

前言 在网上冲浪时,我们时常会遭遇DNS污染这一区域性攻击,几乎无人能幸免。受影响时:尝试访问正规网站可能会被错误导向赌博、色情或其他恶意站点。 1.我们为什么需要DNS 当我们想要访问一个网站时,就像拨打朋友的电话号码一样…

第三届人工智能、物联网和云计算技术国际会议(AIoTC 2024,9月13-15)

第三届人工智能、物联网与云计算技术国际会议(AIoTC 2024)将于2024年9月13日-15日在中国武汉举行。 本次会议由华中师范大学伍伦贡联合研究院与南京大学联合主办、江苏省大数据区块链与智能信息专委会承办、江苏省概率统计学会、江苏省应用统计学会、Sir Forum、南京理工大学、…

docker笔记6-数据卷

docker笔记6-数据卷 一、初识dockerfile1.1 编写镜像1.2 构建镜像1.3 运行镜像 二、案例2.1 多个容器共享数据2.2 多个mysql数据共享 一、初识dockerfile 之前的内容中,我们都是通过pull的方式拉取别人写好的镜像,那么通过编写dockerfile,我…

Linux系统编程:传输层(补充)

1. 用UDP实现可靠传输 在前面介绍了UDP是一种不可靠的面向数据包的传输协议。那么如何实现UDP的可靠传输呢? 其实就是在应用层自己实现像TCP一样的可靠性机制:引入序列号、引入确认应答、超时重传、流量控制、拥塞控制等机制。 2. listen系统接口 在…

四向穿梭车价格战进入下半场,杀入单台10万区间~

导语 大家好,我是社长,老K。专注分享智能制造和智能仓储物流等内容。 近年来,仓储自动化设备市场蓬勃发展,其中四向穿梭车作为新兴明星产品,正在引领一场仓储革命。 数据显示,2023年中国托盘四向穿梭车销量…

初学Mybatis之 Lombok 篇

idea 安装 Lombok 插件&#xff1a; File->Settings->Plugins->搜索 lombok 下载 在项目中导入 lombok 的 jar 包&#xff1a; <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.…

麦田物语第十五天

系列文章目录 麦田物语第十五天 文章目录 系列文章目录一、构建游戏的时间系统二、时间系统 UI 制作总结 一、构建游戏的时间系统 在该游戏中我们要构建年月日天时分秒等时间的概念&#xff0c;从而实现季节的更替&#xff0c;昼夜的更替等&#xff08;不同的季节可以播种不同…