简体   繁体   English

使用光栅 package 下载 SRTM 数据?

[英]Downloading SRTM data with raster package?

I'm trying to get SRTM data with " raster " package in R, but as soon as I'm choosing SRTM in getData command, I would get the following error:我正在尝试使用 R 中的“ raster ”package 获取 SRTM 数据,但是一旦我在 getData 命令中选择SRTM ,就会出现以下错误:

library(raster)

srtm <- getData('SRTM', lon=16, lat=48)
trying URL 'ftp://xftp.jrc.it/pub/srtmV4/tiff/srtm_40_03.zip'
trying URL 'http://hypersphere.telascience.org/elevation/cgiar_srtm_v4/tiff/zip/srtm_40_03.ZIP'
downloaded 572 bytes

Error in .SRTM(..., download = download, path = path) : file not found
In addition: Warning messages:
1: In utils::download.file(url = aurl, destfile = fn, method = "auto",  :
  URL 'ftp://xftp.jrc.it/pub/srtmV4/tiff/srtm_40_03.zip': status was 'Couldn't resolve host name'
2: In utils::unzip(zipfilename, exdir = dirname(zipfilename)) :
  error 1 in extracting from zip file

Any Idea what is this error for?知道这个错误是什么意思吗?

I have the same problem, it seems to be a bug. 我有同样的问题,似乎是一个错误。 The getData function in raster package checks for availability of the raster file in three different url's. raster包中的getData函数检查三个不同URL中栅格文件的可用性。

1. ftp://xftp.jrc.it/pub/srtmV4/tiff/FILENAME
2. http://hypersphere.telascience.org/elevation/cgiar_srtm_v4/tiff/zip/FILENAME
3. http://srtm.csi.cgiar.org/SRT-ZIP/SRTM_V41/SRTM_Data_GeoTiff/FILENAME

The first two of them (as of today) are not working or cannot be accessible. 前两个(截至今天)无法正常工作或无法访问。 However for some reason a small bit data is getting transferred across the server, so the package assumes it to be a available file only to reach an error by utils . 但是由于某种原因,一小部分数据正在服务器上传输,因此软件包假定它只是一个可用文件,只能通过utils来解决错误。 The third url however is most trusted one among the three. 然而,第三个网址是三个中最值得信赖的网址之一。

I did some digging and came up with the following function after slightly modifying the raster package itself so that it uses the third url. 我做了一些挖掘,并在略微修改raster包本身之后提出了以下函数,以便它使用第三个URL。 You can input Longitude and Latitude values here. 您可以在此输入LongitudeLatitude值。 Note that this is only useful if you want to download the files based on Latitude & Longitude. 请注意,仅当您要根据纬度和经度下载文件时,此功能才有用。

SRTM<-function(lon, lat) {
  stopifnot(lon >= -180 & lon <= 180)
  stopifnot(lat >= -60 & lat <= 60)
  rs <- raster(nrows=24, ncols=72, xmn=-180, xmx=180, ymn=-60, ymx=60 )
  rowTile <- rowFromY(rs, lat)
  colTile <- colFromX(rs, lon)
  if (rowTile < 10) { rowTile <- paste('0', rowTile, sep='') }
  if (colTile < 10) { colTile <- paste('0', colTile, sep='') }

  f <- paste('srtm_', colTile, '_', rowTile, sep="")
  theurl <- paste("http://srtm.csi.cgiar.org/wp-content/uploads/files/srtm_5x5/TIFF/", f, ".ZIP", sep="")
  utils::download.file(url=theurl, destfile='srtm_40_0.zip', method="auto", quiet = FALSE, mode = "wb", cacheOK = TRUE)
}

Example: 例:

SRTM(lon=16, lat=48)

This will result in a file named srtm_40_03.zip in your folder which would normally contain a tif , a hdr and a tfw file of the same name. 这将导致文件夹中名为srtm_40_03.zip的文件通常包含同名的tifhdrtfw文件。 Use them for further process as usual. 像往常一样使用它们进一步处理。

EDIT DATE 22-JAN-19: The srtm link as changed (as well), the above code has been adapted to reflect this. 编辑日期22-JAN-19: srtm链接已更改(以及),上面的代码已经过调整以反映这一点。

I had the exact same error while trying to downldoad SRTM data using raster::getData() . 尝试使用raster::getData()下载SRTM数据时,我遇到了完全相同的错误。 As mentioned by samAct , the problem is related to the URL's that are not accessible anymore. 正如samAct所述,问题与不再可访问的URL有关。

My solution was to edit the getData function so that it tries first the http://srtm.csi.cgiar.org/SRT-ZIP/SRTM_V41/SRTM_Data_GeoTiff/FILENAME URL. 我的解决方案是编辑getData函数,以便首先尝试http://srtm.csi.cgiar.org/SRT-ZIP/SRTM_V41/SRTM_Data_GeoTiff/FILENAME URL。

To use my edited version of the raster package simply use `devtools::install_github("pokyah/raster"). 要使用我编辑的光栅包版本,只需使用`devtools :: install_github(“pokyah / raster”)。 This will overwrite your current version and make the getData work with the valid URL. 这将覆盖您当前的版本并使getData与有效的URL一起使用。

devtools::install_github("pokyah/raster")
library(raster)

Then, you can use this function to download the SRTM data for your region of interest : 然后,您可以使用此功能下载您感兴趣的区域的SRTM数据:

# @param country_code.chr a character specifying the ISO contrycode. Ex : BE for belgium
# @param NAME_1.chr a character specifying the NAME_1 value for lower than country level information
# @param aggregation_factor.num a numeric specifying the aggregation factor to get the desired spatial resolution
# @param EPSG.chr a character specifying the EPSG code of the desired Coordiante Reference System (CRS)
# @param path.chr a character specifying the path where to dowload the SRTM data

build_highRes_terrain_rasters.fun <- function(country_code.chr, NAME_1.chr=NULL, aggregation_factor.num=NULL, EPSG.chr=NULL, path.chr) {
  # Path to downloaded SRTM Tiles refs
  srtm.tiles.ref <- raster::shapefile("<PATH_TO_DOWNLOADED_TILES_REFS")

  # Get country geometry first
  extent.sp <- raster::getData('GADM', country=country_code.chr, level=1)

  if(!is.null(NAME_1.chr)){
    extent.sp <- subset(extent.sp, NAME_1 == NAME_1.chr)
  }

  # Intersect extent geometry and tile grid
  intersects <- rgeos::gIntersects(extent.sp, srtm.tiles.ref, byid=T)
  tiles      <- srtm.tiles.ref[intersects[,1],]

  # Download tiles using getData
  # inspired from https://www.gis-blog.com/download-srtm-for-an-entire-country/
  srtm_list  <- list()
  for(i in 1:length(tiles)) {
    lon <- extent(tiles[i,])[1]  + (extent(tiles[i,])[2] - extent(tiles[i,])[1]) / 2
    lat <- extent(tiles[i,])[3]  + (extent(tiles[i,])[4] - extent(tiles[i,])[3]) / 2

    tile <- getData('SRTM', #data are downloaded from http://www.cgiar-csi.org/. See getData do of pokyah/raster repo on github
                    lon=lon,
                    lat=lat,
                    download = FALSE,
                    path = path.chr)

    srtm_list[[i]] <- tile
  }

  # Mosaic tiles
  srtm_list$fun <- mean
  srtm_mosaic.ras <- do.call(raster::mosaic, srtm_list)

  # Crop tiles to extent borders
  extent.elevation.ras <- raster::crop(srtm_mosaic.ras, extent.sp)
  extent.elevation.ras <- raster::mask(extent.elevation.ras, extent.sp)

  # transform to desired CRS
  if(!is.null(EPSG.chr)){
    raster::projectRaster(extent.elevation.ras, crs = toString((dplyr::filter(rgdal::make_EPSG(), code==EPSG.chr))$prj4))
  }

  # aggregate to lower resolution
  # inspired from https://stackoverflow.com/questions/32278825/how-to-change-the-resolution-of-a-raster-layer-in-r
  if(!is.null(aggregation_factor.num)){
    extent.elevation.ras <- raster::aggregate(extent.elevation.ras, fact=aggregation_factor.num)
  }

  # compute the slope from the elevation
  # inspired from https://rpubs.com/etiennebr/visualraster
  extent.slope.ras <- raster::terrain(extent.elevation.ras, opt="slope", unit="degrees")
  extent.aspect.ras <- raster::terrain(extent.elevation.ras, opt="aspect", unit="degrees")
  extent.roughness.ras <- raster::terrain(extent.elevation.ras, opt="roughness")

  # compute the aspect from the elevation
  extent.terrain.ras = raster::stack(
    extent.elevation.ras,
    extent.slope.ras,
    extent.aspect.ras,
    extent.roughness.ras)
}

hope it helps ! 希望能帮助到你 !

today, 21-01-2019, the link was still broken, even the one corrected by pokyah. 今天,21-01-2019,链接仍然被打破,甚至是由pokyah纠正的那个。 New working version at: 新工作版:

devtools::install_github("fedefyco/raster")
library(raster)

I got all the same errors and I found a solution using httr package to download it ( source here ).我得到了所有相同的错误,我找到了一个使用httr package 来下载它的解决方案(来源在这里)。

I tried BUT THIS DID NOT WORK :我试过了,但这没有用:

url <- "https://srtm.csi.cgiar.org/wp-content/uploads/files/srtm_5x5/TIFF/srtm_37_04.zip"

library(RCurl)
url2 <- getURL(url)

download.file(url, "test", mode = "auto", method = "curl")
download.file(url, "test", mode = "wb", method = "curl")
download.file(url, "test")
# ... and so on 

library(data.table)
fread(url)

This worked:这有效:

library(httr)
httr::set_config(httr::config(ssl_verifypeer=0L))
GET(url, httr::write_disk(path = basename(url), overwrite = TRUE))

I needed to change the raster .download function for this.为此,我需要更改光栅.download function。 I could make definitive changes with reassignInPackage from R.utils (I think it is definitive) ( reassignInPackage(name=".download", pkgName="raster", value="my.fn") ) but I prefer a temporary change.我可以使用R.utils中的reassignInPackage进行最终更改(我认为它是最终的)( reassignInPackage(name=".download", pkgName="raster", value="my.fn") )但我更喜欢临时更改。

Place this in your code and it will fix the getData function:将其放入您的代码中,它将修复getData function:

y.fn <- function(aurl, filename){
  cat("You wanna download: ", aurl, "\n")
  cat("You wanna save it there : ", filename, "\n\n")
  httr::set_config(httr::config(ssl_verifypeer=0L))
  httr::GET(aurl, httr::write_disk(path = filename, overwrite = TRUE))
}
tmpfun <- get(".download", envir = asNamespace("raster"))
environment(my.fn) <- environment(tmpfun)
attributes(my.fn) <- attributes(tmpfun)  # don't know if this is really needed
assignInNamespace(".download", my.fn, ns="raster")

and try again然后再试一次

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM