Create buffer around spatial data in R - r

I have a spatial dataset of shopping centers that I would like to create buffers around in R.
I think these packages will be useful:
require(maptools)
require(geosphere)
I was able to do so for a set of coordinates, but not for spatial data. The code looks like this:
coordinates(locs) <- c("Longitude", "Latitude") # set spatial coordinates
fivekm <- cbind(coordinates(locs), X=rowSums(distm (coordinates(locs)[,1:2], fun = distHaversine) / 1000 <= 5)) # number of points within 5 km
But I don't know what function/package to use for a set of polygons. Can someone please advise on the function (or code) and I will go from there?
Thanks!

In library rgeos, there is the gBuffer function that works with SpatialPoints or SpatialPolygons.
The width parameter allows to set the distance to which you want to buffer. However, be careful, this distance is in the scale of the coordinates system used. Thus, in degrees and not in meters with non-projected data. As suggested by #Ege Rubak, you will have to project your data with spTransform first (be sure to use the appropriate CRS according to your location).
As for now, rgeos library works with library sp, but not (yet?) with the recent sf.

I think the only option at the moment is to project your longitude and latitude points to a flat map and then do everything there. As far as I know there are no packages for doing polygonal geometry on the sphere yet (I'm working on one, but there is no ETA).
Projection used to be done with spTransform from the sp package, but now it may be more convenient to use the more modern simple features package sf which has the function st_transform. The vignette https://cran.r-project.org/web/packages/sf/vignettes/sf1.html has a section called "Coordinate reference systems and transformations" to help you with this part. The buffering is described in the section "Geometrical operations".

The two previous post have covered the details but I thought it might be helpful to provide a workflow. This is assuming you have you are using points of lat and long. What is your original spatial data format?
Convert your coordinates into a Spatial Points Dataframe SpatialPointsDataFrame and assign it a geographic CRS (proj4) that matches your coordinate data (probably WGS84)
Change the projection to a local projected CRS with preferred units
Apply buffer to spatial point data frame, the width will now be in more usable units

Related

How can I edit the values of coordinates within a geojson file?

I am trying to map a geojson file (A map of Alaska precincts, downloaded from the division of elections and then converted online to geojson) onto a choropleth map using folium, the problem is the coordinates are in 7-digit numbers like this:
[ -16624764.227, 8465801.1497 ]
I read on a similar post that this was most likely a US coordinate system like UTM or State Plane, and recommended using an API to reproject it. Is it also possible to access the coordinates directly such as with geopandas and divide them by 100000?
The data is most likely in a specific cartographic projection. You don't just want to divide by 100k - the data will likely have nonlinear transformations which have a different effect on the position depending on the location. See the GeoPandas docs on working with projections.
If the CRS of the data is correctly encoded, you can re-project the dataframe into lat/lons (e.g. WGS84, which has the EPSG Code 4326) using geopandas.GeoDataFrame.to_crs, e.g.:
df_latlon = df.to_crs("epsg:4326")

R Code: Converting lat and long in feet to degrees

I am new to the mapping functions in R. I am trying to plot points onto a map, however, I need them in degrees (they are currently in feet). I'm trying to figure out the code for transforming coordinates that are in feet to degrees, would anyone know the code or formula for this?
Not sure what you mean by this exactly, but in general to transform the projection of a spatial object you can use:
data.transformed <- spTransform(data, CRS("+proj=longlat +datum=WGS84"))
spTransform() is from the rgdal package, and the CRS() argument can be replaced with whichever particular projection you need. If this isn't helpful or if you are new to mapping and the concept of projections in general, I would suggest trying to ask a question on https://gis.stackexchange.com/.

Proper workflow to manipulate a raster to match the extent, origin, and resolution of another

I'm working with two rasters that differ in their origin, extent, and resolution. I have a bathymetry raster, with a higher resolution (x=0.0008333333, y=0.0008333333) and a MUCH great spatial extent. I also have a sea surface temperature raster, which has a much coarser resolution (x=0.04166667, y=0.04166667). Both rasters have the same projection (longlat, datum=WGS84).
I would like to manipulate the bathymetry raster to match the extent, origin, and resolution of the sea surface temperature raster. However, I have very little experience and I am uncertain of the 'best practices.'
I have tried two different methods, and I would like to know which is better, and maybe an explanation of how they differ in terms of the underlying processes. I'm also open to other methods that might be better at preserving the data.
Method 1:
1) first, I aggregated the bathymetry raster to make it as similar to the SST raster as possible
library(raster)
bathycoarse<-aggregate(bathymetry, fact=c(48,50), fun=mean)
2) second, I cropped the bathymetry raster by the SST raster
bathycoarsecrop<-crop(bathycoarse,sst)
3) third, I resampled the bathymetry raster using the SST raster, resulting in the same origin and extent.
bathyresample<-resample(bathycoarsecrop, sst, method="bilinear")
Method 2: I used the function projectRaster()
bathy2<-projectRaster(bathymetry, sst, method="bilinear")
Obviously, method 2 is much simpler. But I don't really understand what the function is doing, so I want to make sure I am accomplishing my goal in the correct method.
The "projectRaster" function uses the same resampling as the "resample" function (the resampling method is defined by the "method" argument you set to "bilinear" - indicating bilinear interpolation, which is probably what you want when your dealing with continuous numeric datasets).
So using the function should just work fine for you.
If you want to speed things up, you can easily use paralell processing with the "projectRaster" function by starting a cluster with the "beginCluster" function, which then allows automatic parallel processing with the "projectRaster" function.
beginCluster(4) # use the number of cores you want to use
bathy2 <- projectRaster(bathymetry, sst, method="bilinear")
endCluster()

How to use the function r.cost to get the least-cost path between two polygons?

I am a beginner in GRASS but I would like to get the least-cost path between two polygons. More exactely, I would like to get the smallest cost from any point situated at the edge of one polygon (polygon A) to any point situated at the edge of another polygon (polygon B).
Until now, I used the function CostDistance and CostPath of ArcGIS by using a cost raster where each cell had a cost value, a shapefile for the first polygon, and a shapefile for the second polygon. I would like to do the same thing with GRASS. I think that the function r.cost allows to do this. But I don't know how to specify in parameters the two polygons in GRASS ?
Have you got an example of how to use r.cost with two polygons in R with package spgrass6?
Thanks very much for your help.
If the use of GRASS is not mandatory and sticking with R is sufficient, you should check the marmap package. Section 2.4 of the vignette (vignette("marmap")) is entitled:
2.4 Using bathymetric data for least-cost path analysis
The marmap package allows for computation of least-cost path constrained within a range of depth/altitude between any number of points. The two key functions here are trans.mat() to create a transition matrix similar to the cost-raster you mention. Then, lc.dist() computes the least-cost distance and allows to plot the path between points.
Detailed examples are provided in the marmap vignette.

Create polygon on a map in right projection using R

In my project I am using different projections for my data. I want to learn what happens when you create shapes in a equivalent (equal area) projection and transform them to a conformal projection.
I have a SPDF in an equal area projection. I am trying to create some shapes in this SPDF to later transform them. I did not expect that this is a difficult task. I would like to work with vectors.
The main problem I think I have is that I am unaware of the package and function I should use. I have searched for a couple of hours this morning but can not find the right package or function. Also I can not find people asking questions about this exact topic, which surprises me.
So the question is: How do I make a shape in a SPDF using R?

Resources