
简介一份基于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_countsTrue)) break代码先通过GetSubDatasets()列出 MOD14 中的所有科学数据集匹配名称中包含FireMask的子数据集再读取成 NumPy 数组。np.unique的统计结果可以直接看到 DN 值为 7、8、9 的像元数量这些就是需要进一步定位和过滤的候选火点。注意 GDAL 读取时如果缺少 HDF4 驱动要先安装gdal的 HDF4 相关依赖否则Open会返回空对象。3. 基于 MOD03 构建 GLT 完成地理定位3.1 为什么不能用简单投影替代 GLTL2 级栅格产品如果自带等经纬度投影可以用常规重投影工具处理但 MOD14 是条带数据每个扫描行对应的地面位置不落在统一网格上。直接把它当作普通 GeoTIFF 去转投影会出现像元位置偏移尤其在扫描边缘。正确做法是利用 MOD03 提供的每像元经纬度构建地理查找表GLTGLT 记录的是输出等矩形网格上每个像元对应到输入条带数据的行列号这一步相当于把不规则采样重采样到规则网格。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 的Latitude和Longitude科学数据集再读取 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 中我通常按以下顺序处理将地理定位得到的火点 CSV 通过Add XY Data添加为矢量点坐标系统选择 WGS84。用Export Data将矢量点导出为 shapefile并投影到与土地利用数据一致的坐标系例如 CGCS2000 / UTM zone 50N。加载京津冀土地利用栅格使用Extract Multi Values to Points工具把每个火点所在像元的土地利用类型提取到点属性表。打开属性表筛选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, geometrygeometry, crsEPSG: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, predicatewithin, howinner) print(joined[[lon, lat]])predicatewithin表示点必须完全落在农业用地多边形内部相比intersects更严格能去掉落在边界上的不确定点。howinner只保留连接成功的记录这样输出的每一行都对应一个秸秆焚烧火点。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(namecount) 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 的流程虽然不能替代地面实测但足以支撑月度级秸秆焚烧火点的时空分布评价对于评估禁烧政策、规划应急巡查路线都是低成本且可重复的解决方案。本文还有配套的精品资源点击获取