1. 为什么地表温度数据值得你花时间折腾
做遥感或者地理信息相关工作的朋友,大概率都绕不开一个需求:拿到某一区域、某一时间段的地表温度数据。不管是做城市热岛效应分析、农业旱情监测、还是写论文时需要一组真实可靠的温度栅格,地表温度数据都是硬通货。而 ASTER L2 地表温度产品,在这个圈子里算是性价比极高的选择——免费、空间分辨率够用(90米)、时间跨度长(从2000年至今),关键是 NASA Earthdata 平台直接对外开放,不需要任何特殊手段就能下载。
但问题来了。我第一次去 NASA Earthdata 下载 ASTER L2 数据的时候,花了整整一个下午才搞明白整个流程。不是因为它有多复杂,而是因为它的交互逻辑和国内常见的数据平台完全不一样。你需要在多个页面之间跳转、需要理解什么是 Earthdata Login、需要知道怎么用 shp 文件圈定范围、还需要搞清楚 ASTER L2 产品到底有哪些参数可选。网上能找到的教程要么太老、要么跳步太多,对新手极其不友好。
这篇内容就是把我自己踩过的坑、验证过的流程、以及一些能显著提升效率的小技巧全部整理出来。从账号注册到数据筛选,从 shp 文件拖拽到批量下载,每一步都会讲清楚为什么这么做、怎么做最省事。适合完全没有接触过 NASA Earthdata 的朋友,也适合之前下载过但觉得流程太繁琐想优化的人。核心关键词就几个:NASA Earthdata、ASTER L2、shp 文件、地表温度数据、下载。你把这几个词搞定了,整个流程就通了。
2. 下载之前的准备工作:账号、工具与基础知识
2.1 Earthdata 账号注册与登录要点
NASA Earthdata 的所有数据下载都依赖一个统一的账号体系,叫 Earthdata Login。你可以把它理解成一把万能钥匙,注册一次之后,所有 NASA 旗下的数据平台都能用。注册地址直接在搜索引擎里搜“Earthdata Login”就能找到,这里不贴具体链接,避免失效。
注册的时候有几个细节需要注意。第一,邮箱建议用 Gmail 或者 Outlook,国内部分邮箱可能会收不到验证邮件。第二,用户名和密码要记牢,后面在下载工具里配置的时候会反复用到。第三,注册完成后不需要任何审核,立刻就能用。
注意:Earthdata Login 的密码有复杂度要求,必须包含大小写字母、数字和特殊字符,长度至少8位。我见过不少人卡在这一步反复试。
登录之后,你会看到一个个人主页,里面有一个“Applications”选项卡。这里需要添加一个授权应用,通常选择“NASA GESDISC DATA ARCHIVE”就行。这一步很多人会忽略,但不添加的话,后面在下载数据时会被拒绝访问。添加授权的操作很简单,点“Approve”按钮即可。
2.2 需要提前装好的工具清单
下载 ASTER L2 数据,光有浏览器是不够的。根据我的经验,下面这几个工具最好提前准备好:
- 浏览器:Chrome 或 Edge 都可以,主要是为了用 Earthdata Search 的图形界面。不建议用 IE,兼容性太差。
- 解压工具:7-Zip 或 WinRAR,ASTER 数据下载下来是 HDF 格式,有时候会打包成 zip。
- GIS 软件:ArcGIS 或者 QGIS,用来查看 shp 文件和后续处理数据。QGIS 免费,功能完全够用。
- 下载工具:wget 或者 curl,批量下载的时候比浏览器手动点快十倍。Windows 用户可以用 wget for Windows,或者直接用 PowerShell 里的 Invoke-WebRequest。
- 文本编辑器:Notepad++ 或者 VS Code,用来编辑下载链接列表。
这些工具都不难装,但提前准备好能省掉很多中途折腾的时间。尤其是 wget,如果你要下载多个年份的数据,没有它你会点到手软。
2.3 ASTER L2 地表温度产品的基本认知
在开始下载之前,有必要花两分钟搞清楚 ASTER L2 到底是什么。ASTER 是搭载在 Terra 卫星上的一个传感器,L2 代表 Level 2 产品,也就是经过大气校正后的地表参数数据。地表温度产品对应的产品编号是 AST_08,全称是 ASTER Level 2 Surface Kinetic Temperature。
这个产品的核心参数如下:
| 参数项 | 说明 |
|---|---|
| 空间分辨率 | 90米 |
| 时间范围 | 2000年3月至今 |
| 覆盖范围 | 全球陆地 |
| 数据格式 | HDF-EOS |
| 温度单位 | 开尔文 |
| 精度 | 约1.5K |
90米分辨率意味着什么?Sentinel-2 是10米,Landsat 是30米(热红外是100米),ASTER 的90米在热红外数据里算是中等偏上。它的优势在于时间跨度长,从2000年到现在一直有数据,做长时间序列分析非常合适。
提示:ASTER 数据不是每天都有,它是按需拍摄的。Terra 卫星过境时间大约是当地时间上午10:30左右,所以数据都是白天的。
3. 核心流程拆解:从搜索到下载的完整链路
3.1 用 Earthdata Search 圈定目标区域
打开 Earthdata Search 之后,你会看到一个类似在线地图的界面。左上角有一个搜索框,可以直接输入“ASTER L2 Surface Kinetic Temperature”或者产品编号“AST_08”。搜索之后,左侧会出现一系列数据集,找到对应的那个点进去。
接下来是最关键的一步:圈定你的研究区域。Earthdata Search 提供了几种方式:
- 矩形框选:直接在地图上拖拽一个矩形,适合快速预览。
- 多边形绘制:手动点选多个顶点,适合不规则区域。
- 上传 shp 文件:这是最精准的方式,也是这篇内容重点要讲的。
为什么推荐用 shp 文件?因为手动绘制多边形很难精确匹配你的研究区边界,尤其是当你的研究区是一个行政区划或者流域边界时,手动画几乎不可能准确。而 shp 文件本身就是矢量边界,直接上传就能精确圈定。
3.2 shp 文件拖拽技巧与常见报错处理
Earthdata Search 支持直接拖拽 shp 文件到地图区域。但这里有几个坑,我几乎每次用都会遇到至少一个:
坑一:shp 文件必须打包成 zip。你不能只拖一个 .shp 文件进去,必须把 .shp、.shx、.dbf、.prj 这几个文件一起压缩成 zip,然后拖拽整个 zip 文件。少了任何一个,上传都会失败。
坑二:坐标系问题。Earthdata Search 使用的是 WGS84 地理坐标系。如果你的 shp 文件是投影坐标系(比如 UTM),上传后位置会偏移。解决办法是在 ArcGIS 或 QGIS 里先做一次投影转换,把 shp 转成 WGS84。
坑三:文件大小限制。shp 文件压缩后最好不要超过 10MB,太大的话上传会很慢甚至超时。如果你的研究区特别大,建议先做一次简化或者分割。
坑四:中文字段名。shp 文件的属性表里如果有中文字段名,上传时可能会报编码错误。建议在导出 shp 之前把字段名改成英文。
注意:拖拽的时候要拖到地图区域的正中间,拖到边缘有时候不会触发上传。我试过好几次拖到边角没反应,还以为文件有问题。
上传成功后,地图上会自动高亮你的研究区范围,左侧的数据列表也会同步过滤,只显示与你研究区有交集的数据。这一步做完,你就成功了一半。
3.3 筛选时间、云量与数据质量
圈定区域之后,接下来要筛选时间和数据质量。ASTER L2 数据的时间筛选很直观,直接选起止日期就行。但云量筛选需要特别注意。
ASTER 数据有一个“Cloud Cover”字段,范围是0到100。理论上云量越低越好,但实际做地表温度的时候,云量低于10%的数据就已经很少了。我的经验是,如果做城市热岛,云量可以放宽到20%;如果做长时间序列,云量可以放宽到30%,然后后期再做云掩膜处理。
另外还有一个“Day/Night”标志。ASTER 地表温度产品有白天和夜间两种,做热岛分析一般用白天数据,做地表辐射收支可能两种都要。筛选的时候记得勾选你需要的类型。
数据质量方面,ASTER L2 有一个 QA 波段,里面记录了每个像元的精度信息。下载之后可以用这个波段做质量控制,把精度差的像元剔除掉。这个在筛选阶段不用管,下载后处理时再考虑。
3.4 批量下载与 wget 配置实战
筛选完之后,你会看到一个数据列表,每个数据条目右边都有一个下载按钮。如果只有几条数据,手动点也行。但如果你要下载几十条甚至上百条,手动点就是自虐。
正确做法是用 wget 批量下载。具体步骤如下:
第一步,在 Earthdata Search 的结果页面,点击“Download All”按钮,然后选择“Download Links List”。这会生成一个文本文件,里面包含所有数据的下载链接。
第二步,打开这个文本文件,你会看到每一行是一个链接。但这些链接不能直接用 wget 下载,因为需要 Earthdata Login 的认证。
第三步,配置 wget 的认证信息。在 wget 的配置文件(通常是 .wgetrc)里添加以下内容:
http_user = 你的Earthdata用户名 http_password = 你的Earthdata密码或者直接在命令行里指定:
wget --user=你的用户名 --password=你的密码 -i download_links.txt第四步,运行命令,wget 会自动依次下载所有文件。下载速度取决于你的网络,一般每个文件几十MB,几百个文件大概需要几个小时。
提示:wget 支持断点续传,如果中途断了,重新运行同样的命令就行,已经下载完的文件会自动跳过。
4. 数据下载后的处理与验证
4.1 HDF 文件结构解析
下载下来的 ASTER L2 数据是 HDF-EOS 格式,文件名通常长这样:AST_08_00307242001081534_20200101123456.hdf。文件名里包含了产品编号、版本号、日期和时间信息。
用 QGIS 或者 ArcGIS 打开 HDF 文件时,你会看到多个子数据集。AST_08 产品主要包含以下几个:
- Surface Kinetic Temperature:地表动力学温度,这就是我们要的核心数据。
- Quality Assurance:质量保证波段,记录每个像元的精度。
- Cloud Mask:云掩膜,标记哪些像元被云覆盖。
- View Angle:观测角度信息。
在 QGIS 里打开 HDF 需要安装 HDF4 或 HDF5 驱动,ArcGIS 则原生支持。如果你用 Python,可以用gdal或者rasterio库读取。
4.2 温度单位转换与可视化
ASTER L2 的温度单位是开尔文,做分析之前通常要转成摄氏度。转换公式很简单:
celsius = kelvin - 273.15用 Python 批量转换的代码大概是这样:
import rasterio import numpy as np with rasterio.open('AST_08_temp.tif') as src: kelvin = src.read(1) celsius = kelvin - 273.15 celsius[celsius < -100] = np.nan # 剔除异常值 profile = src.profile profile.update(dtype=rasterio.float32, nodata=np.nan) with rasterio.open('AST_08_temp_celsius.tif', 'w', **profile) as dst: dst.write(celsius.astype(rasterio.float32), 1)可视化的时候,建议用色带映射,把温度范围拉伸到实际数据的2%到98%分位数之间,这样能突出空间差异。QGIS 里直接用“单波段伪彩色”渲染就行,ArcGIS 里用“拉伸”功能。
4.3 用 shp 文件做掩膜提取
下载的时候用 shp 圈定了范围,但下载下来的数据是整个景的,包含了你研究区之外的部分。这时候需要用 shp 文件做掩膜提取,把研究区之外的部分裁掉。
在 ArcGIS 里,用“Extract by Mask”工具,输入栅格和 shp 文件,输出就是裁剪后的结果。在 QGIS 里,用“Clip Raster by Mask Layer”工具,操作类似。Python 里可以用rasterio.mask模块:
import fiona import rasterio from rasterio.mask import mask with fiona.open('study_area.shp', 'r') as shapefile: shapes = [feature['geometry'] for feature in shapefile] with rasterio.open('AST_08_temp_celsius.tif') as src: out_image, out_transform = mask(src, shapes, crop=True) out_meta = src.meta.copy() out_meta.update({ 'driver': 'GTiff', 'height': out_image.shape[1], 'width': out_image.shape[2], 'transform': out_transform }) with rasterio.open('AST_08_temp_clipped.tif', 'w', **out_meta) as dst: dst.write(out_image)这一步做完,你就得到了一个干净的研究区地表温度栅格,可以直接拿去做统计分析或者出图了。
5. 常见问题与排查技巧实录
5.1 下载链接失效与重新获取
Earthdata 的下载链接是有时效性的,一般生成后24小时内有效。如果你今天生成了链接列表,明天才想起来下载,大概率会报403错误。解决办法很简单:重新去 Earthdata Search 生成一次链接列表。所以我的建议是,生成链接后尽快下载,不要拖。
5.2 认证失败与密码错误
wget 下载时如果提示“Authentication failed”,通常是以下几个原因:
- 用户名或密码输错了。注意大小写,Earthdata 的密码是区分大小写的。
- 没有在 Earthdata Login 里授权“NASA GESDISC DATA ARCHIVE”应用。回到个人主页的 Applications 选项卡检查一下。
- 密码里包含特殊字符,在命令行里被转义了。解决办法是把密码用单引号括起来,或者用配置文件的方式。
5.3 shp 文件上传后位置偏移
这个问题我遇到过好几次,根本原因就是坐标系不匹配。Earthdata Search 用的是 WGS84,如果你的 shp 是 CGCS2000 或者 UTM,上传后就会偏移。解决办法是在 ArcGIS 里用“Project”工具,或者在 QGIS 里用“Save As”并选择 WGS84 坐标系,重新导出一次 shp。
5.4 数据下载后打不开或显示异常
有时候下载下来的 HDF 文件在 QGIS 里打不开,或者打开后是一片黑。这通常是因为:
- 文件下载不完整。检查文件大小,如果明显小于正常值,重新下载。
- QGIS 缺少 HDF 驱动。安装
gdal-hdf4或gdal-hdf5插件。 - 数据本身有问题。极少数情况下,ASTER 数据会有质量问题,换一个日期的数据试试。
5.5 常见问题速查表
| 问题现象 | 可能原因 | 解决办法 |
|---|---|---|
| 上传 shp 无反应 | 文件未打包成 zip | 将 shp/shx/dbf/prj 一起压缩 |
| 上传后位置偏移 | 坐标系不是 WGS84 | 重新投影后导出 |
| wget 报 403 | 链接过期或未授权 | 重新生成链接,检查授权 |
| HDF 打不开 | 缺少驱动或文件损坏 | 安装驱动,重新下载 |
| 温度值异常 | 未做单位转换或未剔除异常 | 开尔文转摄氏度,剔除极端值 |
提示:如果以上方法都试过了还是不行,可以去 NASA Earthdata 的官方论坛搜一下,大部分问题都有人遇到过。
6. 一些能显著提升效率的实操心得
6.1 用 Python 脚本自动化整个流程
如果你需要定期下载 ASTER 数据,手动操作太浪费时间。我后来写了一个 Python 脚本,用earthaccess库自动搜索和下载。这个库封装了 Earthdata 的 API,几行代码就能搞定:
import earthaccess earthaccess.login() results = earthaccess.search_data( short_name='AST_08', bounding_box=(116.0, 39.0, 117.0, 40.0), temporal=('2020-01-01', '2020-12-31'), cloud_cover=(0, 20) ) earthaccess.download(results, './data')这个脚本的好处是,你可以把它放到定时任务里,每个月自动下载最新数据。对于做长时间序列分析的人来说,能省下大量重复劳动。
6.2 数据命名与归档建议
下载下来的文件名是一串无规律的字符,时间长了根本分不清哪个是哪个。我的做法是下载后立刻重命名,格式统一为“ASTER_LST_日期_区域.tif”。比如“ASTER_LST_20200815_Beijing.tif”。这样一眼就能看出数据内容,后续处理的时候不容易搞混。
归档的时候按年份建文件夹,每个年份下面再按月份分子文件夹。虽然看起来有点繁琐,但数据量大了之后,这种结构能帮你快速定位。
6.3 云掩膜的正确使用方式
ASTER L2 自带的云掩膜波段不是万能的,它有时候会把一些薄云或者云边缘漏掉。我的经验是,除了用自带的云掩膜,还可以结合 QA 波段做二次筛选。具体做法是:先把 QA 波段里精度低于某个阈值的像元标记出来,再和云掩膜做交集,这样能剔除掉大部分不可靠的像元。
另外,如果你做的是城市热岛分析,建筑物和道路的温度本身就和周边不一样,云掩膜可能会误判。这种情况下,建议手动检查几个典型区域,确认云掩膜的效果。
6.4 批量处理时的内存管理
如果你要处理几十景 ASTER 数据,用 Python 批量读取的时候要注意内存。HDF 文件虽然不大,但一次性全部读进来还是会爆内存。我的做法是用rasterio的窗口读取功能,每次只读研究区范围内的像元,处理完就释放。这样即使处理上百景数据,内存占用也能控制在合理范围内。
with rasterio.open('AST_08_temp.tif') as src: window = rasterio.windows.from_bounds( left, bottom, right, top, src.transform ) data = src.read(1, window=window) # 处理 data # 处理完后 data 会被自动回收这个技巧在处理大区域、长时间序列的时候特别有用。我试过用这种方法处理200景数据,全程内存占用没超过2GB。
6.5 关于数据版本的选择
ASTER L2 产品有多个版本,目前最新的是 Version 003。不同版本之间的差异主要在定标精度和云掩膜算法上。如果你做的是精度要求不高的宏观分析,用哪个版本都行。但如果做定量遥感,建议统一用最新版本,避免版本差异带来的系统误差。
另外,ASTER 数据从2000年到现在,早期数据的质量可能不如后期。如果你做长时间序列,建议先检查一下早期数据的 QA 波段,把质量太差的年份剔除掉。
6.6 下载速度优化
NASA 的服务器在国外,下载速度有时候不太稳定。我的经验是,用 wget 的时候加上-c参数开启断点续传,加上--tries=0让它无限重试。另外,如果你有多个文件要下载,可以用-i参数指定链接列表,wget 会依次下载,比手动一个个点快得多。
如果下载速度特别慢,可以试试在凌晨或者早上操作,那个时间段网络相对通畅。我实测下来,凌晨下载的速度能比白天快两三倍。
6.7 数据引用与版权说明
ASTER 数据是免费的,但使用的时候需要正确引用。NASA 官方推荐的引用格式是:
NASA LP DAAC. ASTER Level 2 Surface Kinetic Temperature. Version 003. NASA EOSDIS Land Processes DAAC. Accessed [日期].
写论文或者报告的时候记得加上这个引用,这是基本的学术规范。另外,ASTER 数据的使用没有特殊限制,商业用途也可以,但建议在成果中注明数据来源。
7. 从下载到应用:一个完整的案例复盘
7.1 案例背景与数据需求
去年我帮一个做城市热岛研究的团队处理过一批数据,他们的需求是:北京市五环内,2015年到2020年,每年夏季(6月到8月)的地表温度数据,用于分析热岛强度的年际变化。
这个需求看起来简单,但实际操作起来有几个难点:第一,时间跨度6年,数据量不小;第二,研究区是五环内,边界不规则,必须用 shp 文件圈定;第三,夏季云量高,需要筛选云量低的数据。
7.2 操作流程与关键决策
第一步,准备北京市五环的 shp 文件。这个文件是从 OpenStreetMap 下载的,坐标系是 WGS84,直接压缩成 zip 就能用。
第二步,在 Earthdata Search 里上传 shp,圈定研究区。然后设置时间范围为2015年到2020年,每年6月到8月,云量设置为0到20%。
第三步,筛选结果出来后发现,2015年和2016年的数据比较少,因为那两年 ASTER 的拍摄频率降低了。最后实际下载了大约40景数据。
第四步,用 wget 批量下载,大概花了3个小时。下载完成后用 Python 脚本批量做单位转换和掩膜提取,又花了1个小时。
第五步,把处理好的数据导入 ArcGIS,做统计分析。最终发现,2015年到2020年,北京五环内的地表温度平均值上升了约1.2摄氏度,热岛强度在2018年达到峰值。
7.3 踩过的坑与最终解决方案
这个案例里最大的坑是 shp 文件上传。第一次上传的时候,shp 文件没有压缩,直接拖进去没反应。后来压缩成 zip 再拖,又提示坐标系不匹配。检查后发现,这个 shp 文件是从某个国内平台下载的,坐标系是 CGCS2000。用 QGIS 重新投影成 WGS84 之后,上传就成功了。
另一个坑是云量筛选。一开始把云量设置为0到10%,结果2015年和2016年几乎没有数据。后来放宽到20%,数据量才够用。所以云量阈值不要设得太死,要根据实际数据情况灵活调整。
7.4 最终成果与数据验证
处理完的数据用地面气象站的数据做了交叉验证,发现 ASTER 地表温度和气象站气温的相关性在0.85左右,精度可以接受。当然,地表温度和气温本身就有差异,这个相关性已经算不错了。
最终出图的时候,用 QGIS 做了温度分级渲染,从蓝色到红色渐变,热岛核心区一目了然。这个图后来用在了他们的研究报告里,效果很好。
8. 关于 ASTER L2 数据下载这件事,我的个人体会
从第一次折腾一下午到现在,我已经下载过几百景 ASTER 数据了。回过头来看,整个流程其实并不复杂,核心就是三件事:账号注册、shp 圈定、wget 批量下载。但每一件事都有细节,细节没处理好就会卡住。
我最想分享的经验是:不要怕试错。NASA Earthdata 的界面虽然看起来有点老旧,但它的容错性其实很好。你上传错了 shp,重新传就行;下载链接过期了,重新生成就行。没有什么操作是不可逆的。我见过很多人因为怕出错,每一步都小心翼翼,反而浪费了更多时间。
另外,如果你打算长期使用 ASTER 数据,强烈建议花点时间学一下 Python 的earthaccess库。它能帮你省掉大量重复操作,尤其是做长时间序列分析的时候,自动化脚本的优势非常明显。
最后再分享一个小技巧:下载数据之前,先在 Earthdata Search 里用“Preview”功能看一下数据的大致情况。如果预览图里研究区被云遮得严严实实,那就别下载了,换一个日期。这个习惯能帮你省掉很多下载后才发现数据不可用的尴尬。