2015-11-11 4 views
0

Я интересуюсь историческими средними температурами на уровне города. WorldBank climate API предоставляет такие исторические данные по стране или river basin. Уровень страны слишком для меня. Уровень речного бассейна был бы очень хорошим, но я не нашел способа преобразования геокоординированных координат в течения речных бассейнов для сопоставления городов с речными бассейнами. Файлы формы из бассейнов представлены waterbase.org. Любая помощь в сопоставлении геокоординированных координат с идентификаторами бассейна Всемирного банка приветствуется.Географическое расположение (координаты или город) в WorldBank climate API river basin id

+0

пока я еще не сделал моддинга, я боюсь, что без какого-либо кода R, чтобы показать это, будет закрыта слишком широкая тема. – hrbrmstr

+0

слишком широкая тема? У меня есть широта и долгота, и я хотел бы сопоставить ее с идентификатором речного бассейна. –

+0

хорошо, да, поскольку вы предоставили нулевой код для чего-либо. – hrbrmstr

ответ

3

Несмотря на отсутствие исходного кода, вот как вы можете получить полный SpatialPolygonsDataFrame с basin_id, связанным с каждым многоугольником.

Одна часть их API позволяет указать идентификатор бассейна и возвращает KML-файл этого региона. Таким образом, вы можете запросить их все и stick'em вместе:

library(httr) 
library(sp) 
library(rgdal) 
library(pbapply) 

basin_list <- pblapply(1:468, function(basin_id) { 

    res <- GET(sprintf("http://climatedataapi.worldbank.org/climateweb/rest/v1/basin/kml/%d", basin_id)) 
    fil <- tempfile(fileext=".xml") 
    writeLines(content(res, as="text"), fil) 
    kml <- readOGR(fil, "Layer #0", verbose=FALSE, stringsAsFactors=FALSE) 
    unlink(fil) 
    kml$basin_id = basin_id 
    # these are useless 
    kml$Name <- kml$Description <-NULL 
    kml 

}) 

basin_list <- c(basin_list, makeUniqueIDs=TRUE) 
basins <- do.call(rbind, basin_list) 
[email protected] 

## basin_id 
## 0   1 
## 01  2 
## 02  3 
## 03  4 
## 04  5 
## 05  6 
## 06  7 
## 07  8 
## 08  9 
## 09  10 

Очевидно, что я не сидел в течение многих минут для всех 468, только 10 из них.

(На самом деле, я позволил ему поработать, делая другую работу и спас вас от того, чтобы генерировать файлы. Вы можете получить их в this github repo)

Чтобы увидеть, что она становится все бассейны:

plot(basins) 

enter image description here

Там является ISS ue с ошибками топологии из гигантского фрейма данных, поэтому, если вам нужно определить, в каком полигоне находится конкретная пара lat/lon (так что вы можете сопоставить ее с идентификатором бассейна), вам придется немного поработать над этим:

library(rgeos) 

# pick a random point in basin 3 
spot <- spsample(basin_list[[3]], 1, "random") 

# now try to find it in reverse 
which(sapply(1:468, function(i) gContains(basin_list[[i]], spot))) 

Это не сложные полигоны, так что это довольно быстро.

Другие могут успеть упростить это немного (то есть правильно исправить ошибки топологии полигонов).

Кроме того, почему бы добр к серверу API Worldbank и делать как:

save(basin_list, basins, file="basins.rda") 

и

writeOGR(basins, ".", "basins", driver="ESRI Shapefile") 
# or 
geojsonio::geojson_write(basins, geometry="polygon", group="basin_id", "basins.json") 

поэтому у вас есть наборы данных на местном уровне и не нужно, чтобы воссоздать их.

+0

большое спасибо! Я перевариваю его. –

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

  • Нет связанных вопросов^_^