G'day Everyone,
我正试图获得一些高程数据,大约700点。我想我可能会使用提供给同一问题的代码(Conversion for latitude/longitude to altitude in R),遗憾的是我在使用geonames包时遇到错误,而最佳答案提供的网站没有提供澳大利亚海拔数据(FYI下面提供的错误) 。
我找到另一个网站,为澳大利亚提供非常准确的高程数据,但我不知道如何从网页中提取信息。我认为它正在使用谷歌提升API,但我再也不知道如何访问它。
当我将'lat,lon'坐标放入'搜索位置'框时,它会在地图下方提供高程数据。但是,我似乎无法在源页面中找到它。该网站为http://www.daftlogic.com/sandbox-google-maps-find-altitude.htm。
一些示例lon lat值有效:
-36.0736,146.9442
-36.0491,146.4622
我想知道是否有人可以帮我从R查询此网站,并提取高程数据?或者看起来好像很麻烦?我意识到网站上有一个批处理功能(最多100个位置),但能从R中做到这一点很酷。
谢谢大家,对不起,如果这非常明显。
干杯, 亚当
错误
使用地理名称时:
elevation <- GNgtopo30(adult$lat, adult$lon)
Error in getJson("gtopo30JSON", list(lat = lat, lng = lng)) :
error code 10 from server: Please add a username to each call in order for geonames to be able to identify the calling application and count the credits usage.
In addition: Warning message:
In readLines(u) :
incomplete final line found on 'http://ws.geonames.org/gtopo30JSON? lat=-36.0736&lng=146.9442'
使用查询代码时:
library(RCurl)
library(XML)
url <- paste("http://earthtools.org/height", adult$lat, adult$lon, sep = '/')
page <- getURL(url)
ans <- xmlTreeParse(page, useInternalNodes = TRUE)
Space required after the Public Identifier
SystemLiteral " or ' expected
SYSTEM or PUBLIC, the URI is missing
Extra content at the end of the document
Error: 1: Space required after the Public Identifier
2: SystemLiteral " or ' expected
3: SYSTEM or PUBLIC, the URI is missing
4: Extra content at the end of the document
答案 0 :(得分:9)
Google提供了Elevation API,它会返回JSON或XML响应。以下是使用JSON响应的示例,由fromJSON
包中的RJSONIO
解析。
googEl <- function(locs) {
require(RJSONIO)
locstring <- paste(do.call(paste, list(locs[, 2], locs[, 1], sep=',')),
collapse='|')
u <- sprintf('http://maps.googleapis.com/maps/api/elevation/json?locations=%s&sensor=false',
locstring)
res <- fromJSON(u)
out <- t(sapply(res[[1]], function(x) {
c(x[['location']]['lat'], x[['location']]['lng'],
x['elevation'], x['resolution'])
}))
rownames(out) <- rownames(locs)
return(out)
}
m <- matrix(c(146.9442, 146.4622, -36.0736, -36.0491), nc=2)
googEl(m)
lat lng elevation resolution
[1,] -36.0736 146.9442 163 152.7032
[2,] -36.0491 146.4622 171.7301 152.7032
googEl
函数需要matrix
或data.frame
个坐标,第一列为经度,第二列为纬度。
答案 1 :(得分:5)
?getData
包中的SRTM提升raster
。
例如:
library(raster)
m <- data.frame(lon = c(146.9442, 146.4622), lat = c(-36.0736, -36.0491))
x <- getData('alt', country = "AUS")
cbind(m, alt = extract(x, m))
lon lat alt
1 146.9442 -36.0736 164
2 146.4622 -36.0491 172
在单元格中使用插值而不是最近邻居:
cbind(m, alt = extract(x, m, method = "bilinear"))
lon lat alt
1 146.9442 -36.0736 164.9519
2 146.4622 -36.0491 172.1293
下载步骤只是找到之前保存在工作目录中的文件,因此只需要发生一次。
数据对象是RasterLayer
,您可以使用plot
等进行可视化:
plot(x)
points(m)
x
class : RasterLayer
dimensions : 5496, 5568, 30601728 (nrow, ncol, ncell)
resolution : 0.008333333, 0.008333333 (x, y)
extent : 112.8, 159.2, -54.9, -9.1 (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +datum=WGS84
data source : C:\temp\AUS_msk_alt.grd
names : AUS_msk_alt
values : -43, 2143 (min, max)
答案 2 :(得分:2)
我已经写了googleway
包来制作@ jbaums&#39;回答更容易实施。对于eleveation数据,您可以使用google_elevation()
函数
library(googleway)
## you need an API key
key <- "your_api_key"
## data:
df <- data.frame(lat = c(-36.0736, -36.0491),
lon = c(146.9442, 146.4622))
google_elevation(df_locations = df,
location_type = "individual",
key = key)
# $results
# elevation location.lat location.lng resolution
# 1 163.0000 -36.0736 146.9442 152.7032
# 2 171.7301 -36.0491 146.4622 152.7032
而且,只是为了踢,你也可以在地图上绘制位置
key <- "your_api_key"
google_map(data = df, key = key) %>%
add_markers()