Geoprocessing In R – Identify Points on a Polygon Layer From Survey Data
What happens when you have a bunch of survey data with GPS points, and you want to do Geoprocessing?
THERE IS AN EASIER WAY!
To start – I’m not sure if this is truly necessary but it seems like a good idea – convert your identify layer (TAZs, for example) to the same coordinate system as your points (likely WGS 1984, which matches GPS coordinates).
Then, load the sf package in R:
install.packages("sf") #only needs to be done once library(sf)
To read the identity layer, use:
taz = st_read("gis/tazlayer.shp")
Once that’s loaded, doing the identity process is simple:
joined_df = st_join(st_as_sf(surveydf, coords = c("LongitudeFieldName", "LatitudeFieldName"), crs = 4326, agr = "field"), taz["TAZ"])
What this does:
- st_as_sf is the function to turn another object into an sf object
- The surveydf is the survey dataframe (you’ll want to change this to match whatever you have)
- coords = c(“LongitudeFieldName”, “LatitudeFieldName”) tells st_as_sf the names of the coordinate fields
- crs = 4326 tells st_as_sf that the coordinates are in WGS1984 – if your coordinates are in another coordinate system (state plane, for example), you’ll need to change this
- agr = “field” tells st_as_sf the attribute-to-geometry relationship. In this case, the attributes are constant throughout the geometry (because it’s a point)
- The taz[“TAZ”] is the second part of the join – we’re joining the points to the TAZ layer and only taking the TAZ field (this could be expanded with something like taz[c(“TAZ”, “AREATYPE”)])
One caveat – the return of this (what joined_df will be after the above function is run) is a collection of geometry objects, so when joining to table data, it is best to take a data frame of the object… a la:
library(dplyr) df_out = df_in %>% Â Â left_join(as.data.frame(joined_df), by = "idField")
This is much faster than loading ArcMap or QGIS to do this work, and it keeps everything in one script, which makes life easier.