2014-02-06 1 views
4

G'day Everyone,Распаковка высота с сайта для LAT/точек Lon в Австралии, используя R

Я пытаюсь получить некоторые данные о высоте примерно на 700 точек у меня есть. Я думал, что могу использовать код, предоставленный по тому же вопросу (Conversion for latitude/longitude to altitude in R), к сожалению, я получаю ошибки при использовании пакета geonames, а на веб-сайте, на котором лучше всего предоставляется ответ, нет доступных австралийских данных о высоте (ошибки указаны ниже FYI).

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

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

некоторые значения LAT пример LON, которые работают:

-36,0736, 146,9442

-36,0491, 146,4622

мне интересно, если кто-нибудь может помочь мне запросить этот сайт из R и извлекать высоту данные? Или это похоже на большую часть хлопот? Я понимаю, что на веб-сайте есть пакетная функция (до 100 местоположений), но было бы здорово сделать это от Р.

Спасибо всем, извините, если это очень очевидно.

Приветствия, Адам

ОШИБКИ

При использовании GEONAMES:

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

Я не знал бы, о API Elevation Google, если бы не ваш вопрос! Хороший! – jbaums

+0

меня тоже, это очень полезный источник информации – JeremyS

ответ

7

Там в Elevation API про с помощью Google, который возвращает ответ 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 координат с долготой в первом столбце и широты в секунду.

+0

Отличный ответ! Большое спасибо, он отлично работал. Cheers, Adam – Adam

+1

Я изменил это, чтобы также выплюнуть имена мест, если вы его передали с именем 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) ' – JeremyS

+0

Хорошая идея, @Jeremy, I 'll добавить редактирование моего сообщения и добавить, что в. – jbaums

4

Существует ?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) 

enter image description here

+0

+1 Также хороший вариант, @mdsumner. – jbaums

2

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

enter image description here

+0

Это было действительно полезно. Какую ошибку я получу, если превышу лимит запросов? И любой способ справиться с ними? – GabrielMontenegro

+0

@ JavierM88 Если вы превысите лимит, Google просто не предоставит вам никаких данных до следующего дня. Google заплатил варианты, где вы можете увеличить лимит. – SymbolixAU

Смежные вопросы