ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

GEE处理GEDI L4A森林地上生物量数据全流程

GEE处理GEDI L4A森林地上生物量数据全流程 最近有人问我国外那些高分辨率生物量产品到底怎么落到自己研究区里。我建议大部分情况直接走GEE别一上来就手动下载上百个HDF5文件。GEE上托管了GEDI L4A数据做森林地上生物量估算时你可以直接在云端完成区域筛选、质量过滤、点数据提取和CSV导出。这篇文章就把我基于GEE处理GEDI L4A数据的完整流程写出来包含可复现代码、参数取舍经验以及我用这几个月踩出来的坑。适合正在做碳储量、森林结构或者激光雷达地面验证的同学参考。1. 先搞清楚GEDI L4A到底给的是什么东西1.1 从激光雷达到地上生物量密度很多人第一次接触GEDI被产品分级的名字绕晕L1是回波波形L2是冠层高度和覆盖度L4A是足印尺度的地上生物量密度L4B是在L4A基础上插值生成的连续网格产品。我们做森林地上生物量估算真正能跟实地样地做匹配的就是L4A。L4A输出的核心变量是AGBDAbove Ground Biomass Density单位Mg/ha也就是每公顷多少吨干生物量直观理解就是一公顷林地上所有站立的树、枝、叶加在一起烘干后的质量。GEDI用全波形激光雷达测树冠到地面的距离结构再通过机器学习模型把这种结构特征换算成生物量所以它不像光学影像那样受云和阴影干扰对冠层高度的响应非常直接。一个GEDI足印的地面直径大约是25米左右相邻足印沿轨道方向间隔60米沿轨方向连续采样但垂直轨道方向却有很大空隙。也就是说数据集并不是像Landsat那样把一个方格铺满整个地表而是“一条一条、一串一串”的采样点。这个特点决定了后续数据处理方式要么按足印点提取属性要么聚合到网格做区域统计不能指望它像影像栅格一样天然规则。1.2 处理GEDI L4A的常见路线处理GEDI L4A数据存在两条主线。第一条直接在GEE上读取ImageCollection用JavaScript或Python API在线筛选、统计、导出。优势是全流程托管在云端不需要下载、配环境几分钟就能拿到区域统计表。第二条是到LP DAAC或EarthData Search下载原始HDF5文件在本地用Python的h5py或xarray读取做足印级几何处理。我自己处理区域级项目时用GEE更多原因很实际小范围研究区往往只需要几千个有效足印在GEE里用filterBounds加质量过滤再导出点表整个过程一气呵成如果本地读HDF5先要解析每个文件的经纬度、AGBD和质量标志还要自己拼接轨道效率差一个数量级。两条路线的取舍可以用下面这个表说明对比项GEE在线处理本地HDF5处理数据准备免下载直接调云端目录需要下载并解压多个h5文件质量过滤支持property级过滤一行代码完成需要自己读l4a_quality_flag字段空间统计内置reduceRegions和网格聚合需要配合GeoPandas手动处理批量处理支持Export任务后台跑需要自己写并行逻辑精细控制受GEE内置字段限制可读取原始波形并作二次建模适合场景区域统计、快速出表、初步探索学术研究、足印级精细建模如果你需要读取原始波形或重训模型就走本地HDF5路线如果目标是森林地上生物量估算的区域报告GEE路线是性价比最高的选择。2. 在GEE里加载GEDI L4A三步调出想要的数据2.1 数据资产ID与最基本的加载语法打开GEE Code Editor输入下面的代码就能看到研究区内的GEDI L4A数据var region ee.Geometry.Rectangle([110.2, 25.4, 110.8, 26.0]); var gediAll ee.ImageCollection(NASA/GEDI/L4A_2_Mg_Nadir) .filterBounds(region) .filterDate(2019-04-18, 2023-01-01); print(gediAll.size()); Map.centerObject(region, 10); Map.addLayer(gediAll.select(agbd), {min: 0, max: 300, palette: [blue, green, yellow, red]}, GEDI L4A AGBD);资产ID里那个“2_Mg”指的就是以Mg/ha为单位的AGBDNadir表示只看星下点观测。GEE上目前托管的是V2.1版本发布日期较新字段和官方HDF5基本一致。filterBounds和filterDate是最常用的两个过滤器前者把数据限定到研究范围后者限定到GEDI正常运行的时间窗口。这里有个很重要的点GEDI从2019年4月底开始观测到2023年初以后由于任务安排有效观测出现中断。处理森林地上生物量时间序列时务必先确认你的研究时间是否落在可用数据范围内。2.2 质量筛选怎么选才合理GEDI L4A自带好几个质量字段用错一个就可能让结果毫无意义。常用筛选条件组合是var gediFiltered gediAll .filter(l4a_quality_flag 1) .filter(degrade_flag 0) .filter(sensitivity 0.95); print(Filtered footprints:, gediFiltered.size());l4a_quality_flag等于1表示该足印的AGBD估算是有效且未被算法剔除的优先级最高。degrade_flag表示卫星指向模式是否退化指向模式退化时数据几何精度下降用0表示正常观测。sensitivity是卫星对地物的敏感度一个介于0和1之间的值表示波束穿透冠层到达地面并有效测量的置信度。很多人直接把sensitivity硬设成0.95这在郁闭度高的热带雨林会导致样本量骤减。我的习惯是先看0.9和0.95两档的结果差异如果样本量变化不大就坚持0.95如果从几千个点变成几百个点就降到0.9并检查筛选后数据是否均匀覆盖研究区。森林地上生物量估算更看重样本代表性而不是单纯追求敏感度上限。关于筛选字段的参考值可以按下面的参数卡片理解字段推荐值作用注意事项l4a_quality_flag1排除质量和算法异常必选但不代表几何完全可靠degrade_flag0排除卫星指向退化数据可在大面积平坦区放宽sensitivity0.9-0.95控制波形穿透冠层能力郁闭林取0.95稀疏林可放宽到0.8geolocation-点位几何精度GEE中不算常用3. 把足印点变成能用的区域统计和文件3.1 从ImageCollection提取点表我在项目里最常用的操作就是把GEDI的每个足印转成一个点要素属性带出AGBD和标准误差然后导出为CSV到Google Drive。这样后续可以在Python里做随机森林、验证或画散点图不依赖GEE也能继续分析。转换代码思路是这样var gediFC gediFiltered.map(function(img) { return ee.Feature(img.geometry()).set({ agbd: img.get(agbd), agbd_se: img.get(agbd_se), sensitivity: img.get(sensitivity), shot_number: img.get(shot_number), time_start: img.get(system:time_start) }); }); var gediPoints gediFC.flatten(); print(Point FeatureCollection size:, gediPoints.size()); print(gediPoints.first());注意这里必须在map之后调用flatten因为ImageCollection的map返回的是每个足印一个Feature组成的嵌套集合。少了这一步导出的CSV会是空或结构异常。如果要到Drive里用Export.table.toDriveExport.table.toDrive({ collection: gediPoints, description: AGBD_Points_for_Region, folder: GEE_AGB_Exports, fileNamePrefix: AGBD_region_0257, fileFormat: CSV });等任务跑完你拿到的CSV每一行就是一个25米直径足印带着AGBD和配套的误差值。我个人喜欢把时间戳统一格式化和抽出来方便后面做时间序列分析。3.2 区域网格统计与栅格化大多数场景并不需要每个足印单独存在而是想把脚印聚合成一个森林地上生物量专题图或统计表。这时候用覆盖网格聚合最合适。我用coveringGrid生成0.05度研究区网格然后对每个网格单元内的足印AGBD做平均和数量统计var grid region.coveringGrid({ projection: ee.Projection(EPSG:4326).scale(0.05, 0.05), scale: 5000 }); var gridStats grid.map(function(cell) { var cellPts gediPoints.filterBounds(cell.geometry()); var reduce cellPts.reduceColumns({ reducer: ee.Reducer.mean().combine(ee.Reducer.count(), null, true), selectors: [agbd] }); return ee.Feature(cell.geometry(), reduce); }); Export.table.toDrive({ collection: gridStats, description: AGBD_GridStats, fileFormat: CSV });reduceColumns返回的是一个字典字段名会自动变成‘mean’和‘count’导出的CSV里就是每个0.05度格网的平均生物量和有效足印数。这样既能有区域内的空间分布概貌又能知道每个格子的样本量是否可靠。样本量小于10的网格统计值参考意义不大在出图时最好单独标记。如果非要做成栅格可以用reduceToImage把足印点的AGBD距离权重插值到规则网格但一定要清楚GEDI本身是非规则采样直接插值会在大空隙处产生虚假连续面。只要没把握就优先用网格统计表而不是做栅格。4. 常见问题与排查技巧实录4.1 为什么研究区里几乎没有GEDI点新手最常见的困惑是代码没问题但点了两下后发现集合是空的。先别怀疑代码先去查看一下研究区位置。GEDI只能观测到纬度北纬51.6度到南纬51.6度之间高纬度地区完全没有数据。第二个可能是日期范围太窄GEDI不是每天都能覆盖同一地区它依靠国际空间站轨道周期性扫描一个季度内同一地方可能只出现几次。最后再看轨道覆盖缝GEDI的平行轨道间距在地表有几公里到几十公里如果你的研究区正好落在两条轨道之间确实是空白。处理办法是用print(gediAll.size())看原始加载量再一层层加上filterBounds、filterDate逐步定位是哪个过滤条件把数据筛没了。这是排查GEE集合类问题的最快方法。4.2 质量筛选过严导致样本不足某个研究区原始点有5000个加了l4a_quality_flag和sensitivity后就剩200个这种情形很常见。优先检查sensitivity把它从0.95调到0.9往往能恢复一半以上的样本量。退化标志degrade_flag在平原地区影响很小但山地会影响几何精度最好在山区保持0。同时注意样本量不足时不要硬凑可以用GEDI L4B网格产品做补充对照或者在采样设计里增加研究区范围。森林地上生物量估算结果需要稳定性和可重复性不能为了凑点而牺牲数据质量。4.3 导出任务超时或文件过大研究区大或者足印密集时Export任务可能报“tile size too large”之类的错。解决办法是给reduceRegions或导出任务加上tileScale参数比如tileScale: 4或tileScale: 8让计算分块进行。还可以把大区域拆成4个或6个子区域分别导出最后在本地合并CSV。这是GEE处理高密度点数据的常见套路。如果导出的CSV很大建议直接用GPKG或GeoJSON格式然后在QGIS里打开。CSV对点属性和经纬度支持很友好但会丢失空间参考信息很多初学者在ArcGIS里加载CSV后发现点跑到非洲去了就是因为没有指定WGS84坐标。4.4 HDF5本地下载的高频坑如果你仍然想下载官方HDF5需要记住GEDI L4A文件名类似GEDI04_A_202xxxxxxx.h5里面主要的AGBD路径是/AGBD经纬度在/lat_lowestmode和/lon_lowestmode。质量标志要单独读/l4a_quality_flag这个很容易被忽略。很多人在本地用matplotlib画点时发现点分布成网格状其实是经纬度数组里有很多填充值通常为-9999或者65535必须先掩膜再坐标匹配。本地处理的优势是可以逐足印读取更多细节字段但代价是你需要处理文件分块、轨道编号和坐标系对齐调试成本比GEE高一个量级。做一个区域级森林地上生物量调查除非是建模需要我不推荐折腾本地HDF5。5. 一点个人经验做森林地上生物量估算这件事数据量不是关键数据尺度和质量标志的合理筛选才是。我在实际项目中会先导出所有位置和质量字段先做一次勘探性分析画出AGBD直方图和空间分布确认没有异常集群后再进入正式建模。GEDI L4A在一个5公里见方的区域里通常只有几十到几百个有效足印但每个足印代表25米直径的真实森林结构信息密度远高于光学影像的一个像元所以拿着这些点去校正光学模型是当前森林碳汇估算的一条极其实用的路线。最后再多提一句导出前一定要在Inspector里看清研究区的投影和边界很多人导出的点集跟底图对不上多半是Geometry坐标系没统一这是GEE里最常见也最不容易察觉的小毛病。
返回列表