从站点到影像:基于XGBoost的遥感地表温度(LST)智能反演实战(附完整代码与数据集)

张开发
2026/4/17 2:53:35 15 分钟阅读

分享文章

从站点到影像:基于XGBoost的遥感地表温度(LST)智能反演实战(附完整代码与数据集)
1. 为什么需要从站点数据反演地表温度地表温度Land Surface Temperature, LST是研究城市热岛效应、农业干旱监测、气候变化等领域的关键参数。传统获取方式主要依赖气象站点观测但站点数据存在明显局限性——它们只能代表单个点的温度情况无法反映周边区域的空间差异。想象一下就像用几个温度计测量整个城市的温度分布显然会遗漏大量细节。而遥感技术提供了大面积同步观测的能力一颗Landsat卫星单次过境就能覆盖185km×185km的范围。但问题在于卫星传感器测量的是地表辐射亮度温度需要通过复杂的反演算法才能转化为真实地表温度。这就是为什么我们需要将站点实测数据与遥感影像结合——用站点数据作为真值来校准和训练模型最终实现从点到面的温度分布预测。我曾在长三角地区做过一个城市热岛项目当时用了12个气象站数据配合Landsat影像。实测发现单纯用物理模型反演的LST在城区误差能达到3-5℃而引入XGBoost机器学习方法后误差缩小到了1.5℃以内。这个改进对识别热岛核心区特别关键。2. 环境配置与数据准备2.1 Python环境快速搭建推荐使用Miniconda管理Python环境它比Anaconda更轻量。以下是具体步骤# 下载Miniconda安装包Python3.9版本 wget https://repo.anaconda.com/miniconda/Miniconda3-py39_4.12.0-Linux-x86_64.sh # 安装一路回车选择默认选项 bash Miniconda3-py39_4.12.0-Linux-x86_64.sh # 创建专用环境 conda create -n lst_xgboost python3.9 # 激活环境并安装必要库 conda activate lst_xgboost pip install xgboost scikit-learn gdal pandas matplotlib遇到过的一个坑是GDAL的安装如果conda安装失败可以尝试conda install -c conda-forge gdal2.2 数据获取与预处理需要准备两种核心数据站点数据包含经纬度坐标和温度记录的CSV文件Landsat影像建议使用USGS官网或地理空间数据云下载以Landsat 8为例关键波段包括波段2-7地表反射率波段10-11热红外波段原始亮度温度import pandas as pd from osgeo import gdal # 读取站点数据 stations pd.read_csv(ground_stations.csv) print(stations.head()) # 读取Landsat影像 ds gdal.Open(LC08_L2SP_119038_20230120_20230131_02_T1.tif) bands [ds.GetRasterBand(i).ReadAsArray() for i in range(1, 8)]重要检查点确保站点坐标系统与影像一致通常为WGS84 UTM检查影像是否有云覆盖云量10%为佳记录站点观测时间与卫星过境时间的匹配度最好在±1小时内3. 特征工程与空间匹配3.1 光谱特征提取将站点坐标与影像像元位置匹配提取对应位置的波段值import numpy as np from pyproj import Proj, transform # 坐标转换示例WGS84转影像像素坐标 utm_proj Proj(projutm, zone51, ellpsWGS84) x, y transform(Proj(epsg:4326), utm_proj, stations[lon].values, stations[lat].values) # 获取像素位置 geo_transform ds.GetGeoTransform() pixel_x ((x - geo_transform[0]) / geo_transform[1]).astype(int) pixel_y ((y - geo_transform[3]) / geo_transform[5]).astype(int) # 提取波段值 for i, band in enumerate(bands): stations[fb{i1}] band[pixel_y, pixel_x]3.2 衍生特征构建除了原始波段可以加入这些特征提升模型表现NDVI归一化植被指数(b5 - b4)/(b5 b4)NDBI建筑指数(b6 - b5)/(b6 b5)波段比值如b5/b7等stations[NDVI] (stations[b5] - stations[b4]) / (stations[b5] stations[b4]) stations[NDBI] (stations[b6] - stations[b5]) / (stations[b6] stations[b5])实测发现加入NDVI后模型R²提升了约0.15因为植被覆盖与地表温度有强相关性。4. XGBoost模型构建与优化4.1 基础模型搭建import xgboost as xgb from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler # 准备特征和标签 X stations[[b1,b2,b3,b4,b5,b6,b7,NDVI,NDBI]] y stations[LST] # 数据标准化 scaler StandardScaler() X_scaled scaler.fit_transform(X) # 划分训练测试集 X_train, X_test, y_train, y_test train_test_split( X_scaled, y, test_size0.2, random_state42) # 初始化模型 model xgb.XGBRegressor( objectivereg:squarederror, n_estimators100, max_depth5, learning_rate0.1 ) # 训练 model.fit(X_train, y_train)4.2 超参数调优使用网格搜索寻找最优参数组合from sklearn.model_selection import GridSearchCV param_grid { max_depth: [3, 5, 7], min_child_weight: [1, 3, 5], subsample: [0.6, 0.8, 1.0], colsample_bytree: [0.6, 0.8, 1.0] } grid_search GridSearchCV( estimatormodel, param_gridparam_grid, cv5, scoringneg_mean_squared_error ) grid_search.fit(X_train, y_train) print(最佳参数:, grid_search.best_params_)调参时发现这些经验规律max_depth过大容易过拟合7时测试集误差上升subsample0.8通常比1.0表现更好加入early_stopping_rounds可以防止过拟合4.3 模型评估指标除了常见的R²和RMSE推荐关注这些指标平均绝对误差MAE更鲁棒的温度误差评估偏差Bias系统性的高估或低估空间自相关分析检查预测残差的空间分布模式from sklearn.metrics import mean_absolute_error, mean_squared_error y_pred model.predict(X_test) print(fMAE: {mean_absolute_error(y_test, y_pred):.2f}℃) print(fRMSE: {np.sqrt(mean_squared_error(y_test, y_pred)):.2f}℃)5. 全影像预测与结果可视化5.1 整景影像预测# 读取整景影像 img_data np.array([band.ReadAsArray() for band in ds.GetRasterBand(i) for i in range(1, 8)]) rows, cols img_data.shape[1], img_data.shape[2] # 重塑为(像素数, 波段数) img_flat img_data.reshape(7, -1).T # 添加衍生特征 ndvi (img_flat[:,4] - img_flat[:,3]) / (img_flat[:,4] img_flat[:,3] 1e-10) ndbi (img_flat[:,5] - img_flat[:,4]) / (img_flat[:,5] img_flat[:,4] 1e-10) features np.column_stack([img_flat, ndvi, ndbi]) # 标准化 features_scaled scaler.transform(features) # 预测 lst_pred model.predict(features_scaled) lst_map lst_pred.reshape(rows, cols)5.2 结果后处理常见处理步骤掩膜处理去除水体、云区等温度单位转换如Kelvin转Celsius异常值过滤如±3σ之外的值# 示例温度值裁剪 lst_map np.clip(lst_map, np.percentile(lst_map, 1), np.percentile(lst_map, 99)) # 保存结果 driver gdal.GetDriverByName(GTiff) out_ds driver.Create(lst_prediction.tif, cols, rows, 1, gdal.GDT_Float32) out_ds.SetGeoTransform(ds.GetGeoTransform()) out_ds.SetProjection(ds.GetProjection()) out_ds.GetRasterBand(1).WriteArray(lst_map) out_ds None5.3 可视化技巧使用matplotlib绘制专业温度分布图import matplotlib.pyplot as plt plt.figure(figsize(12,8)) im plt.imshow(lst_map, cmapjet, vmin10, vmax40) plt.colorbar(im, labelTemperature (°C)) plt.title(Land Surface Temperature Prediction) plt.axis(off) plt.savefig(lst_distribution.png, dpi300, bbox_inchestight)建议使用jet或coolwarm色带并固定色标范围便于不同影像对比。在城市热岛分析中可以叠加行政区划边界增强可读性。6. 实际应用中的经验分享在多个项目实践中我总结了这些实用技巧数据质量检查曾遇到过站点坐标偏移500米的情况导致特征提取完全错误。建议先用QGIS可视化检查站点位置是否落在合理地表类型上。季节模型分离夏季和冬季的温度特征关系差异很大最好分别训练模型。测试发现混合季节数据训练会使MAE增加约1.2℃。特征重要性分析通过model.feature_importances_发现在中纬度地区波段10热红外和NDVI通常是最重要的两个特征。边缘效应处理影像边缘的预测结果往往不可靠可以裁剪掉边缘10-15个像素。模型更新策略当有新站点数据时建议增量训练而不是从头开始使用xgb的train()接口继续训练。遇到的最棘手问题是城市区域的混合像元效应——单个30m像元可能同时包含建筑、道路、绿地。这种情况下可以考虑使用更高分辨率影像如Sentinel-2的10m波段加入夜间灯光数据辅助城市区域识别采用面向对象分类方法替代像元分析

更多文章