Vous utilisez R pour extraire des données de WorldClim? [fermé]

9

J'ai un ensemble de données avec 1000 latitudes-longitudes différentes. Je souhaite extraire la température annuelle moyenne et les précipitations annuelles pour chacune de ces coordonnées. Ces données peuvent être facilement obtenues auprès de WorldClim et traitées à l'aide de DIVA-GIS.

Est-il possible de le faire sur R?

Je veux que ma sortie finale soit une trame de données avec la température annuelle et les précipitations pour chaque coordonnée. Je suis nouveau chez GIS dans R, donc je cherche un morceau de code de base avec les bibliothèques requises pour cette sortie.

Cendre
la source

Réponses:

17

Vous pouvez utiliser le rasterpackage pour télécharger les données WorldClim, voir ?getdatapour connaître la résolution, les variables et les coordonnées.

Comme exemple:

library(raster)
library(sp)

r <- getData("worldclim",var="bio",res=10)

Bio 1 et Bio12 sont la température annuelle moyenne et les précipitations annuelles:

r <- r[[c(1,12)]]
names(r) <- c("Temp","Prec")

Je crée des points aléatoires comme exemple, dans votre cas, utilisez des coordonnées pour créer un SpatialPointobjet.

points <- spsample(as(r@extent, 'SpatialPolygons'),n=100, type="random")    

Enfin, utilisez extract. Avec cbind.data.frameet coordinatesvous obtiendrez le désir data.frame.

values <- extract(r,points)

df <- cbind.data.frame(coordinates(points),values)

J'ai utilisé des points aléatoires, donc j'en ai eu beaucoup NA. Il faut s'y attendre.

head(df)
           x          y Temp Prec
1  112.95985  52.092650  -37  388
2  163.54612  85.281643   NA   NA
3   30.95257   5.932434  270  950
4   64.66979  40.912583  150  150
5 -169.40479 -58.889104   NA   NA
6   51.46045  54.813600   36  549

plot(r[[1]])
plot(points,add=T)

entrez la description de l'image ici

N'oubliez pas que les données WorldClim ont un facteur d'échelle de 10, donc Temp = -37-3,7 ºC.


Avec exemple de coordonnées:

library(raster)
library(sp)

r <- getData("worldclim",var="bio",res=10)

r <- r[[c(1,12)]]
names(r) <- c("Temp","Prec")

lats <- c(9.093028 , 9.396111, 9.161417)
lons <- c(-11.7235, -11.72975, -11.709417) 

coords <- data.frame(x=lons,y=lats)

points <- SpatialPoints(coords, proj4string = r@crs)

values <- extract(r,points)

df <- cbind.data.frame(coordinates(points),values)

df
          x        y Temp Prec
1 -11.72350 9.093028  257 2752
2 -11.72975 9.396111  257 2377
3 -11.70942 9.161417  257 2752
aldo_tapia
la source
C'était vraiment utile!
Ash
Donc, j'ai pointsqui est une trame de données de lats et longs de mon ensemble de données. Ensuite, je cours exactement comme vous. Cependant, quand je lance que valuesje reçois une erreur: not compatible with requested type. J'ai également remarqué que votre pointsmarque juste l'étendue de l'échantillon, mais ne produit pas un vecteur avec des coordonnées lat-long
Ash
Oui, degrés décimaux. Parce que CRS de WorldClim est WGS 84 lat / lon (EPSG 4326). Vous pouvez importer des coordonnées dans un autre CRS et le convertir avec spTransform. Si vous avez des coordonnées dans DDMMSS, transformez-les en DD.MMM. Deuxièmement, vous avez écrit sur différentes coordonnées, donc je l'interprète comme des points, vous pouvez utiliser des polygones à la place avec le même schéma. Si vous disposez d'une couche contenant ces informations, utilisez-la shapefilepour la charger.
aldo_tapia
Je ne comprends pas votre deuxième point. Peut-être, je n'ai pas expliqué clairement. J'ai marqué l'erreur ici: eval.in/733232
Ash
Ah ok. spsamplenécessite un objet spatial pour définir les limites de l'échantillon. Les entrées sont des grilles, des polygones ou des lignes. Ce que j'ai fait était d'utiliser la boîte de délimitation WorlClim pour définir l'étendue de l'échantillon. Je l'ai fait pour faire un exemple reproductible dans ma réponse. Dans votre cas, vous n'avez pas besoin d'utiliser spsample, vous avez déjà des coordonnées à échantillonner.
aldo_tapia