将HDF转换为地理配准文件(geotiff,shapefile)

时间:2018-02-03 17:11:40

标签: r raster hdf

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

我尝试了多种转换为ASCII或光栅文件的方法,然后使用gdalUtilsgdal_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)

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

1 个答案:

答案 0 :(得分:5)

你没有设置光栅的范围,所以它假定为1:ncols,1:nrows,这对于一个lat-long数据集来说是不正确的......

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

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

我看到一个具有完整全局纬度范围的栅格,当我将栅格加载到QGIS中时,它会很好地覆盖OpenStreetMap。

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

以下是它的外观:

enter image description here

你还跳过了一些不必要的箍来阅读这篇文章。您可以直接阅读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)