Adele
Adele

Reputation: 93

Removing redundant areas from a map in R (shapefile)

I plotted a few European countries on a map, but there are some outliers which I don't need. I tried to remove them from my spatial df using different ways suggested in similar questions but they didn't work for this case. Could you please give me your ideas on removing them? I appreciate it. The shape file is available here

EDIT: I need to remove these areas not only from the map, but also from the spatial data frame.

library(rgdal)
library(raster) 

myCountries <- c("Austria", "Belgium", "Czech Republic", "Denmark", "Estonia", "Finland",
                 "France", "Germany", "Latvia", "Hungary", "Iceland", "Ireland", "Italy",
                 "Netherlands", "Norway", "Portugal", "Poland", "Spain", "Sweden", "Switzerland",    
                 "Turkey", "United Kingdom")


countries  <- readOGR('ne_110m_admin_0_countries.shp')

eurcountries <- countries[countries$NAME_EN %in% myCountries ,]

eurcountries2<-spTransform(eurcountries, CRS("+proj=longlat +datum=NAD83"))

plot(eurcountries2)

Upvotes: 0

Views: 624

Answers (2)

Robert Hijmans
Robert Hijmans

Reputation: 46991

Here is how you can do that with terra (the replacement for raster):

myCountries <- c("Austria", "Belgium", "Czech Republic", "Denmark", "Estonia", "Finland",
                 "France", "Germany", "Latvia", "Hungary", "Iceland", "Ireland", "Italy",
                 "Netherlands", "Norway", "Portugal", "Poland", "Spain", "Sweden", "Switzerland",    
                 "Turkey", "United Kingdom")

library(terra)
countries  <- vect('ne_110m_admin_0_countries.shp')
eur <- countries[countries$NAME_EN %in% myCountries ,]

e <- ext(c(-28, 48, 35, 76)))
x <- crop(eur, e)

plot(x, "NAME_EN")

You can interactively find the extent you need for cropping by doing

 plot(eur)
 e <- draw()
 # now click on the map twice

Or subset interactively, like this:

 d <- disagg(eur)
 plot(d)
 s <- sel(d) # now draw a bounding box on the plot
 a <- aggregate(s, "NAME_EN")
 plot(a, "NAME_EN")

And you can coerce the SpatVector objects to sp or sf types like this:

 sf <- sf::st_as_sf(x) 
 library(raster)
 sp <- as(x, "Spatial")

Or vice versa with:

 y <- vect(sf)

Upvotes: 1

Tech Commodities
Tech Commodities

Reputation: 1959

Instead of using the SP package, I find the SF package is better as it plays well with ggplot2. Then limiting the canvas is straightforward and adds the ability to colour the countries.

library(rgdal)
library(ggplot2)

myCountries <- c("Austria", "Belgium", "Czech Republic", "Denmark", "Estonia", "Finland",
                 "France", "Germany", "Latvia", "Hungary", "Iceland", "Ireland", "Italy",
                 "Netherlands", "Norway", "Portugal", "Poland", "Spain", "Sweden", "Switzerland",    
                 "Turkey", "United Kingdom")

countries  <- readOGR("C:/R/projects/ne_110m_admin_0_countries/ne_110m_admin_0_countries.shp")

eurcountries <- countries[countries$NAME_EN %in% myCountries, ]
    
eurcountries3 <- sf::st_as_sf(eurcountries)

ggplot(eurcountries3) +
  geom_sf(aes(fill = ADMIN)) +
  lims(x = c(50,-40), y = c(30, 74)) +
  guides(fill = "none") +
  theme_void()

enter image description here

Upvotes: 0

Related Questions