news 2026/10/3 4:59:34

MODIS 2022中国1km地表温度数据集:从下载到城市热岛分析全流程避坑指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MODIS 2022中国1km地表温度数据集:从下载到城市热岛分析全流程避坑指南

简介:本资源为2022年中国区域1km地表温度(LST)空间分布数据集,面向遥感、地理信息、气候与生态等方向的研究人员和学生,用于开展地表热环境、城市热岛及区域气候分析。数据源自NASA MOD11A2产品,经提取子数据集、拼接、投影转换、单位换算与裁剪后,按年对8天合成栅格取平均,得到年尺度1km LST结果,投影为Albers等面积投影,椭球WGS84,中央经线105°,标准纬线25°与47°。压缩包共7个文件,约64.55MB,包含开氏与摄氏两套温度tif栅格、说明txt、xml元数据及ovr、tfw等辅助文件,便于直接读取与制图。已有743人学习下载,适合需要现成中国区年LST数据、快速开展空间分析与论文写作的用户,可省去繁琐预处理,直接用于热环境评估与可视化。

1. 拿到 MODIS 2022 年中国 1km 地表温度数据集,先搞清楚它到底能干什么

很多人第一次接触 MODIS 2022 年中国 1km 地表温度(LST)空间分布数据集.zip,第一反应是「下载下来直接扔进模型不就行了」。我当年也这么想,结果打开一看,一整年的数据、上千个瓦片、还有莫名其妙的填充值,直接懵了。这个数据集的核心价值在于:它把 NASA 的 MOD11A2 产品(8 天合成、1km 分辨率)裁剪到了中国范围,并做了年度合成,让你不用自己处理 HDF 投影和拼接。适合做城市热岛分析、干旱监测、农业旱情评估、地表能量平衡研究的人。但前提是——你得知道它的空间参考、时间合成方式和无效值标记,否则后面全是坑。这一章先把这个数据集讲透,后面再动手。

2. 拆开 zip 之前:MODIS LST 的投影、合成与无效值到底怎么理解

2.1 为什么 1km 分辨率下中国区要特别关注投影

MODIS 原始产品是正弦投影(Sinusoidal),每个瓦片覆盖 1200×1200 像素。中国跨了大约 10 个瓦片(h23v04 到 h28v06 附近),直接拼接会出现明显的边缘错位。这个 zip 里的数据通常已经转成了等经纬度投影(Geographic Lat/Lon, WGS84),像元大小 0.01 度左右,对应约 1km。但你要注意:有些版本只做了重投影没做重采样,导致边缘像元被拉伸。我一般会先用gdalinfo看一眼元数据,确认Pixel Size是不是接近(0.01, 0.01),以及SRS是不是EPSG:4326。如果不是,后面所有面积统计都会偏。

2.2 8 天合成到年度:最大值合成还是平均值合成

MODIS MOD11A2 本身是 8 天合成,用的是「最大值合成法」(因为云污染通常降低 LST,取最大值能抑制云影响)。但这个 zip 叫「2022 年中国 1km 地表温度空间分布数据集」,它很可能是把 46 个 8 天合成做成了年均值或年最大值。常见做法是:先剔除无效值(-9999 或 0),再对每个像元求平均。如果你拿到的是年最大值,那夏季高温区会偏热,冬季冷区会偏冷,做趋势分析时不能用。我一般会检查数据直方图:年均值应该在 -20°C 到 45°C 之间,如果出现大量 0 或 -9999,说明没做无效值掩膜。

2.3 无效值标记:-9999 和 0 的区别

MODIS LST 的填充值是 -9999,但有些中国区裁剪版本会把海洋或境外区域设为 0。0°C 在 LST 里是合法值(冬季北方常见),所以不能把 0 当无效值直接删。正确做法是:先看数据说明,如果没有说明,就用numpy统计 0 的占比。如果 0 集中在东南沿海和境外边界,那大概率是填充。我一般会同时掩膜 -9999 和 0,但保留 0 附近的真实低温像元——这需要结合 NDVI 或土地覆盖做交叉验证。

