保姆级教程:在GEE上调用GEDI激光雷达数据,5分钟绘制全球植被高度图 5分钟极速上手用GEE调用GEDI数据绘制专业级植被高度图第一次接触激光雷达植被高度数据时我被那些复杂的参数和庞大的数据集吓退了三次。直到发现Google Earth EngineGEE这个神器配合GEDI卫星的开放数据原来绘制一张科研级的全球植被高度分布图真的只需要5分钟——这比我煮一杯咖啡的时间还短。1. 认识GEDI太空中的激光尺子GEDIGlobal Ecosystem Dynamics Investigation是NASA安装在空间站上的激光雷达系统它像一把精密的太空尺子每秒向地球发射242次激光脉冲通过测量激光返回时间计算植被高度。与传统光学遥感不同GEDI能穿透树冠直达地面获取真实的植被三维结构。关键参数rh98在GEDI02_A数据产品中rh98表示98%激光能量返回的高度比常用的rh100树冠顶部高度更稳定受零星高大树木影响更小。这也是我们绘制植被高度图的首选指标。提示GEDI数据有8个独立波束每月覆盖全球热带和温带地区51.6°S-51.6°N空间分辨率约25米。2. 零基础搭建GEE开发环境2.1 快速注册与界面导航访问 Google Earth Engine官网 用Google账号登录点击Code Editor进入开发环境左侧面板说明Scripts保存代码文件Assets上传自定义研究区域边界中间代码编辑区是我们的主战场// 测试环境是否正常 - 运行后会显示全球地图 var dummy ee.Image(1); Map.addLayer(dummy, {min:0, max:1}, 测试图层); Map.setCenter(0, 0, 2); // 定位到非洲中部2.2 加载研究区域边界两种常用方法手动绘制点击地图上方工具栏的多边形图标导入矢量文件// 示例加载亚马逊雨林边界 var amazon ee.FeatureCollection(USDOS/LSIB_SIMPLE/2017) .filter(ee.Filter.eq(country_co, BR)); Map.addLayer(amazon, {}, Amazon Boundary);3. 核心代码解析从数据筛选到可视化3.1 数据过滤与质量控制GEDI02_A数据包含156个图层我们需要先进行质量筛选var qualityMask function(image) { // quality_flag1表示数据可用degrade_flag0表示无降质 return image.updateMask(image.select(quality_flag).eq(1)) .updateMask(image.select(degrade_flag).eq(0)); }; var dataset ee.ImageCollection(LARSE/GEDI/GEDI02_A_002_MONTHLY) .filterDate(2020-01-01, 2020-12-31) // 时间过滤 .filterBounds(amazon) // 空间过滤 .map(qualityMask) // 质量过滤 .select(rh98); // 选择rh98波段3.2 高度计算与可视化将多个月数据聚合并应用专业配色// 计算年度平均高度 var heightMean dataset.mean().clip(amazon); // 专业级配色方案单位米 var palette [ FF0000, FF5500, FFAA00, // 红色系0-15m灌木 FFFF00, AAFF00, 55FF00, // 黄色系15-30m中等乔木 00FF00, 00AA55, 0055AA, // 绿色系30-45m高大乔木 0000FF, 2B00AA, 550055 // 蓝色系45m超高大乔木 ]; Map.addLayer(heightMean, {min:0, max:60, palette: palette}, Vegetation Height);4. 进阶技巧让图表更专业4.1 添加比例尺与图例// 自定义图例 var legend ui.Panel({ style: { position: bottom-right, padding: 8px } }); // 图例标题 var legendTitle ui.Label({ value: 植被高度 (米), style: {fontWeight: bold} }); legend.add(legendTitle); // 颜色条带 var makeColorBarParams { color: palette, min: 0, max: 60, width: 300, height: 15 }; var colorBar ui.Thumbnail({ image: ee.Image.pixelLonLat().select(0), params: makeColorBarParams }); legend.add(colorBar); // 添加到地图 Map.add(legend);4.2 数据导出与论文应用导出GeoTIFF到Google DriveExport.image.toDrive({ image: heightMean, description: Amazon_Vegetation_Height_2020, fileNamePrefix: GEDI_rh98_Amazon, region: amazon, scale: 30, maxPixels: 1e13, fileFormat: GeoTIFF, formatOptions: { cloudOptimized: true } });常见导出问题解决maxPixels报错适当降低分辨率增大scale值空白图像检查区域边界是否有效像素值异常添加.unmask(-9999)处理无数据区域5. 实战案例全球典型区域对比分析5.1 东南亚热带雨林 vs 北美温带森林// 定义对比区域 var seAsia ee.FeatureCollection(USDOS/LSIB_SIMPLE/2017) .filter(ee.Filter.or( ee.Filter.eq(country_co, ID), // 印度尼西亚 ee.Filter.eq(country_co, MY) // 马来西亚 )); var northAmerica ee.FeatureCollection(USDOS/LSIB_SIMPLE/2017) .filter(ee.Filter.eq(country_co, US)); // 美国 // 计算区域平均高度 var calcMeanHeight function(region) { return dataset.mean().clip(region).reduceRegion({ reducer: ee.Reducer.mean(), geometry: region, scale: 1000, maxPixels: 1e9 }).get(rh98); }; print(东南亚平均高度 (m), calcMeanHeight(seAsia)); print(北美平均高度 (m), calcMeanHeight(northAmerica));典型结果对比区域平均高度(m)主要植被类型东南亚雨林32.7龙脑香科高大乔木北美温带森林18.4松柏科中等乔木5.2 时间序列分析技巧// 计算月度平均高度变化 var monthlyMeans ee.ImageCollection( ee.List.sequence(1, 12).map(function(month) { var start ee.Date(2020-01-01).advance(month-1, month); var end start.advance(1, month); return dataset.filterDate(start, end) .mean() .set(month, month); }) ); // 绘制时间序列图表 var chart ui.Chart.image.series({ imageCollection: monthlyMeans, region: amazon, reducer: ee.Reducer.mean(), scale: 1000 }).setOptions({ title: 2020年亚马逊雨林植被高度月变化, vAxis: {title: 平均高度 (m)}, hAxis: {title: 月份, ticks: [{v:1, f:1月}, /*...*/ {v:12, f:12月}]} }); print(chart);6. 避坑指南新手常见问题数据缺失问题GEDI轨道间距约600米小区域可能出现数据空白解决方案扩大时间范围或研究区域异常高值处理// 过滤异常值100m var cleaned dataset.map(function(image) { return image.updateMask(image.lte(100)); });与其它数据源对比激光雷达 vs 光学遥感GEDI测量的是物理高度NDVI反映的是植被绿度交叉验证建议结合Landsat或Sentinel-2数据性能优化技巧先小范围测试再全区域运行使用.mean()替代.mosaic()提高计算效率适当降低导出分辨率scale参数第一次成功导出亚马逊雨林高度图时我被那些深浅不一的绿色震撼到了——原来科研真的可以如此直观。记得最初测试时因为忘记加qualityMask结果图上全是噪点这个教训让我深刻理解了数据质量控制的重要性。现在每次分析新区域我的第一件事就是检查degrade_flag。