深度解析GlobFire数据集从MODIS火点到火灾斑块的GEE实战指南当你在Google Earth Engine中加载JRC/GWIS/GlobFire/v2/FinalPerimeters数据集时是否曾好奇那些看似简单的字段背后隐藏着怎样的火灾故事每个Id编号、每个日期戳记、每块面积数据都是卫星视角下地球表面燃烧的数字化印记。本文将带你穿透数据表层掌握GlobFire数据集的精髓让你不仅能调用这些数据更能真正理解它们的科学内涵和实用价值。1. GlobFire数据集的核心架构解析1.1 数据源头MCD64A1的二次加工GlobFire并非原始观测数据而是基于MODIS的MCD64A1产品经过复杂算法处理后的高级衍生数据集。这种转化过程包含三个关键步骤火点检测MCD64A1每日提供500米分辨率的活跃火点位置时空聚类通过图论算法将离散火点连接为连续火灾事件边界提取确定每个火灾事件的最终影响范围# 典型的数据加载方式 glbfire ee.FeatureCollection(JRC/GWIS/GlobFire/v2/FinalPerimeters)1.2 字段详解表字段名数据类型科学含义典型用途IdInt火灾唯一标识符事件追踪、去重areaDouble过火面积(平方米)灾害评估、碳排放估算InitialDateInt火灾起始时间(Unix时间戳)火灾季分析、驱动因子研究FinalDateInt火灾结束时间(Unix时间戳)持续时间计算、灭火效率评估注意日期字段存储的是从1970-01-01开始的毫秒数在GEE中需用ee.Date进行转换处理2. 高级查询与分析方法2.1 时间维度分析技巧利用日期字段可以开展多种时序分析以下是核心操作示例// 筛选2020年澳大利亚火灾季的数据 var ausFires glbfire.filter(ee.Filter.date(2020-01-01, 2021-01-01)) .filterBounds(ee.Geometry.Rectangle([113, -44, 154, -10])); // 计算每个火灾持续时间(天) var withDuration ausFires.map(function(feature) { var start ee.Date(feature.get(InitialDate)); var end ee.Date(feature.get(FinalDate)); var duration end.difference(start, day); return feature.set(duration_days, duration); });2.2 空间模式分析方法面积分布分析的典型流程将米²转换为公顷area_ha area / 10000分类统计小型火灾 (100 ha)中型火灾 (100-1000 ha)大型火灾 (1000 ha)// 创建面积分类 var classified ausFires.map(function(f) { var area ee.Number(f.get(area)).divide(10000); // 转为公顷 var cls ee.Algorithms.If(area.gt(1000), 大型, ee.Algorithms.If(area.gt(100), 中型, 小型)); return f.set(size_class, cls); }); // 统计各类数量 var counts classified.aggregate_histogram(size_class); print(火灾规模分类统计:, counts);3. 多数据集融合应用3.1 与气象数据关联分析将火灾数据与ERA5气象数据集结合可以探究气候因子与火灾特征的关系// 加载ERA5日数据 var era5 ee.ImageCollection(ECMWF/ERA5/DAILY); // 为每个火灾添加发生时的气象条件 var withWeather ausFires.map(function(f) { var date ee.Date(f.get(InitialDate)); var point f.geometry().centroid(); var dailyData era5.filterDate(date, date.advance(1, day)).first(); var temp dailyData.select(mean_2m_air_temperature).reduceRegion({ reducer: ee.Reducer.mean(), geometry: point, scale: 10000 }).get(mean_2m_air_temperature); return f.set(init_temp, temp); });3.2 与植被指数联合分析NDVI变化可以反映火灾对植被的影响程度// 获取火灾前后NDVI变化 var withNDVI ausFires.map(function(f) { var geom f.geometry(); var date ee.Date(f.get(FinalDate)); // 火灾前NDVI (火灾前1个月) var preNDVI ee.ImageCollection(MODIS/006/MOD13Q1) .filterDate(date.advance(-1, month), date) .mean() .select(NDVI) .reduceRegion({ reducer: ee.Reducer.mean(), geometry: geom, scale: 250 }).get(NDVI); // 火灾后NDVI (火灾后3个月) var postNDVI ee.ImageCollection(MODIS/006/MOD13Q1) .filterDate(date, date.advance(3, month)) .mean() .select(NDVI) .reduceRegion({ reducer: ee.Reducer.mean(), geometry: geom, scale: 250 }).get(NDVI); return f.set({ pre_fire_ndvi: preNDVI, post_fire_ndvi: postNDVI, ndvi_change: ee.Number(preNDVI).subtract(postNDVI) }); });4. 实战案例火灾事件追踪系统4.1 构建火灾时间线// 生成年度火灾报告 var yearReport function(year) { var yearsFires glbfire.filter(ee.Filter.date( ee.Date.fromYMD(year, 1, 1), ee.Date.fromYMD(year 1, 1, 1) )); var stats yearsFires.aggregate_stats(area); return ee.Feature(null, { year: year, fire_count: yearsFires.size(), total_area: stats.get(sum), mean_area: stats.get(mean), max_area: stats.get(max) }); }; // 生成2001-2020年时间序列 var timeSeries ee.FeatureCollection( ee.List.sequence(2001, 2020).map(yearReport) ); // 可视化年度变化趋势 var chart ui.Chart.feature.byFeature(timeSeries, year, [ fire_count, total_area, mean_area ]).setChartType(LineChart); print(chart);4.2 空间热点检测使用核密度估计方法识别火灾频发区域// 创建火灾点集 var firePoints glbfire.filter(ee.Filter.date(2010-01-01, 2021-01-01)) .map(function(f) { return f.setGeometry(f.geometry().centroid()); }); // 生成核密度图像 var density firePoints.reduceToImage({ properties: [Id], reducer: ee.Reducer.countEvery() }).convolve(ee.Kernel.gaussian(50000)); // 可视化参数 var visParams { min: 0, max: 50, palette: [blue, green, yellow, red] }; Map.addLayer(density, visParams, Fire Density 2010-2020);在实际项目中我发现最容易被忽视但极其关键的一点是InitialDate和FinalDate的时间精度问题。由于MODIS的观测频率限制这两个时间戳可能无法精确到小时级别在进行精细时间分析时需要特别注意这个限制。