9

有谁知道R中是否有一个工具可以在给定纬度和经度的情况下找到一个位置的海拔高度?

4

5 回答 5

13

或者您可以使用从 geonames 查找的包,并从 srtm3 数字高程模型中获取值:

首先通过在 上注册获得一个 geonames 用户名geonames.org。然后设置它:

> options(geonamesUsername="myusernamehere")

然后:

> require(geonames)
> GNsrtm3(54.481084,-3.220625)
  srtm3       lng      lat
1   797 -3.220625 54.48108

或 gtopo30 模型:

> GNgtopo30(54.481084,-3.220625)
  gtopo30       lng      lat
1     520 -3.220625 54.48108

geonames 在 CRAN 上,所以 install.packages("geonames") 会得到它。

这两个模型之间的区别在于它们只是基于卫星数据的近似值。不要指望从中找出山脉。

于 2012-01-23T17:24:49.560 回答
10

更新: Earthtools 不再存在,所以这个答案已经过时了。我推荐@Spacedman 的答案。

正如 DWin 所说,这有两个部分:使用 Web 服务找到一个好的数据源,然后在 R 中解析它。这个答案使用了earthtools.org service

library(RCurl)
library(XML)

latitude <- 52.4822
longitude <- -1.8946
url <- paste(
    "http://www.earthtools.org/height",
    latitude, 
    longitude,
    sep = "/"
)

page <- getURL(url)
ans <- xmlTreeParse(page, useInternalNodes = TRUE)
heightNode <- xpathApply(ans, "//meters")[[1]]
(height <- as.numeric(xmlValue(heightNode)))
于 2012-01-23T15:44:50.917 回答
2

您可以通过 Google Maps Elevation API 访问高程数据。在 R 中,您可以通过我的googleway包使用它

要使用 Google Maps API,您需要 API 密钥

library(googleway)

api_key <- "your_api_key"

df_locations <- data.frame(lat = c(54.481084), lon = c(-3.220625))

google_elevation(df_locations = df_locations, key = api_key)

# $results
# elevation location.lat location.lng resolution
# 1  813.9291     54.48108    -3.220625   610.8129
# 
# $status
# [1] "OK"
于 2017-01-20T23:13:46.223 回答
1

有允许 Web 查询的 R 包,例如 RCurl。还有网络资源,进一步的规范将需要......嗯,......更多的细节。

http://gisdata.usgs.net/xmlwebservices2/elevation_service.asmx?op=getElevation

于 2012-01-23T15:33:20.290 回答
0

您还可以使用在内部使用地名的包 rgbif。我喜欢这个选项,因为您可以提供数据框作为输入,以及其他输入格式。同样,您需要提供您的 GeoNames 用户名。

library(rgbif)

coords <- data.frame(decimalLatitude = 54.481084, 
                     decimalLongitude = -3.220625)

elevation(coords, username = "myusernamehere")

如果您提供数据框作为输入,它必须包含名为 decimalLatitude 和 decimalLongitude 的坐标列,这与 DarwinCore 标准相关。

您可以使用参数“elevation_model”在不同的模型选项中进行选择。

于 2022-01-27T12:48:20.407 回答