2.4 用 Python 快速检查数据质量的最小命令

import rasterio import numpy as np # 打开 zip 解压后的第一个 tif 文件 with rasterio.open('LST_2022_China_1km.tif') as src: print('投影:', src.crs) print('像元大小:', src.res) print('范围:', src.bounds) data = src.read(1) # 统计无效值 valid = data[(data != -9999) & (data != 0)] print('有效像元占比:', valid.size / data.size) print('LST 范围: {:.2f} ~ {:.2f} °C'.format(valid.min(), valid.max())) print('均值: {:.2f} °C'.format(valid.mean()))

这段代码先看投影和像元大小,确认是 WGS84 且约 0.01 度。然后读第一个波段,用(data != -9999) & (data != 0)做初步掩膜,但注意 0 可能误伤。最后输出有效像元占比和温度范围。如果有效占比低于 60%,说明云污染或填充太多,这个年份的数据可能不可用。参数上,src.read(1)读的是第一波段,如果 zip 里是多波段(比如 12 个月),你需要循环读。

3. 从 zip 到可用栅格:裁剪、重采样与无效值掩膜的完整操作

3.1 解压后先别急着合并:检查瓦片命名和坐标系

zip 解压后通常是一堆 tif,命名可能是LST_2022_01.tif到LST_2022_12.tif,也可能是按瓦片编号。先ls看一下,然后用gdalinfo批量检查。如果发现有的瓦片是正弦投影,有的是地理投影,那就得先统一。我一般用gdalwarp批量转:

for f in *.tif; do gdalwarp -t_srs EPSG:4326 -tr 0.01 0.01 -r bilinear -of GTiff "$f" "wgs84_$f" done

-t_srs EPSG:4326指定目标投影,-tr 0.01 0.01设像元大小,-r bilinear用双线性插值(LST 连续,双线性比最近邻更合适)。注意:如果原数据已经是地理投影,这步会重采样,可能引入误差,所以先确认再跑。

3.2 用 GDAL 做中国区掩膜:避免境外像元干扰

很多 zip 里的数据已经裁过中国边界,但边界外可能有 0 或 -9999。如果你要做全国统计,必须用中国行政边界 shp 做精确掩膜。常见做法是gdalwarp -cutline china.shp -crop_to_cutline。但注意:-cutline会按 shp 范围裁剪,如果 shp 有多个多边形,可能会生成多个文件。我一般先用ogr2ogr把 shp 合并成一个,再裁。

ogr2ogr -dissolve FIELD_NAME china_merged.shp china.shp gdalwarp -cutline china_merged.shp -crop_to_cutline -dstnodata -9999 wgs84_LST_2022.tif china_LST_2022.tif

-dissolve按字段合并,-dstnodata -9999把边界外设为 -9999。这样后续统计就不会把境外像元算进去。

3.3 无效值掩膜:用 numpy 做条件替换

裁剪后,用 Python 做无效值掩膜。注意:不要直接data[data == 0] = np.nan,因为 0°C 是真实值。我一般会结合土地覆盖数据(如 MOD12Q1)判断:如果像元是水体或海洋,且 LST 为 0,才设为 NaN。

import rasterio import numpy as np with rasterio.open('china_LST_2022.tif') as src: lst = src.read(1).astype(np.float32) profile = src.profile # 掩膜 -9999 lst[lst == -9999] = np.nan # 掩膜 0 但仅限水体区域(假设有水体掩膜 water_mask.tif) with rasterio.open('water_mask.tif') as wsrc: water = wsrc.read(1) lst[(water == 1) & (lst == 0)] = np.nan # 保存 profile.update(dtype=rasterio.float32, nodata=np.nan) with rasterio.open('china_LST_2022_masked.tif', 'w', **profile) as dst: dst.write(lst, 1)

这段代码先转 float32 以便存 NaN,然后掩膜 -9999,再用水体掩膜处理 0。profile.update里nodata=np.nan让后续 GIS 软件能识别。注意:如果 zip 里没有水体掩膜,你可以用 MOD44W 或中国湖泊 shp 自己生成。

3.4 重采样到统一网格:为什么 1km 不是真的 1km

MODIS 1km 是星下点分辨率,中国范围跨纬度大,实际像元面积从 0.8km² 到 1.2km² 不等。如果你要做面积统计,必须用等面积投影(如 Albers)。常见做法是:先转 Albers,再重采样到 1km 网格。

gdalwarp -t_srs '+proj=aea +lat_1=25 +lat_2=47 +lat_0=0 +lon_0=105 +datum=WGS84' -tr 1000 1000 -r bilinear china_LST_2022_masked.tif albers_LST_2022.tif

+proj=aea是 Albers 等面积投影,lat_1和lat_2是中国标准纬线。-tr 1000 1000单位是米。这样每个像元面积都是 1km²,统计才准确。

4. 避坑:MODIS LST 中国区数据集最常见的 5 个翻车现场

4.1 现象:统计出来全国平均 LST 只有 5°C,明显偏低

原因:把 -9999 和 0 都当无效值删了,但 0°C 在冬季北方是真实值,删掉后低温区被过度剔除,导致均值偏高?不对,这里偏低是因为把 -9999 当有效值算进去了。-9999 是填充值,如果没掩膜,直接求平均会拉低整体。解决:先data[data == -9999] = np.nan,再统计。

4.2 现象:裁剪后中国边界外还有一圈 0 值

原因:gdalwarp -cutline默认不设置-dstnodata,边界外像元被设为 0。解决:加-dstnodata -9999,或者裁剪后用rasterio按 shp 掩膜。

4.3 现象:重投影后 LST 范围变成 -200°C 到 200°C

原因:用了最近邻插值(-r near),导致填充值 -9999 被插值到有效区域。解决:用双线性或三次卷积,并且先掩膜无效值再重投影。如果已经错了,重新用-r bilinear跑一遍。

4.4 现象:年度合成后夏季高温区消失

原因:用了平均值合成,但 8 天合成里云污染导致某些月份全是 -9999,平均后有效值被稀释。解决:改用最大值合成,或者先做云掩膜(用 MOD11A2 的 QC 波段)再平均。

4.5 现象:用 QGIS 打开显示全黑或全白

原因:数据是 float32 且含 NaN,QGIS 默认拉伸把 NaN 当极值。解决:在 QGIS 里设置Min/Max为实际有效范围(如 -20 到 45),或者先转成整型并设 nodata 为 -9999。

5. 进阶:用 LST 做城市热岛强度计算与年际对比的实操技巧

5.1 城市热岛强度:用缓冲区法还是城乡二分法

我一般用缓冲区法:以城市中心为原点,做 5km、10km、20km 缓冲区,分别统计 LST 均值,然后算SUHI = LST_urban - LST_rural。但注意:MODIS 1km 下,城市边界模糊,缓冲区半径小于 5km 会混入郊区。常见做法是:用不透水面数据(如 GAIA)提取城市像元,再算城乡温差。

import geopandas as gpd import rasterio import numpy as np from rasterio.mask import mask # 读城市边界 city = gpd.read_file('beijing.shp') with rasterio.open('albers_LST_2022.tif') as src: # 城市内 LST out_image, _ = mask(src, city.geometry, crop=True) urban_lst = out_image[out_image != -9999].mean() # 郊区:城市外 20km 缓冲区 buffer = city.geometry.buffer(20000) out_image_buf, _ = mask(src, buffer, crop=True) rural_lst = out_image_buf[out_image_buf != -9999].mean() print('SUHI: {:.2f} °C'.format(urban_lst - rural_lst))

mask函数按几何裁剪,buffer(20000)是 20km 缓冲区。注意:缓冲区可能包含其他城市,所以最好用土地覆盖数据剔除。

