The main advantage of the package is the availability of the topologically-aware simplification algorithm in
ms_simplify (provided by the
simplify tool in mapshaper). This means that shared boundaries between adjacent polygons are always kept intact, with no gaps or overlaps, even at high levels of simplification. It uses the Visvalingam simplification method.
At this time,
rmapshaper provides the following functions:
ms_simplify- simplify polygons or lines
ms_clip- clip an area out of a layer using a polygon layer or a bounding box. Works on polygons, lines, and points
ms_erase- erase an area from a layer using a polygon layer or a bounding box. Works on polygons, lines, and points
ms_dissolve- aggregate polygon features, optionally specifying a field to aggregate on. If no field is specified, will merge all polygons into one.
ms_explode- convert multipart shapes to single part. Works with polygons, lines, and points in geojson format, but currently only with polygons and lines in the
ms_lines- convert polygons to topological boundaries (lines)
ms_innerlines- convert polygons to shared inner boundaries (lines)
ms_points- create points from a polygon layer
ms_filter_fields- Remove fields from the attributes
ms_filter_islands- Remove small detached polygons
This short vignette focuses on simplifying polygons with the
rmapshaper works with geojson strings (character objects of class
geojson objects of class
geo_list. These classes are defined in the
package. It also works with
Spatial classes from the
We will use the
states dataset from the
geojsonio package and first turn it
library(geojsonio) library(rmapshaper) library(sp) states_json <- geojson_json(states, geometry = "polygon", group = "group")
For ease of illustration via plotting, we will convert to a
states_sp <- geojson_sp(states_json) ## Plot the original plot(states_sp)
Now simplify using default parameters, then plot the simplified states
states_simp <- ms_simplify(states_sp) plot(states_simp)
You can see that even at very high levels of simplification, the mapshaper simplification algorithm preserves the topology, including shared boundaries:
states_very_simp <- ms_simplify(states_sp, keep = 0.001) plot(states_very_simp)
Compare this to the output using
rgeos::gSimplify, where overlaps and gaps are evident:
library(rgeos) states_gsimp <- gSimplify(states_sp, tol = 1, topologyPreserve = TRUE) plot(states_gsimp)
The package also works with
sf objects. This time we'll demonstrate the
library(sf) states_sf <- st_as_sf(states_sp) states_sf_innerlines <- ms_innerlines(states_sf) plot(states_sf_innerlines)
All of the functions are quite fast with
geo_json character objects and
list objects. They are slower with the
Spatial classes due to internal conversion
to/from json. If you are going to do multiple operations on large
it's recommended to first convert to json using
geojsonio package. All of the functions have the input object as the first argument,
and return the same class of object as the input. As such, they can be chained together.
For a totally contrived example, using
states_sp as created above:
library(geojsonio) library(rmapshaper) library(sp) library(magrittr) ## First convert 'states' dataframe from geojsonio pkg to json states_json <- geojson_json(states, lat = "lat", lon = "long", group = "group", geometry = "polygon") states_json %>% ms_erase(bbox = c(-107, 36, -101, 42)) %>% # Cut a big hole in the middle ms_dissolve() %>% # Dissolve state borders ms_simplify(keep_shapes = TRUE, explode = TRUE) %>% # Simplify polygon geojson_sp() %>% # Convert to SpatialPolygonsDataFrame plot(col = "blue") # plot
Sometimes if you are dealing with a very large spatial object in R,
functions will take a very long time or not work at all. As of version
you can make use of the system
mapshaper library if you have it installed.
This will allow you to work with very large spatial objects.
First make sure you have mapshaper installed:
If you get an error, you will need to install mapshaper. First install node (https://nodejs.org/en/) and then install mapshaper in a command prompt with:
$ npm install -g mapshaper
Then you can use the
sys argument in any rmapshaper function:
states_simp_sys <- ms_simplify(states_sf, sys = TRUE) plot(states_simp_sys[, "region"])
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.