rmapsgeospatialspatial-data

The points of occurrence (gbif) and the maps don't coincide when i use worldclim data


i'm new in the R world and i'm trying to do a species distribution model, but when i plot my result, the points stay out from my map, i tried to change CRS but i didn't solve my problem, now i'll go to show you my code

library(dismo)
library(raster)
library(dplyr)
library(rnaturalearth)

Here i downloaded my species from gbif

gbif("Miniopterus", "schreibersii" , download=F)
minio<- gbif("Miniopterus", "schreibersii" , download=T) #you need 2 min approximately

i saw the basis of record and then i selected 2 different types

table(minio$basisOfRecord)

#Filter data minio----

minio<- minio%>%
  filter(!is.na(lat))%>%
  filter(!is.na(lon))%>%
  filter(year>1980)%>%
  filter(basisOfRecord %in% c("HUMAN_OBSERVATION", "OBSERVATION"))

class(minio)
nrow(minio)

i selected only longitude and latitude

miniogeo<-minio%>%
  select(lon,lat)

head(miniogeo)
miniogeo$species<-1
head(miniogeo)
nrow(miniogeo)

And i created the coordinates and set the crs

coordinates(miniogeo) <-c("lon","lat") 
crs(miniogeo) <- "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"
proj4string(miniogeo) <- CRS("+init=epsg:4326")

Here start problems for me, i tried a lot of type of function for create a map but this is the most efficient (the most efficient of those functions I have found). I need to have a zoom of spain and portugal, and i need to exclude "Africa".

Europe <- ne_countries(scale="medium", type="map_units", returnclass="sf", continent="Europe")
Worldclim<-raster::getData('worldclim', var='bio', res=2.5) 

Europe <- Europe %>%
  dplyr::select(geometry,name_long)  %>%    
  filter(name_long!='Russian Federation')

plot(Worldclim[[1]]) #or plot(worldclim$bio1)
plot(st_geometry(Europe))
points(miniogeo, cex=0.1)

envData<-crop(Worldclim, Europe)
EuropePred <- mask(envData, Europe) #we create a new raster without NA value 

And here i plotted my points but, as you can see, my points went out of my map

plot(EuropePred[[1]]) #example
points(miniogeo, cex=0.2)

then i tried to do a zoom to Spain and Portugal.

extSpnPrt<-extent(c(-11,10,35,56))
miniogeo<-crop(miniogeo,extSpnPrt) 
SpainPort<-crop(EuropePred,extSpnPrt)

plot(SpainPort$bio2)
points(miniogeo, cex=0.1)

There is someone that can understand my problem? i'm really really sorry, i tried a lot of time for undestand better but my level in R is so basics for now. I say thank you to all that dedicate the time for read this. I hope you have a good day

This is the result of my map with only geometry and with worldclim data enter image description here


Solution

  • One way to create a SpatialPointsDataFrame from your data.frame minio is:

    coordinates(minio) <-  ~ lon + lat 
    crs(minio) <- "+proj=longlat"
    

    This is NOT correct:

    coordinates(minio) <- c("lon", "lat") 
    

    Result:

    plot(minio, cex=.5, col="red")
    lines(as(Europe, "Spatial"))
    

    enter image description here