5.2 年际对比:2022 年比 2021 年热了多少

如果你有 2021 和 2022 两年数据,先确保投影和网格一致。然后做差值:

with rasterio.open('albers_LST_2021.tif') as src1, rasterio.open('albers_LST_2022.tif') as src2: lst1 = src1.read(1) lst2 = src2.read(1) diff = lst2 - lst1 diff[(lst1 == -9999) | (lst2 == -9999)] = np.nan print('平均增温: {:.2f} °C'.format(np.nanmean(diff)))

注意:两年数据必须来自同一合成方法(都是年均值或都是年最大值),否则差值无意义。

5.3 一个我踩过的坑:用 0.01 度网格做面积统计

0.01 度在赤道约 1.1km,在北纬 40 度约 0.85km。如果你直接用像元数乘 1km²,北方会高估面积。我后来统一转 Albers 再统计,误差从 15% 降到 2% 以内。这个习惯救了我好几次。

5.4 验证方法:用地面气象站数据做交叉验证

找中国气象数据网(CMA)的 2022 年日均温,和 LST 做相关。注意:LST 是地表温度,气温是 1.5m 高度,两者差 2-5°C 正常。我一般看 R²,如果低于 0.6,说明数据质量有问题。常见做法是:选 10 个站,做散点图,看斜率。

希望帮到你。

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/3 4:58:03

2005年全国路网矢量数据清洗与坐标系转换实战指南

简介:覆盖全国范围的矢量地理数据合集,汇集道路、河流、铁路等多类要素,专为GIS使用者打造,适用于城市规划、交通分析、环境研究与历史变迁对比等场景,尤其适合需要借助ArcGIS进行空间查询、制图和专题分析的读者。包内…

作者头像 李华
网站建设 2026/10/3 4:56:42

Jev编码智能体实战:Codex接入、本地部署与数据系统落地

最近业内好几个群都在刷同一件事:一个叫 Jev 的模型/助手突然被各种转发,标题党一点的说法是“斯坦福教授都在用”“Codex 里能直接调”“本地部署完还能当聊天机器人”。说实话,AI 工具每个月都要火几波,但 Jev 这个热度有点不一…

作者头像 李华
网站建设 2026/10/3 4:56:41

Codex CLI接入Jev网关:突破模型限制的完整实操指南

最近一直在折腾Codex CLI,说句实话,它本身的交互体验确实没得挑,但默认那条链路用起来总觉得被绑住了手脚——账号、额度、可用模型,样样都是限制。后来我把Codex的前端请求接到了Jev这个路由网关上,算是把整个玩法彻底…

作者头像 李华
网站建设 2026/10/3 4:56:36

Unity iOS深度链接实战:URL Scheme与Universal Links双轨打通

1. 为什么 iOS 深度链接在 Unity 手游里是个“三明治式”难题:底层系统、中间层桥接、上层逻辑全得对齐你有没有遇到过这样的场景:玩家在微信里点开一个带参数的推广链接,本该直接跳转到游戏内某个活动页,结果却弹出“是否打开 Ap…

作者头像 李华
网站建设 2026/10/3 4:56:28

AI桌面换装视频全流程:从素材准备到成片拼接的实操指南

1. 这个"AI桌面换装"到底在玩什么刷到"AI桌面换装视频"的时候,我第一反应是:又是一个靠剪辑软件硬堆特效的活儿。结果点进去看了几条,发现完全不是那么回事——人物在桌面场景里自然换装,衣服的褶皱、光影、材…

作者头像 李华
网站建设 2026/10/3 4:55:29

大语言模型+ROS2导航实战:NavGPT-2与Nav2融合的交互式自主导航

简介:该压缩包围绕清华大学NavGPT-2具身智能大语言模型与ROS2机器人操作系统的深度融合,提供一套交互式自主导航系统项目极简说明,主要面向机器人研发者、ROS2技术学习者及具身智能方向入门者,帮助解决如何用自然语言指令控制机器…

作者头像 李华