You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R中处理VIIRS DNB .h5栅格数据:绘图与GeoTIFF导出问题

我来帮你搞定VIIRS DNB HDF5数据的R处理问题,这类遥感数据的结构确实有点绕,咱们一步步拆解:

1. 找到并读取Radiance波段

VIIRS DNB的HDF5是分层存储的,radiance数据不会直接在根目录下,得先摸清文件结构。用h5ls()就能把所有数据集的路径列出来:

library(h5)
# 打开HDF5文件
h5_conn <- h5open("你的VIIRS文件.h5", "r")
# 打印所有数据集路径
print(h5ls(h5_conn))
# 用完记得关闭连接
h5close(h5_conn)

从输出里找带“radiance”或者“NTL”(夜间灯光)的路径,比如常见的路径是/HDFEOS/GRIDS/VIIRS_Grid_DNB/Data Fields/DNB_BRDF-Corrected_NTL。找到路径后就可以读取数据了:

h5_conn <- h5open("你的VIIRS文件.h5", "r")
# 替换成你找到的实际路径
radiance_data <- h5read(h5_conn, "/HDFEOS/GRIDS/VIIRS_Grid_DNB/Data Fields/DNB_BRDF-Corrected_NTL")
h5close(h5_conn)

# 处理填充值(VIIRS常用-9999作为无效值)
radiance_data[radiance_data == -9999] <- NA
2. 读取地理定位信息(解决导出GeoTIFF无参考的核心)

导出时丢失地理信息,是因为你没把HDF5里的坐标、投影信息绑定到数据上。VIIRS的地理参数一般存在Geometry Fields目录下,咱们把关键参数读出来:

h5_conn <- h5open("你的VIIRS文件.h5", "r")
# 左上角经纬度
ul_lon <- h5read(h5_conn, "/HDFEOS/GRIDS/VIIRS_Grid_DNB/Geometry Fields/UpperLeftCornerLongitude")
ul_lat <- h5read(h5_conn, "/HDFEOS/GRIDS/VIIRS_Grid_DNB/Geometry Fields/UpperLeftCornerLatitude")
# 分辨率(注意纬度分辨率是负数,因为数据从北向南排列)
lon_res <- h5read(h5_conn, "/HDFEOS/GRIDS/VIIRS_Grid_DNB/Geometry Fields/LongitudeSpacing")
lat_res <- h5read(h5_conn, "/HDFEOS/GRIDS/VIIRS_Grid_DNB/Geometry Fields/LatitudeSpacing")
h5close(h5_conn)

接下来把这些参数和radiance数据绑定成raster对象,这样就自带地理参考了:

library(raster)
# 创建raster对象
viirs_raster <- raster(radiance_data)
# 设置范围:左下角和右上角的经纬度
extent(viirs_raster) <- extent(
  ul_lon, 
  ul_lon + ncol(radiance_data)*lon_res, 
  ul_lat + nrow(radiance_data)*lat_res, 
  ul_lat
)
# 设置投影(VIIRS DNB默认是WGS84地理坐标系)
crs(viirs_raster) <- "+proj=longlat +datum=WGS84 +no_defs"
3. 轻松绘图

有了带地理信息的raster对象,绘图就简单了:

# 基础绘图
plot(viirs_raster, main = "VIIRS DNB 夜间灯光辐射值", col = viridis::viridis(100), na.color = "transparent")

# 用ggplot2美化(需要rasterVis包)
library(ggplot2)
library(rasterVis)
gplot(viirs_raster) +
  geom_tile(aes(fill = value)) +
  scale_fill_viridis_c(na.value = "transparent", name = "辐射值") +
  labs(title = "VIIRS DNB 夜间灯光辐射值") +
  theme_minimal()
4. 导出带地理参考的GeoTIFF

直接用writeRaster()导出刚才的raster对象,地理信息会自动写入TIFF文件:

writeRaster(viirs_raster, "viirs_dnb_radiance.tif", format = "GTiff", overwrite = TRUE)

现在你在QGIS里打开这个TIFF,就能看到正确的地理定位了!

小提醒:不同的VIIRS产品(比如VNP46A1和VNP46A2)的HDF5路径可能略有差异,一定要用h5ls()确认实际路径;如果数据太大,h5read可以用index参数读取部分区域,避免内存溢出。

内容的提问来源于stack exchange,提问作者dtanon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:27:47