【发布时间】:2017-02-07 11:27:25
【问题描述】:
我想从服务器读取 gzip 压缩的 GeoTIFF 而不下载它。我只是不想创建很多以后必须删除的临时文件。
I see it is possible 与 .csv.gz 文件。
通过下载,我按以下方式进行:
library(raster)
link <- "ftp://ftp.glcf.umd.edu/glcf/SRTM/Degree_Tiles/n000/SRTM_ff03_n000e010
/SRTM_ff03_n000e010.tif.gz"
download.file(link, "test.tif.gz")
gunzip("test.tif.gz")
myras <- raster("test.tif")
plot(myras)
我可以直接从链接中读取未压缩的文件:
link <- "http://download.osgeo.org/geotiff/samples/usgs/o41078a5.tif"
myras <- raster(link)
plot(myras)
myextent <- drawExtent()
plot(myras, ext=myextent)
在这里,我意识到不将其下载到本地存储可能不是一个好主意,因为我假设您随后对 myras 执行的每个操作都需要数据再次通过 Internet 流动。但无论如何,只是为了证明概念,我想这样做。在某些情况下,您只想显示 TIFF 而不对其进行任何进一步的计算,因此不想为其创建临时文件。
要读取(下载的)tiff.gz 文件而不先解压缩,我尝试过:
> raster(gzfile("test.tif.gz"))
Error in (function (classes, fdef, mtable) :
unable to find an inherited method for function ‘raster’ for signature ‘"gzfile"’
要通过连接直接从服务器读取tiff.gz 文件,我尝试了以下操作:
> con <- gzcon(url("ftp://ftp.glcf.umd.edu/glcf/SRTM/Degree_Tiles/n000/SRTM_ff03_n000e010/SRTM_ff03_n000e010.tif.gz"))
> raster(con)
Error in (function (classes, fdef, mtable) :
unable to find an inherited method for function ‘raster’ for signature ‘"gzcon"’
> raw <- textConnection(readLines(con))
> raster(raw)
Error in (function (classes, fdef, mtable) :
unable to find an inherited method for function ‘raster’ for signature ‘"textConnection"’
> rawBin <- textConnection(readBin(con))
Error in readBin(con) : argument "what" is missing, with no default
> con <- gzfile("ftp://ftp.glcf.umd.edu/glcf/SRTM/Degree_Tiles/n000/SRTM_ff03_n000e010/SRTM_ff03_n000e010.tif.gz")
> myras <- raster(con)
Error in (function (classes, fdef, mtable) :
unable to find an inherited method for function ‘raster’ for signature ‘"gzfile"’
我找到了this Stackoverflow question 关于如何读取压缩二进制文件连接的信息,但我不确定 GeoTIFF 是否为二进制(是吗?)以及将哪些参数传递给 readBin() 函数。
我想随意尝试一下,因为我不太了解连接是如何工作的。谁能帮我解决这个问题?
【问题讨论】: