【问题标题】:Converting HDF to georeferenced file (geotiff, shapefile)将 HDF 转换为地理参考文件(geotiff、shapefile)
【发布时间】:2023-04-02 17:35:02
【问题描述】:

我正在处理关于海洋初级生产力的 28 个 HDF4 文件(可以在此处找到年度 .tar 文件:http://orca.science.oregonstate.edu/1080.by.2160.monthly.hdf.cbpm2.v.php) 我的目标是进行一些计算(我需要计算每个区域的浓度并获得几年的平均值,即在空间上合并所有文件),然后将它们转换为我可以在 ArcGIS 中使用的地理参考文件(最好是 shapefile 或 geotiff) .

我尝试了几种方法来转换为 ASCII 或光栅文件,然后使用 gdalUtils 工具(例如 gdal_translateget_subdatasets)添加投影。但是,由于 HDF4 文件不是以标准命名的(与 MODIS 文件不同),因此后者不起作用,我无法访问子集。

这是我用来转换为栅格的代码:

library(raster)
library(gdalUtils)

setwd("...path_to_files...")

gdalinfo("cbpm.2015060.hdf")
hdf_file <- "cbpm.2015060.hdf"

outfile="testout"
gdal_translate(hdf_file,outfile,sds=TRUE,verbose=TRUE)
file.rename(outfile,paste("CBPM_test",".tif",sep="")) 

rast <- raster("CBPM_test.tif")

wgs1984 <- CRS("+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0")
projection(rast) <- wgs1984
#crs(rast) <- "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0" 

plot(rast)

writeRaster(rast, file="CBPM_geo.tif", format='GTiff', overwrite=TRUE)

生成的投影完全关闭。我会很感激帮助如何做到这一点(通过任何有效的格式转换),最好是批处理。

【问题讨论】:

    标签: r raster hdf


    【解决方案1】:

    您尚未设置栅格的范围,因此假定其为 1:ncols、1:nrows,这不适用于经纬度数据集...

    gdalinfo 暗示它是一个完整的球体,所以如果我这样做:

     extent(rast)=c(xmn=-180, xmx=180, ymn=-90, ymx=90)
     plot(rast)
     writeRaster(rast, "output.tif")
    

    我看到一个具有完整全球经纬度范围的栅格,当我将栅格加载到 QGIS 中时,它与 OpenStreetMap 很好地重叠。

    文件中似乎没有足够的元数据来进行精确投影(地球半径和偏心率是多少?)所以不要尝试用这些数据做任何小规模的事情......

    它的外观如下:

    您还跳过了一些不必要的障碍来阅读本文。您可以直接读取 HDF 并设置其范围和投影:

    > r = raster("./cbpm.2017001.hdf")
    

    我们得到了什么:

    > r
    class       : RasterLayer 
    dimensions  : 1080, 2160, 2332800  (nrow, ncol, ncell)
    resolution  : 1, 1  (x, y)
    extent      : 0, 2160, 0, 1080  (xmin, xmax, ymin, ymax)
    coord. ref. : NA 
    data source : /home/rowlings/Downloads/HDF/cbpm.2017001.hdf 
    names       : cbpm.2017001 
    

    设置范围:

    > extent(r)=c(xmn=-180, xmx=180, ymn=-90, ymx=90)
    

    和投影:

    > projection(r)="+init=epsg:4326"
    

    以及对 NA 的土地价值:

    > r[r==-9999]=NA
    

    写下来,画出来:

    > writeRaster(r,"r.tif")
    > plot(r)
    

    【讨论】:

    • 非常感谢您的帮助!设置范围确实起到了作用。然而,试图整理我的,公认的非常混乱的代码,r = raster("./cbpm.2017001.hdf") 给了我错误Error in .local(.Object, ...) : Error in .rasterObjectFromFile(x, band = band, objecttype = "RasterLayer", : Cannot create a RasterLayer object from this file.
    • 您必须按照自己的方式进行操作 - 也许您的 gdal 没有 HDF 驱动程序,但是 gdal_translate 可以工作...嗯,确定该文件存在吗?它与您在示例中使用的不同。
    • 很抱歉发布另一个文件的示例,但是是的,该文件存在,我无法真正弄清楚问题出在哪里。很想按照您的建议清理我的代码,但现在它应该可以正常工作。非常感谢!您有使用光栅文件执行计算的经验吗?这就是我的目标:orca.science.oregonstate.edu/faq01.php
    • @Spacedman 这一定与raster依赖于rgdal这一事实有关,rgdal自带了自己编译的GDAL版本,而 gdal_utils 使用对系统路径上任何版本的 GDAL 的系统调用。 (我似乎记得 rgdal 反过来依赖于 Brian Ripley 编译的 GDAL。)在 Windows 上,使用 CRAN 分发的 rasterrgdal 二进制文件,我得到与 OP 相同的错误。不确定这是否相关,但运行rgdal::gdalDrivers() 告诉我HDF5 和HDF5Image 驱动程序在createcopy 中都有FALSE 的值。
    • @Spacedman 好的,最后一点当然相关。更重要的是,rgdal::gdalDrivers() 没有列出任何 HDF4 驱动程序。 (而且 FWIW,stars 包在 Windows 上使用的 GDAL 版本也不支持 HDF4(如this table 所示。)
    猜你喜欢
    • 2019-07-26
    • 2016-08-14
    • 2017-07-29
    • 1970-01-01
    • 2013-05-05
    • 2021-12-18
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多