我正在处理有关海洋初级生产力的28个HDF4文件(年份.tar文件可在此处找到:http://orca.science.oregonstate.edu/1080.by.2160.monthly.hdf.cbpm2.v.php) 我的目标是做一些计算(我需要计算每个区域的浓度并获得几年的平均值,即在空间上合并所有文件),然后将它们转换为我可以在ArcGIS中使用的地理参考文件(最好是shapefile或geotiff) 。
我尝试了多种转换为ASCII或光栅文件的方法,然后使用gdalUtils
和gdal_translate
等get_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)
生成的投影完全关闭。我很感激帮助如何做到这一点(转换为任何有效的格式),最好是批量处理。
答案 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。
文件中似乎没有足够的元数据来进行精确投影(地球半径和偏心率是多少?)所以不要尝试用这些数据做小规模的事情...
以下是它的外观:
你还跳过了一些不必要的箍来阅读这篇文章。您可以直接阅读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)