MODIS遥感监测秸秆焚烧火点:从GLT定位到时空分析
2026/9/19 14:11:44 网站建设 项目流程

简介:一份基于MODIS数据的京津冀秸秆焚烧火点监测与分析研究报告,面向遥感、环境科学及农业管理等方向的研究人员与学生,用于掌握卫星遥感火点监测方法及区域秸秆焚烧时空规律。文档以2017—2018年MOD14与MOD03数据为源,结合土地覆盖类型提取农业用地火点,系统介绍数据预处理、地理定位、火点提取和叠置分析流程。研究显示,火点集中分布于河北中南部保定、石家庄、邢台、衡水等地,集中出现在春秋两季并呈双峰波动;2018年火点显著少于2017年,反映禁烧措施见效。报告结构完整,涵盖摘要、研究区概况、数据源与研究方法、结果分析和参考文献等模块,既可作为论文写作范例,也可为同类火点监测研究提供方法参考。资源仅1个docx文档,压缩包约16KB,内容精炼,便于直接阅读与引用。已有181人学习下载,对开展秸秆焚烧监测、环保政策评估或类似区域研究具有参考价值。

1. 从人工巡检到 MODIS 火点像元:秸秆焚烧监测的遥感解法

华北平原的空气质量恶化经常以某个秋收时节的连片烟雾为开端,靠人力去田间巡查,既赶不上火点蔓延速度,也覆盖不了京津冀二十多万平方公里的核心农区。MODIS 传感器随 TERRA 和 AQUA 卫星每日多次过境,其 4μm 中红外通道对 500—700K 的高温热源异常敏感,配合 MOD14 热异常产品与 MOD03 定位文件,可以把疑似火点像元从每平方公里一个的网格里挑出来。这套流程的关键不是"能看图上的红点",而是通过地理定位、土地覆盖类型过滤和时序统计,回答"火点在哪里、集中发生在什么季节、禁烧政策有没有见效"。我常把这套处理链路拆成数据选型、GLT 定位、地类过滤、时序对比四个步骤,下面按真实作业顺序展开。

2. MODIS 数据选型与火点识别原理

2.1 从 AVHRR 到 MODIS:探火通道的取舍

早年的 NOAA 系列卫星搭载 AVHRR 传感器,其 3.7μm 通道能够感知高温目标,但亮温上限较低,在草原火、秸秆焚烧这种大面积高温场景下极易饱和,饱和后像元的辐射值不再随温度变化,火点边缘也会因为扫描角度发生畸变。MODIS 在设计时专门针对火灾监测做了优化,保留了 4μm 和 11μm 两个关键通道,动态范围更宽,能够区分从常温背景到 500K 以上火焰的不同辐射水平。更重要的是,MODIS 提供 1km 空间分辨率的逐像元定位数据,这为后续把火点精确覆盖到行政区划和土地利用分类创造了条件。

2.2 MOD14 与 MOD03 的分工

MOD14 是 MODIS 2 级地面热异常产品,包含火点掩膜、亮度温度、反射率、火点像素计数等科学数据集;MOD03 是地理定位文件,提供每个 1km 像元的经度、纬度、太阳天顶角、卫星天顶角等信息。两者必须组合使用:MOD14 负责"哪里有火",MOD03 负责"火在哪里"。单纯使用 MOD14 的默认地理参考不够准确,因为MODIS 条带数据(Swath)是逐扫描行存储的,像元在地球表面的位置随卫星姿态变化,必须用同一时相的 MOD03 经纬度网格做地理定位。

数据产品级别核心内容在本流程中的作用
MOD142 级火点掩膜、亮温、云掩膜提供像元级火点标记与置信度 DN 值
MOD031B 级逐像元经纬度、几何角度构建 GLT,对 MOD14 进行地理编码

在实际下载时,要注意 MOD14 和 MOD03 的轨道号与时间标记一致。例如MOD14.A2017171.0000.061对应的 MOD03 文件名中应有相同的日期和时刻前缀,否则定位网格与热异常数据来自不同过境,结果会错位。

2.3 维恩位移定律决定波段选择

