在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
相关产品推荐
相关产品推荐

