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

王柳  金牌会员 | 2024-7-29 06:10:33 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 540|帖子 540|积分 1620

一. 目标
①构建三个面板,分别显示不同来源数据;
②面板1显示哨兵数据+面版2显示谷歌高清数据+面板3实现用户恣意交互选点,并以该点为中心构建正方形,随后天生该正方形的区域NDVI平均值长时序曲线;
③包管前两个面板可以同步缩放检察数据。
二.代码
  1. // 定义研究区域
  2. var aoi = ee.FeatureCollection('你的aoi链接').geometry();
  3. // 获取Sentinel-2影像集合
  4. var sentinelCollection = ee.ImageCollection('COPERNICUS/S2')
  5.   .filterBounds(aoi)
  6.   .filterDate('2020-01-01', '2020-12-31')
  7.   .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20)) // remove clouds
  8.   .select(['B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B7', 'B8', 'B8A', 'B9', 'B10', 'B11', 'B12']);
  9. // 获取特定日期的影像
  10. var image1 = sentinelCollection.filterDate('2020-04-01', '2020-04-30').median().clip(aoi);
  11. var image2 = sentinelCollection.filterDate('2021-04-01', '2021-04-30').median().clip(aoi);
  12. // 定义可视化参数
  13. var visParams = {
  14.   bands: ['B4', 'B3', 'B2'],
  15.   min: 0,
  16.   max: 3000,
  17.   gamma: 1.4// change luminance
  18. };
  19. // 创建地图
  20. var map1 = ui.Map().setOptions('Hybrid').setZoom(4);
  21. var map2 = ui.Map().setOptions('SATELLITE').setZoom(4);
  22. // 监听 map1 的缩放级别变化:将 map2 的缩放级别设置为 map1 缩放级别加 2;将 map3 的缩放级别设置为 map1 缩放级别加 5
  23. map1.onChangeZoom(function(zoom){
  24.   zoom = parseInt(zoom); // 转换为整数类型
  25.   map2.setZoom(zoom);
  26. });
  27. map2.onChangeZoom(function(zoom){
  28.   zoom = parseInt(zoom);
  29.   map1.setZoom(zoom);
  30. });
  31. // 当在一个地图上平移时,其他两个地图会同步平移。
  32. var linker = ui.Map.Linker([map1, map2], 'change-center');
  33. // 添加图层到地图面板
  34. map1.addLayer(image1, visParams, 'April 2020');
  35. map2.addLayer(image2, visParams, 'April 2021');
  36. // 获取MODIS影像集合
  37. var modisCollection = ee.ImageCollection('MODIS/006/MOD13Q1')
  38.   .filterBounds(aoi)
  39.   .filterDate('2020-01-01', '2020-12-31'); // 修正日期范围
  40. // 创建时间序列面板
  41. var chartPanel = ui.Panel({
  42.   style: {
  43.     width: '34%'
  44.   }
  45. });
  46. // 创建时间序列图表
  47. var plotNDVI = function(geometry, title) {
  48.   // ee.Reducer.mean() 计算该区域内像素值的平均值
  49.   var timeSeries = ui.Chart.image.series({
  50.     imageCollection: modisCollection.select('NDVI'),
  51.     region: geometry,
  52.     reducer: ee.Reducer.mean(),
  53.     scale: 500,
  54.     xProperty: 'system:time_start'
  55.   }).setOptions({
  56.     title: title,
  57.     vAxis: {title: 'NDVI'},
  58.     hAxis: {title: 'Date'},
  59.     lineWidth: 1,
  60.     pointSize: 3
  61.   });
  62.   chartPanel.clear();
  63.   chartPanel.add(timeSeries);
  64. };
  65. // 添加绘制工具到 map1 和 map2
  66. function addDrawingTools(map, mapTitle) {
  67.   var drawingTools = map.drawingTools();
  68.   drawingTools.addLayer([], 'geometry');
  69.   drawingTools.setShape('point');
  70.   drawingTools.draw();
  71.   // 绘制正方形
  72.   function onClickToDrawRectangle() {
  73.     var point = drawingTools.layers().get(0).getEeObject();
  74.     drawingTools.layers().reset();
  75.     // 创建一个以该点为中心的500米的正方形
  76.     var buffer = point.buffer(250); // 500米边长的正方形边长的一半是250米
  77.     var square = buffer.bounds();
  78.     //ee.Image() 创建一个空的影像对象;
  79.     //toByte() 方法将影像的像素值转换为字节类型,使它们适合绘制和显示
  80.     //paint() 方法用于将几何形状或特征绘制到影像上
  81.     var square_display = ee.Image().toByte().paint({featureCollection:square,color:111112,width:1.5});
  82.     map1.layers().set(1, ui.Map.Layer(square_display));将矢量边界空心显示在网页上,设置颜色
  83.     map2.layers().set(0, ui.Map.Layer(square_display));
  84.     map.centerObject(point, 15); // 设置地图中心到选择的点
  85.     plotNDVI(square, mapTitle);
  86.     drawingTools.draw();
  87.   }
  88.   
  89.   drawingTools.onDraw(onClickToDrawRectangle); // 启用绘图工具
  90. }
  91. addDrawingTools(map1, 'Map 1 NDVI Time Series');
  92. addDrawingTools(map2, 'Map 2 NDVI Time Series');
  93. // 创建水平分割面板(宽度为整个用户界面的66%),其中 map1 和 map2 分别位于左侧和右侧
  94. var split1 = ui.Panel(ui.SplitPanel({
  95.   firstPanel: map1,
  96.   secondPanel: map2,
  97.   orientation: 'horizontal',
  98.   wipe: false,
  99. }), null, {width: '66%', height:'100%'});
  100. // 创建水平分割面板(宽度为整个用户界面的34%),其中 chartPanel 位于map1和map2的右侧
  101. var split2 = ui.Panel(ui.SplitPanel({
  102.   firstPanel: split1,
  103.   secondPanel: chartPanel,
  104.   orientation: 'horizontal',
  105.   wipe: false,
  106. }), null, {width: '100%', height: '100%'});
  107. ui.root.clear(); // 清空当前用户界面上的所有内容
  108. ui.root.insert(0, split2); // 将新的布局 split2 插入到用户界面的根容器中,位置索引为 0(即第一个位置)
复制代码
三. 效果

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

四. 参考
GEE中多视窗链接检察舆图要素
这是本文实现的基础,非常感谢这位大佬~
完结撒花~

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王柳

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表