Search code examples
rgeospatial

Filter one data frame by the extent of another data frame


I have two data frames with lat and long columns(x,y) called "wind_ras_data" and "vec". I want to filter the values in the "vec" data frame by the extent of the "wind_ras_data" data frame.

> extent(wind_ras_data)
class      : Extent 
xmin       : -13519474 
xmax       : -13030428 
ymin       : 3809653 
ymax       : 4129625 

> extent(vec)
class      : Extent 
xmin       : -13579579 
xmax       : -12995375 
ymin       : 3740029 
ymax       : 4168294


# Does not work

vec_within <- vec %>% 
  filter(extent(vec) %in% extent(wind_ras_data))

#workflow

wind_ras_data <- as.data.frame(rasterToPoints(final_ras_wind)) %>% 
  pivot_longer(!c(x,y), names_to = "date", values_to = "wind") 

coordinates(wind_ras_data) <- c('x', 'y')

#Determine the projection of the lat-long coordinates, by default it is EPSG:4326
proj4string(wind_ras_data) <- CRS("+init=epsg:4326")

#Convert the coordinates to the used metric system (EPSG:3857)
wind_ras_data<-spTransform(wind_ras_data,CRS("+init=EPSG:3857")) 




vec <- vec_data %>%
  mutate(angle = (270 - (atan2(u, v) * (180/pi))%%360)) %>%  
  dplyr::select(x, everything()) %>% 
  dplyr::select(!c(u,v))

coordinates(vec) <- c('x', 'y')

#Determine the projection of the lat-long coordinates, by default it is EPSG:4326
proj4string(vec) <- CRS("+init=epsg:4326")

#Convert the coordinates to the used metric system (EPSG:3857)
vec<-spTransform(vec,CRS("+init=EPSG:3857"))

vec_within <- vec %>% 
  filter(gWithin(vec, wind_ras_data, byId = TRUE))

Solution

  • I ended up converting both to a dataframe then just filtering by the max and min of both extents.

    wind_ras_data <- as.data.frame(rasterToPoints(final_ras_wind)) %>% 
      pivot_longer(!c(x,y), names_to = "date", values_to = "wind") 
    
    # coordinates(wind_ras_data) <- c('x', 'y')
    # 
    # #Determine the projection of the lat-long coordinates, by default it is EPSG:4326
    # proj4string(wind_ras_data) <- CRS("+init=epsg:4326")
    # 
    # #Convert the coordinates to the used metric system (EPSG:3857)
    # wind_ras_data<-spTransform(wind_ras_data,CRS("+init=EPSG:3857")) %>% 
    #   as.data.frame()
    
    
    
    
    vec <- vec_data %>%
      mutate(angle = (270 - (atan2(u, v) * (180/pi))%%360)) %>%  
      dplyr::select(x, everything()) %>% 
      dplyr::select(!c(u,v))
    
    coordinates(vec) <- c('x', 'y')
    
    #Determine the projection of the lat-long coordinates, by default it is EPSG:4326
    proj4string(vec) <- CRS("+init=epsg:4326")
    
    #Convert the coordinates to the used metric system (EPSG:3857)
    vec<-spTransform(vec,CRS("+init=EPSG:3857")) %>% 
      as.data.frame()
    
    vec_within <- vec %>% 
      filter(x > -13519474,
             x < -13030225,
             y > 3809671,
             y < 4129620)