Home > Blockchain >  Add a buffer to geospatial point on map in ggplot2
Add a buffer to geospatial point on map in ggplot2

Time:01-12

I have a ggplot map with a location and would like to add a buffer (spatialPolygon) around this location. However, when I add the buffer to my ggplot, I get the error "Error in FUN(X[[i]], ...) : object 'x' not found.". I am not sure where to go from here.

my code

library(sp)
library(geosphere)
library(geobuffer)
library(ggplot2)
library(rworldmap)
library(rworldxtra)

# my location
colony.df <- data.frame(Long = c(-61.313002), Lat = c(-51.714750)) # keep as dataframe for map
colony <- data.frame(Long = c(-61.313002), Lat = c(-51.714750)) # transform for buffer


# Convert location dataframe to spatial points (SpatialPointsDataFrame)
coordinates(colony) <- cbind(colony$Long, colony$Lat)

# assign a CRS to the spatial object
proj4string(colony) = CRS(" proj=longlat  datum=WGS84  ellps=WGS84  towgs84=0,0,0") 

# create buffer around the colony
buf10km<- geobuffer_pts(xy = colony, dist_m = 10000)

# load shapefiles for ggplot

worldMap <- rworldmap::getMap(resolution = "high")
fi <- worldMap[which(worldMap$NAME == "Falkland Is."), ]


# create ggplot

p <- ggplot(colony.df)  
  # countries
  geom_polygon(data = fi, aes(long, lat, group = group), color = "grey20", fill = "grey60", size = 0.3)  
  # data
  geom_point(aes(x = Long, y = Lat), size = 3)  
  # visuals
  scale_x_continuous(breaks = scales::pretty_breaks(5), name = "Longitude (W)", expand = c(0, 0))  
  scale_y_continuous(breaks = scales::pretty_breaks(5), name = "Latitude (S)", expand = c(0, 0))  
  coord_quickmap(xlim = c(-64,-60), ylim = c(-50,-53))   # zoomed out
  theme_bw()  
  theme(axis.text.x = element_text(size = 10),
        axis.text.y = element_text(size = 10),
        axis.title.x = element_text(size = 12, vjust = 0),
        axis.title.y = element_text(size = 12, vjust = 2),
        panel.grid = element_blank())
p

# add buffer
p <- p   geom_polygon(aes(x=x, y=y), data = buf10km, color = "red", alpha = 0.2, size = .2)

p

CodePudding user response:

One option using sf rather than sp.

library(tidyverse)
library(sf)
#> Linking to GEOS 3.9.0, GDAL 3.2.1, PROJ 7.2.1

worldMap <- rworldmap::getMap(resolution = 'high')
fi <- worldMap[which(worldMap$NAME == "Falkland Is."), ]


colony <- data.frame(Long = c(-61.313002), Lat = c(-51.714750))

colony_sf <- colony %>%
  st_as_sf(coords = c('Long', 'Lat')) %>%
  st_set_crs(" proj=longlat  datum=WGS84  ellps=WGS84  towgs84=0,0,0")


colony_10km <-  st_buffer(colony_sf, units::as_units(10, 'kilometer'))


ggplot()  
  geom_polygon(data = fi, 
               aes(long, lat, group = group), 
               color = "grey20", 
               fill = "grey60", 
               size = 0.3)  
  geom_sf(data = colony_10km, fill = 'blue')  
  geom_sf(data = colony_sf, color = 'red')
#> Regions defined for each Polygons

Created on 2022-01-11 by the reprex package (v2.0.0)

CodePudding user response:

Just in case someone wanted to stick with sp rather than switching to sf, the issue with the original code was that the buffer polygon first needed to be converted back to a data.frame using fortify before being usable in a ggplot:

# covert geospatial buffer polygon to a shapefile
buf10km.df <- fortify(buf10km)

# add buffer
p <- p   geom_polygon(aes(x = long, y = lat), data = buf10km.df, color = "red", alpha = .2, size = .2)

  •  Tags:  
  • Related