维恩位移定律的表达式为 λmax = b / T,其中 b 约等于 2898μm·K。常温地表温度约 300K 时,辐射峰值波长在 9.7μm 附近,而秸秆焚烧的火焰温度通常在 500—700K 之间,对应的辐射峰值波长落在 4.1—5.8μm 区间。MODIS 的 4μm 通道正好覆盖这一窗口。温度微小的上升会引起该波段辐射通量急剧增大,这种非线性响应使高温像元在中红外影像上表现得异常明亮,从而可以从常温背景中分离出来。在数据处理时,我一般先看 MOD14 的 fire mask 子数据集,而不是直接分析原始辐射值,因为前者已经集成了上下文火点检测算法,规避了单阈值判断在太阳耀斑、城市热岛上的误报。

2.4 读取 MOD14 火点掩膜:Python 示例

HDF 格式的 MOD14 可以用 GDAL 直接访问子数据集。下面这段代码读取指定 MOD14 文件中的 FireMask 科学数据集:

from osgeo import gdal mod14_file = "MOD14.A2017171.0000.061.2017171040000.hdf" ds = gdal.Open(mod14_file) sub_datasets = ds.GetSubDatasets() for i, (desc, meta) in enumerate(sub_datasets): if "FireMask" in desc: fire_ds = gdal.Open(desc) fire_array = fire_ds.ReadAsArray() print("FireMask shape:", fire_array.shape) print("DN value counts:", np.unique(fire_array, return_counts=True)) break

代码先通过GetSubDatasets()列出 MOD14 中的所有科学数据集,匹配名称中包含FireMask的子数据集,再读取成 NumPy 数组。np.unique的统计结果可以直接看到 DN 值为 7、8、9 的像元数量,这些就是需要进一步定位和过滤的候选火点。注意 GDAL 读取时如果缺少 HDF4 驱动,要先安装gdal的 HDF4 相关依赖,否则Open会返回空对象。

3. 基于 MOD03 构建 GLT 完成地理定位

3.1 为什么不能用简单投影替代 GLT

L2 级栅格产品如果自带等经纬度投影,可以用常规重投影工具处理,但 MOD14 是条带数据,每个扫描行对应的地面位置不落在统一网格上。直接把它当作普通 GeoTIFF 去转投影,会出现像元位置偏移,尤其在扫描边缘。正确做法是利用 MOD03 提供的每像元经纬度构建地理查找表(GLT),GLT 记录的是输出等矩形网格上每个像元对应到输入条带数据的行列号,这一步相当于把不规则采样重采样到规则网格。

3.2 ENVI 中的 Georeference MODIS 操作

在 ENVI 中打开 MOD14 后,选择Georeference模块的MODIS工具,输入文件指定 MOD14,定位文件指定同一时刻的 MOD03,投影参数选择经纬度 WGS84。工具会自动生成 GLT 文件并应用,输出结果是一个带地理坐标的 tif 文件。操作中我一般注意两点:一是投影建议统一用 Geographic Lat/Lon WGS84,后续在 ArcGIS 中叠加载土地利用数据时再转投影;二是 GLT 生成过程中会重采样,默认最近邻法对火点离散像元更合适,双线性插值会把非火点像元混入边界。

3.3 用 Python 完成 MOD14 的 GLT 地理编码

如果不想依赖 ENVI,可以用 pyhdf 库直接读取 MOD03 中的经纬度数组,再结合 GDAL 将火点像元坐标写入矢量点。这里给出一个简化的坐标提取流程:

from pyhdf.SD import SD, SDC mod03 = SD("MOD03.A2017171.0000.061.2017171040000.hdf", SDC.READ) lat = mod03.select("Latitude").get() lon = mod03.select("Longitude").get() mod14 = SD("MOD14.A2017171.0000.061.2017171040000.hdf", SDC.READ) fire = mod14.select("FireMask").get() # 假设 lat/lon 与 fire 的尺寸匹配(1km 产品),直接掩膜 mask = (fire >= 7) & (fire <= 9) rows, cols = np.where(mask) with open("fire_points.csv", "w") as f: f.write("lon,lat\n") for r, c in zip(rows, cols): f.write(f"{lon[r, c]},{lat[r, c]}\n")

