在 R 中将纬度/经度转换为海拔高度

9

有没有人知道在R中是否有工具可以通过给定的纬度和经度找到某个位置的海拔高度?


1
你想找出地球表面给定位置的海拔高度吗? - ChrisBD
5个回答

13

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

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

> 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")可以下载它。

这两个模型之间的差异是因为它们只是基于卫星数据的近似值。不要指望从中定位山脉。


1
这就是我写它的原因 :) - geonames包! - Spacedman
我收到了需要传递用户名的消息。我找到了http://www.geonames.org/export/web-services.html#srtm3,但它没有说明如何通过GNsrtm3函数进行操作(而且似乎该函数无法将用户名作为参数)。 - David LeBauer
1
@DavidLeBauer:在运行函数之前添加此命令:options(geonamesUsername="YourUserName")。 - Metariat
@Spacedman 这个函数现在已经过时了吗?它显示出错信息:Error in url(url, open = "r") : cannot open the connection to 'http://api.geonames.org/srtm3JSON?lat=NA&lng=NA& 即使是在虚拟数据上也无法工作,仍然会出现相同的错误。 - Rspacer
@Biotechgeek 对我仍然有效,但自2012年起,您需要一个用户名来使用API - 已完成编辑! - Spacedman

10

更新:Earthtools已不存在,因此本回答已过时。我建议使用@Spacedman的回答。

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

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)))

你的做法看起来很有趣,所以我在我所知道的一个城镇的纬度和经度上试用了一下 链接。我使用了 latitude <- 41.25longitude <- -77.3,实际得到的结果是293而不是预期的597。我使用方法有误吗? - Tyler Rinker
问题很可能与数据质量有关。根据链接的Earth Tools页面,海拔高度以3弧秒(约90米)的分辨率给出。在90米内,可能会有很多山丘,因此不要期望完美的准确性。 - Richie Cotton
2
另外,41.25度并不等同于41度25秒,因为一个度只有60秒。使用正确的位置,该服务返回568米。 - Richie Cotton
谢谢。虽然这不是我的研究领域,但R解决方案看起来非常有趣。我无知地认为41度25'(分钟)只是一个小数。错了!感谢您提供的信息。对于像我这样的其他人(无知者),转换很简单。将分钟乘以60,就是你的小数。我从链接中获得了这个信息。感谢分享。 - Tyler Rinker

2
你可以通过Google Maps海拔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"

1

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

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

elevation(coords, username = "myusernamehere")

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接