Извлечение высоты с веб-сайта для точек широты и долготы в Австралии с использованием R

Добрый день Всем,

Я пытаюсь получить данные о высоте примерно для 700 точек, которые у меня есть. Я подумал, что могу использовать код, предоставленный для того же вопроса (Преобразование для широты /долгота на высоту в R), к сожалению, я получаю ошибки при использовании пакета geonames, а на веб-сайте, который предоставляет лучший ответ, нет доступных данных о высоте в Австралии (ошибки приведены ниже).

Я нашел другой веб-сайт, который предоставляет очень точные данные о высоте для Австралии, но я понятия не имею, как я могу извлечь информацию из веб-страницы. Я думаю, что он использует API высот Google, но опять же я понятия не имею, как получить к нему доступ.

Когда я помещаю координаты «широта, долгота» в поле «поиск местоположения», он дает данные о высоте под картой. Однако я не могу найти это на исходной странице. Веб-сайт: http://www.daftlogic.com/sandbox-google-maps-find-altitude.htm.

некоторые примеры значений долготы, которые работают:

-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

person Adam    schedule 06.02.2014    source источник
comment
Я бы не знал об API Google Elevation, если бы не ваш вопрос! Хороший!   -  person jbaums    schedule 06.02.2014
comment
мне тоже, это очень полезный источник информации   -  person JeremyS    schedule 06.02.2014


Ответы (3)


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 координат с долготой в первом столбце и широтой во втором.

person jbaums    schedule 06.02.2014
comment
Отличный ответ! Большое спасибо, это сработало отлично. Привет, Адам - person Adam; 06.02.2014
comment
Я изменил это, чтобы также выдать имена мест, если вы подаете его с именем data.frame путем изменения (не позволяет мне правильно отформатировать комментарий, поэтому я добавил \n для важной новой строки): ans <- t(sapply(res[[1]], function(x) { c(x[['location']]['lat'], x[['location']]['lng'], x['elevation'], x['resolution']) })) \n rownames(ans) <- rownames(locs) \n return(ans) - person JeremyS; 06.02.2014
comment
Я просто хотел отметить, что этот метод имеет ограничение на запрос около 130 КБ (на момент этого комментария). Также кажется, что Google предпочитает, чтобы вы использовали их ключ API (см. console.developers.google.com/ apis/credentials), и желательно их js API (см. здесь: разработчики. google.com/maps/documentation/javascript/elevation). - person EconomiCurtis; 26.04.2016

В пакете raster есть ?getData для повышения прав SRTM.

Например:

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)

введите здесь описание изображения

person mdsumner    schedule 06.02.2014

Я написал пакет googleway, чтобы упростить реализацию ответа @jbaums. Для данных высоты вы можете использовать функцию 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()

введите здесь описание изображения

person SymbolixAU    schedule 16.10.2016
comment
Это было действительно полезно. Какую ошибку я получу, если превысю лимит запросов? И как с ними справиться? - person GabrielMontenegro; 12.01.2017
comment
@ JavierM88 Если вы превысите лимит, Google просто не предоставит вам больше данных до следующего дня. У Google есть платные варианты, где вы можете увеличить лимит. - person SymbolixAU; 12.01.2017