代码先读取 MOD03 的LatitudeLongitude科学数据集,再读取 MOD14 的FireMask,通过布尔索引得到 DN 7—9 像元的行列号,最后按行列号索引经纬度数组并写出 CSV。需要注意 pyhdf 读出的数组是 HDF 标准存储顺序,如果 MOD14 的 FireMask 分辨率与 MOD03 的 1km 经纬度网格不一致(某些版本 MOD03 有 1km 和 10km 两种经纬度),要选取与 MOD14 匹配的那一个子集,否则行列对应关系会错位。

3.4 定位精度检查

地理定位完成后,把火点 CSV 加载到 ArcGIS 或 QGIS,叠加行政区划边界,检查火点是否落在农田区而非边界外。若火点整体偏移,优先怀疑 MOD03 与 MOD14 时相不匹配,或者 GLT 生成时输入文件顺序颠倒。我一般还会用一些已知地物做目视验证,比如河流弯曲处或城市道路交叉点附近不应出现大量错位火点。

4. 叠加土地利用数据提取秸秆焚烧火点

4.1 地类分类与过滤逻辑

京津冀的土地覆盖类型通常来自 GlobeLand30 或地方国土部门数据。研究中把地物分为六类:裸地、建筑用地、农业用地、林地、草地和水体。秸秆焚烧火点的定义是发生在农业用地上的火点,因为在林地和草地上出现的火点更可能是森林火灾或荒草火,建筑用地和水体上的热异常则可能是工厂烟囱或太阳耀斑干扰。过滤逻辑很简单:先提取所有 MOD14 火点,然后与土地利用图层叠加,只保留落在农业用地多边形内部的点。

4.2 空间叠置分析:ArcGIS 操作步骤

在 ArcGIS 10.1 中,我通常按以下顺序处理:

  1. 将地理定位得到的火点 CSV 通过Add XY Data添加为矢量点,坐标系统选择 WGS84。
  2. Export Data将矢量点导出为 shapefile,并投影到与土地利用数据一致的坐标系,例如 CGCS2000 / UTM zone 50N。
  3. 加载京津冀土地利用栅格,使用Extract Multi Values to Points工具把每个火点所在像元的土地利用类型提取到点属性表。
  4. 打开属性表,筛选VALUE或类型字段为农业用地的记录,导出为秸秆焚烧火点要素类。

这个过程中最容易被忽略的是投影转换。土地利用数据如果是栅格且未定义投影,Extract Multi Values to Points会直接报错或提取错误位置,所以必须先在工具中确认两个图层的投影一致。

4.3 用 Python 实现点面叠加

如果处理周期较长、火点数量上千,我会改用 geopandas 做空间连接,速度快且可重复。示例代码如下:

import pandas as pd import geopandas as gpd from shapely.geometry import Point # 读取火点 CSV fire_df = pd.read_csv("fire_points.csv") geometry = [Point(lon, lat) for lon, lat in zip(fire_df["lon"], fire_df["lat"])] fire_gdf = gpd.GeoDataFrame(fire_df, geometry=geometry, crs="EPSG:4326") # 读取土地利用 shapefile,并转为与火点一致的坐标系 land_gdf = gpd.read_file("taihang_landuse.shp") land_gdf = land_gdf.to_crs("EPSG:4326") # 只保留农业用地 agri_gdf = land_gdf[land_gdf["class"] == "农业用地"] # 空间连接,within 确保点落在面内 joined = gpd.sjoin(fire_gdf, agri_gdf, predicate="within", how="inner") print(joined[["lon", "lat"]])

predicate="within"表示点必须完全落在农业用地多边形内部,相比intersects更严格,能去掉落在边界上的不确定点。how="inner"只保留连接成功的记录,这样输出的每一行都对应一个秸秆焚烧火点。

4.4 火点 DN 值与置信度的对应

MODIS MOD14 的 FireMask 中,DN 值决定了可以用多激进的方式提取火点。原数据说明中一般将 DN 分类如下:

DN 值含义建议处理
0—6非火点或低置信度丢弃
7中等置信度火点可保留,结合土地类型确认
8高置信度火点保留
9高置信度火点保留
其他云、水、未处理丢弃

在结果分析时,如果只想降低误报,可以把阈值提高到 8 或 9,只保留高置信度火点;如果希望不漏报,则保留 7、8、9。本研究统计结果中 2017 年 192 个火点、2018 年 47 个火点,正是基于 7—9 全量提取后经农业用地过滤得到的数量。

