在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 &lt;- 41.25longitude &lt;- -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中将纬度/经度转换为高度的主要内容,如果未能解决你的问题,请参考以下文章

在php中将地址转换为纬度和经度

如何在iPhone开发中将地址转换为纬度和经度[重复]

如何在目标c中将gps北和gps西转换为纬度/经度

在java中将地址转换为纬度和经度以获得基于距离的建议

如何在 Java 中将纬度和经度转换为 x,y?

在Android中通过经度和纬度获取高度