I encountered an issue where I wanted to extract points located within
a specific shapefile, in this case the Highveld ecoregion and Gauteng.
Instead of extracting the points in R I assign them a 1/0 (TRUE/FALSE) value in
a new column using point.in.polygon , following this I the filter function
in R to create a new dataframe where Highveld == 1. In theory you could use the
over function which is part of the rgdal package, but I found this
cumbersome.
So here we have a nice example dataset that is geo-referenced, lets call it libsum.csv
Date ;Event ;Latitude ;Longitude ;Height(m)
2014/2/3 ;Rain/flooding ;-26.12 ;28.02 ;1749
2014/2/3 ;Rain/flooding ;-26.14 ;26.15 ;1646
2014/2/3 ;Rain/flooding ;-26.20 ;27.51 ;1574
2014/2/3 ;Rain/flooding ;-26.00 ;28.12 ;16
2014/2/3 ;Rain/flooding ;-25.56 ;28.08 ;1539
2014/2/3 ;Rain/flooding ;-25.51 ;28.11 ;1432
2014/2/3 ;Rain/flooding ;-26.08 ;27.59 ;1603
2014/2/3 ;Rain/flooding ;-26.07 ;27.54 ;1747
2014/2/3 ;Rain/flooding ;-26.06 ;28.05 ;1546
2014/2/3 ;Rain/flooding ;-26.07 ;27.54 ;1727
2014/2/3 ;Rain/flooding ;-23.02 ;29.54 ;950
2014/2/3 ;Rain/flooding ;-22.52 ;30.28 ;741
2014/2/3 ;Rain/flooding ;-26.41 ;25.27 ;1349
2014/2/3 ;Rain/flooding ;-26.48 ;26.00 ;1504
2014/2/3 ;Rain/flooding ;-26.57 ;24.43 ;1199
2014/2/3 ;Rain/flooding ;-27.12 ;25.58 ;1356
2014/2/3 ;Rain/flooding ;-26.39 ;25.46 ;1405
2010/2/3 ;Other ;-26.00 ;27.55 ;1480
2014/2/3 ;Other ;-25.26 ;27.55 ;1362
Now we can open R
# Load some usefull libraries
library ( tidyverse )
library ( ggplot2 )
library ( reshape2 )
library ( viridis )
library ( rgdal )
library ( grid )
library ( readr )
library ( gridExtra )
library ( raster )
library ( GSODR )
library ( rgeos )
# sudo apt install libgeos\*
library ( sp )
theme_set ( theme_classic ( base_size = 22 ))
# Lets load the df first
df <- read.csv ( "libsum.csv" , sep = ";" , header = TRUE )
#To actually work with the shapefiles, omit the map_data function
# and invoke it later
basemap_1 <- readOGR ( dsn = "./" , layer = "ZAF_adm1" )
ecoregions <- readOGR ( dsn = "./" , layer = "Ecoregions2017" )
# To extract a layer to use in a plot, in this case Gauteng and the Highveld,
# do:
gauteng <- map_data ( basemap_1 [ basemap_1 $ NAME_1 == "Gauteng" , ])
highveld <- map_data ( ecoregions [ ecoregions $ ECO_ID == "81" , ])
# Here we extract data that falls within the Higheld ecoregion and Gauteng
# We create a new column in the df where a 1 or 0 will be assigned if it falls inside the
# lat and lon of the corresponding polygon
df $ Highveld <- point.in.polygon ( df $ Longitude , df $ Latitude , highveld $ long , highveld $ lat )
df $ Highveld <- as.character ( df $ Highveld )
# And we do the same for Gauteng
df $ Gauteng <- point.in.polygon ( df $ Longitude , df $ Latitude , gauteng $ long , gauteng $ lat )
df $ Gauteng <- as.character ( df $ Gauteng )
After running this the df should look something like this
Date ;Event ;Latitude ;Longitude ;Height(m) ;Highveld;Gauteng
2014/2/3 ;Rain/flooding ;-26.12 ;28.02 ;1749 ;1 ;1
2014/2/3 ;Rain/flooding ;-26.14 ;26.15 ;1646 ;1 ;0
2014/2/3 ;Rain/flooding ;-26.20 ;27.51 ;1574 ;1 ;1
2014/2/3 ;Rain/flooding ;-26.00 ;28.12 ;16 ;1 ;1
2014/2/3 ;Rain/flooding ;-25.56 ;28.08 ;1539 ;0 ;1
2014/2/3 ;Rain/flooding ;-25.51 ;28.11 ;1432 ;0 ;1
2014/2/3 ;Rain/flooding ;-26.08 ;27.59 ;1603 ;1 ;1
2014/2/3 ;Rain/flooding ;-26.07 ;27.54 ;1747 ;1 ;1
2014/2/3 ;Rain/flooding ;-26.06 ;28.05 ;1546 ;1 ;1
2014/2/3 ;Rain/flooding ;-26.07 ;27.54 ;1727 ;1 ;1
2014/2/3 ;Rain/flooding ;-23.02 ;29.54 ;950 ;0 ;0
2014/2/3 ;Rain/flooding ;-22.52 ;30.28 ;741 ;0 ;0
2014/2/3 ;Rain/flooding ;-26.41 ;25.27 ;1349 ;0 ;0
2014/2/3 ;Rain/flooding ;-26.48 ;26.00 ;1504 ;1 ;0
2014/2/3 ;Rain/flooding ;-26.57 ;24.43 ;1199 ;0 ;0
2014/2/3 ;Rain/flooding ;-27.12 ;25.58 ;1356 ;1 ;0
2014/2/3 ;Rain/flooding ;-26.39 ;25.46 ;1405 ;1 ;0
2010/2/3 ;Other ;-26.00 ;27.55 ;1480 ;0 ;1
2014/2/3 ;Other ;-25.26 ;27.55 ;1362 ;0 ;0
Now we can create a new dataframe to work with that only contains the data that
falls within the polygons of interest
df_hv <- df %>% filter ( Highveld == 1 )
df_gp <- df %>% filter ( Gauteng == 1 )