在R中将纬度/经度转换为高度
Posted
技术标签:
【中文标题】在R中将纬度/经度转换为高度【英文标题】:Conversion for latitude/longitude to altitude in R 【发布时间】:2012-02-16 22:10:52 【问题描述】:有谁知道R中是否有一个工具可以根据纬度和经度找到一个位置的海拔高度?
【问题讨论】:
您想知道地球表面给定位置的高度是多少? 【参考方案1】:或者你可以使用从geonames中查找的包,从srtm3数字高程模型中获取值:
首先通过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") 会得到它。
这两种模型的区别在于它们只是基于卫星数据的近似值。不要指望从中找出山脉。
【讨论】:
这就是我写它的原因:) - geonames 包! 我收到我需要传递我的用户名的消息。我找到了geonames.org/export/web-services.html#srtm3,但它没有说明如何通过 GNsrtm3 函数执行此操作(而且该函数似乎不能将用户名作为参数) @DavidLeBauer:在运行函数之前添加这个命令:options(geonamesUsername="YourUserName") @Spacedman 这个功能现在过时了吗?它说。Error in url(url, open = "r") : cannot open the connection to 'http://api.geonames.org/srtm3JSON?lat=NA&lng=NA&
即使在虚拟数据上也不起作用..同样的错误
@Biotechgeek 仍然对我有用,但从 2012 年开始,您需要 API 的用户名 - 编辑完成!【参考方案2】:
更新: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)))
【讨论】:
你看起来很有趣,所以我在我知道的一个小镇link 的经纬度上尝试了它。我使用latitude <- 41.25
和 longitude <- -77.3
产生 293 而不是预期的 597。我是不是用错了?
问题很可能与数据质量有关。根据链接的地球工具页面,海拔高度以 3 弧秒(约 90m)的分辨率给出。在 90m 范围内,您可以有很多山坡,所以不要指望完美的准确性。
另外,41.25 度与 41 度、25 秒不同,因为一个度只有 60 秒。使用正确的位置,服务返回 568m。
谢谢。这不是我的研究领域,但 R 解决方案看起来很有趣。我无知地认为 41 度 25'(分钟)只是小数。错误的!感谢您的信息。对于像我这样的其他人(无知),转换很简单。将分钟乘以 60,这就是你的小数。我从link 收集到这个,谢谢分享。【参考方案3】:
您可以通过 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"
【讨论】:
【参考方案4】:有 R 包,例如 RCurl,允许 Web 查询。还有网络资源,进一步的规范将需要......嗯,......更多的细节。
http://gisdata.usgs.net/xmlwebservices2/elevation_service.asmx?op=getElevation
【讨论】:
【参考方案5】:您还可以使用在内部使用地名的包 rgbif。我喜欢这个选项 因为您可以提供数据框作为输入,以及其他输入格式。同样,您需要提供您的 GeoNames 用户名。
library(rgbif)
coords <- data.frame(decimalLatitude = 54.481084,
decimalLongitude = -3.220625)
elevation(coords, username = "myusernamehere")
如果您提供数据框作为输入,它必须包含名为 decimalLatitude 和 decimalLongitude 的坐标列,这与 DarwinCore 标准相关。
您可以使用参数“elevation_model”在不同的模型选项中进行选择。
【讨论】:
以上是关于在R中将纬度/经度转换为高度的主要内容,如果未能解决你的问题,请参考以下文章