5. 京津冀火点时空分布规律与统计对比

5.1 月度序列统计

提取出秸秆焚烧火点后,接下来要分析时间维度。把火点导出为包含日期字段的 CSV,然后用 Python 分组统计:

import pandas as pd joined["date"] = pd.to_datetime(joined["date"]) joined["year"] = joined["date"].dt.year joined["month"] = joined["date"].dt.month monthly = joined.groupby(["year", "month"]).size().reset_index(name="count") print(monthly)

分组统计后得到每个年月的火点个数,从而画出 2017 年与 2018 年的双周期曲线。实际操作中会发现有些月份完全没有 MOD14 过境数据,或者数据被云覆盖,这些月份应标记为"无有效监测",而不是"零火点",否则统计结果会误导后续分析。

5.2 空间集中区域

统计结果表明,京津冀秸秆焚烧火点主要集中在河北省中南部的保定、石家庄、邢台和衡水四个城市。这些区域地势平缓,是华北平原主要的粮食产区,夏收和秋收后秸秆产生量大。北京和天津的火点数量相对少,一方面因为城市化程度高、农业用地占比低,另一方面也说明禁烧政策在这些区域执行得更严格。火点分布可以用密度分析进一步细化,例如在 ArcGIS 中使用Kernel Density工具,网格大小设为 1km,搜索半径设 10km,可以清晰看到火点高密度区沿京广铁路两侧分布。

5.3 年度对比与季节双峰

对 2017 和 2018 两年的火点按季节汇总,得到的结果反映了明显的双峰结构:

项目2017 年2018 年
总火点个数19247
春季(3—5 月)429
夏季(6—8 月)11815
秋季(9—11 月)2821
冬季(12—2 月)42

夏季高峰对应 6 月夏收期冬小麦秸秆的集中焚烧,秋季高峰对应 10 月秋收期玉米秸秆的清理。两年的双峰波动形态一致,但 2018 年峰值高度明显下降,说明禁烧工作的日常巡查和宣传见到了效果。同时需要注意,2018 年秋季的火点个数(21 个)与春季(9 个)相比降幅较小,这意味着秋收季的监管力度仍有补强空间。上述数字属于基于样本的统计对比,如果数据覆盖完整,还可以进一步做逐月的等效过境次数归一化,消除卫星观测次数不均的影响。

6. 复现这条链路的几个实用技巧

做这套监测分析时,最容易出问题的地方不是算法本身,而是数据预处理环节的一些细节。第一个技巧是核对 TERRA 和 AQUA 卫星的过境时间。TERRA 大约在北京时间上午 10:30 左右过境,AQUA 在下午 13:30 左右,秸秆焚烧往往发生在午后到傍晚,所以 AQUA 数据通常包含更多火点。如果没有特别说明,建议把同一日期的 TERRA 与 AQUA 火点合并,减少漏检。第二个技巧是云遮挡过滤。MOD14 自带云掩膜信息,但直接读取 FireMask 时不直观,可以在代码中把 DN 值为云层的像元单独标记出来,统计时注明"受云影响的区域占比",避免把被云覆盖的火点误判为不存在。第三个技巧是去除火点长条状伪迹。MODIS 扫描边缘的像元会被拉伸,单像元火点可能被拆成多个,可以在提取后按距离合并相邻 1km 以内的火点,避免同一个焚烧点被重复计数。第四个技巧是置信度阈值调整。如果研究区包含较多工业区,把 DN 阈值从 7 提到 8 能显著减少工厂热异常的干扰;如果是草地和林地较多的山区,则建议保留 7,因为林火的早期火点温度偏低。

最后一个实用做法是输出检查结果时生成一张叠加图:底图用高分辨率遥感影像或土地利用分类图,火点点位用不同颜色区分年份。这张图既方便自己检查定位是否正确,也能直接放进报告材料。我通常用 Matplotlib 的 basemap 或用 QGIS 的 Print Layout 输出,坐标网络设置为 0.5 度间隔,图例标注清楚。这套基于 MODIS 的流程虽然不能替代地面实测,但足以支撑月度级秸秆焚烧火点的时空分布评价,对于评估禁烧政策、规划应急巡查路线,都是低成本且可重复的解决方案。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询