First, let’s load packages and some data.
library(geovizr)
library(sf)
world <- st_read(
system.file("gpkg/world.gpkg", package = "geovizr"),
quiet = TRUE
)Create
Every map starts with the viz_create() function. It
initializes the map and defines a number of general parameters, such as
the size (width), the margins (margins), the
projection (projection), or the background color
(background). This is also where you determine whether the
map is zoomable or not, using the zoomable parameter.
From a technical perspective, the function produces a list containing the map parameters and an initially empty list of layers to be displayed.
map <- viz_create(
projection = "EqualEarth",
margin = c(20, 0, 0, 0),
background = "#55bee0"
)
str(map)## List of 2
## $ params:List of 12
## ..$ id : chr "map"
## ..$ width : NULL
## ..$ resize : logi TRUE
## ..$ domain : NULL
## ..$ responsive: logi TRUE
## ..$ projection: chr "EqualEarth"
## ..$ background: chr "#55bee0"
## ..$ fontFamily: NULL
## ..$ margin : num [1:4] 20 0 0 0
## ..$ zoomable : NULL
## ..$ control : logi TRUE
## ..$ warning : logi TRUE
## $ layers: list()
## - attr(*, "class")= chr "geoviz"
At this stage, the function does not draw anything.
Add layers
Once the map has been initialized with the viz_create()
function, the geovizr package provides many functions to
display layers. Each function has its own specific parameters and is
designed to display a particular type of layer. For example, you can use
viz_path() to add gemeotries, viz_graticule()
to add graticules, or viz_header() to add a title, etc.
So you can write this
map <- viz_create(projection = "EqualEarth")
map <- viz_outline(map)
map <- viz_graticule(map, stroke = "white", step = 20)
map <- viz_path(map, data = world)
map <- viz_header(map, text = "Hello World")
str(map)## List of 2
## $ params:List of 12
## ..$ id : chr "map"
## ..$ width : NULL
## ..$ resize : logi TRUE
## ..$ domain : NULL
## ..$ responsive: logi TRUE
## ..$ projection: chr "EqualEarth"
## ..$ background: NULL
## ..$ fontFamily: NULL
## ..$ margin : num [1:4] 0 0 0 0
## ..$ zoomable : NULL
## ..$ control : logi TRUE
## ..$ warning : logi TRUE
## $ layers:List of 4
## ..$ :List of 4
## .. ..$ type : chr "outline"
## .. ..$ stroke : chr "none"
## .. ..$ strokeWidth: num 1
## .. ..$ fill : chr "#B5DFFD"
## ..$ :List of 8
## .. ..$ type : chr "graticule"
## .. ..$ step : num 20
## .. ..$ stroke : chr "white"
## .. ..$ fill : chr "none"
## .. ..$ strokeWidth : num 0.8
## .. ..$ strokeLinecap : chr "square"
## .. ..$ strokeLinejoin : chr "round"
## .. ..$ strokeDasharray: num 2
## ..$ :List of 11
## .. ..$ type : chr "path"
## .. ..$ data :Classes 'sf' and 'data.frame': 209 obs. of 11 variables:
## .. .. ..$ ISO3 : chr [1:209] "GNQ" "TUV" "MDV" "AND" ...
## .. .. ..$ NAMEen: chr [1:209] "Equatorial Guinea" "Tuvalu" "Maldives" "Andorra" ...
## .. .. ..$ NAMEfr: chr [1:209] "Guinée-Équatoriale" "Tuvalu" "Maldives" "Andorre" ...
## .. .. ..$ id : chr [1:209] "GNQ" "TUV" "MDV" "AND" ...
## .. .. ..$ name : chr [1:209] "Equatorial Guinea" "Tuvalu" "Maldives" "Andorra" ...
## .. .. ..$ region: chr [1:209] "Africa" "Oceania" "Asia" "Europe" ...
## .. .. ..$ pop : chr [1:209] "1402985" "11792" "540542" "77146" ...
## .. .. ..$ gdp : chr [1:209] "10021856754" "48855550" "4030203167" "3155065488" ...
## .. .. ..$ gdppc : chr [1:209] "7143.24" "4143.11" "7455.86" "40897.33" ...
## .. .. ..$ year : chr [1:209] "2020" "2020" "2020" "2019" ...
## .. .. ..$ geom :sfc_MULTIPOLYGON of length 209; first list element: List of 2
## .. .. .. ..$ :List of 1
## .. .. .. .. ..$ : num [1:6, 1:2] 11.32 11.34 9.8 9.35 9.8 ...
## .. .. .. ..$ :List of 1
## .. .. .. .. ..$ : num [1:5, 1:2] 8.72 9.05 8.7 8.23 8.72 ...
## .. .. .. ..- attr(*, "class")= chr [1:3] "XY" "MULTIPOLYGON" "sfg"
## .. .. ..- attr(*, "sf_column")= chr "geom"
## .. .. ..- attr(*, "agr")= Factor w/ 3 levels "constant","aggregate",..: NA NA NA NA NA NA NA NA NA NA
## .. .. .. ..- attr(*, "names")= chr [1:10] "ISO3" "NAMEen" "NAMEfr" "id" ...
## .. ..$ coords : chr "geo"
## .. ..$ clip : logi TRUE
## .. ..$ strokeWidth: num 1
## .. ..$ tip : logi FALSE
## .. ..$ simplify : logi FALSE
## .. ..$ rewind : logi FALSE
## .. ..$ rewindPole : logi FALSE
## .. ..$ clipOutline: num 0
## .. ..$ r : num 3
## ..$ :List of 13
## .. ..$ type : chr "header"
## .. ..$ text : chr "Hello World"
## .. ..$ fill : chr "#9e9696"
## .. ..$ background_fill : chr "white"
## .. ..$ background_stroke : chr "white"
## .. ..$ background_strokeWidth: num 1
## .. ..$ dominantBaseline : chr "central"
## .. ..$ textAnchor : chr "middle"
## .. ..$ lineSpacing : num 0
## .. ..$ margin : num 8
## .. ..$ fontSize : num 26
## .. ..$ dx : num 0
## .. ..$ dy : num 0
## - attr(*, "class")= chr "geoviz"
Or that (recomended)
map <- viz_create(projection = "EqualEarth") |>
viz_outline() |>
viz_graticule(stroke = "white", step = 20) |>
viz_path(data = world) |>
viz_header(text = "Hello World")
str(map)## List of 2
## $ params:List of 12
## ..$ id : chr "map"
## ..$ width : NULL
## ..$ resize : logi TRUE
## ..$ domain : NULL
## ..$ responsive: logi TRUE
## ..$ projection: chr "EqualEarth"
## ..$ background: NULL
## ..$ fontFamily: NULL
## ..$ margin : num [1:4] 0 0 0 0
## ..$ zoomable : NULL
## ..$ control : logi TRUE
## ..$ warning : logi TRUE
## $ layers:List of 4
## ..$ :List of 4
## .. ..$ type : chr "outline"
## .. ..$ stroke : chr "none"
## .. ..$ strokeWidth: num 1
## .. ..$ fill : chr "#B5DFFD"
## ..$ :List of 8
## .. ..$ type : chr "graticule"
## .. ..$ step : num 20
## .. ..$ stroke : chr "white"
## .. ..$ fill : chr "none"
## .. ..$ strokeWidth : num 0.8
## .. ..$ strokeLinecap : chr "square"
## .. ..$ strokeLinejoin : chr "round"
## .. ..$ strokeDasharray: num 2
## ..$ :List of 11
## .. ..$ type : chr "path"
## .. ..$ data :Classes 'sf' and 'data.frame': 209 obs. of 11 variables:
## .. .. ..$ ISO3 : chr [1:209] "GNQ" "TUV" "MDV" "AND" ...
## .. .. ..$ NAMEen: chr [1:209] "Equatorial Guinea" "Tuvalu" "Maldives" "Andorra" ...
## .. .. ..$ NAMEfr: chr [1:209] "Guinée-Équatoriale" "Tuvalu" "Maldives" "Andorre" ...
## .. .. ..$ id : chr [1:209] "GNQ" "TUV" "MDV" "AND" ...
## .. .. ..$ name : chr [1:209] "Equatorial Guinea" "Tuvalu" "Maldives" "Andorra" ...
## .. .. ..$ region: chr [1:209] "Africa" "Oceania" "Asia" "Europe" ...
## .. .. ..$ pop : chr [1:209] "1402985" "11792" "540542" "77146" ...
## .. .. ..$ gdp : chr [1:209] "10021856754" "48855550" "4030203167" "3155065488" ...
## .. .. ..$ gdppc : chr [1:209] "7143.24" "4143.11" "7455.86" "40897.33" ...
## .. .. ..$ year : chr [1:209] "2020" "2020" "2020" "2019" ...
## .. .. ..$ geom :sfc_MULTIPOLYGON of length 209; first list element: List of 2
## .. .. .. ..$ :List of 1
## .. .. .. .. ..$ : num [1:6, 1:2] 11.32 11.34 9.8 9.35 9.8 ...
## .. .. .. ..$ :List of 1
## .. .. .. .. ..$ : num [1:5, 1:2] 8.72 9.05 8.7 8.23 8.72 ...
## .. .. .. ..- attr(*, "class")= chr [1:3] "XY" "MULTIPOLYGON" "sfg"
## .. .. ..- attr(*, "sf_column")= chr "geom"
## .. .. ..- attr(*, "agr")= Factor w/ 3 levels "constant","aggregate",..: NA NA NA NA NA NA NA NA NA NA
## .. .. .. ..- attr(*, "names")= chr [1:10] "ISO3" "NAMEen" "NAMEfr" "id" ...
## .. ..$ coords : chr "geo"
## .. ..$ clip : logi TRUE
## .. ..$ strokeWidth: num 1
## .. ..$ tip : logi FALSE
## .. ..$ simplify : logi FALSE
## .. ..$ rewind : logi FALSE
## .. ..$ rewindPole : logi FALSE
## .. ..$ clipOutline: num 0
## .. ..$ r : num 3
## ..$ :List of 13
## .. ..$ type : chr "header"
## .. ..$ text : chr "Hello World"
## .. ..$ fill : chr "#9e9696"
## .. ..$ background_fill : chr "white"
## .. ..$ background_stroke : chr "white"
## .. ..$ background_strokeWidth: num 1
## .. ..$ dominantBaseline : chr "central"
## .. ..$ textAnchor : chr "middle"
## .. ..$ lineSpacing : num 0
## .. ..$ margin : num 8
## .. ..$ fontSize : num 26
## .. ..$ dx : num 0
## .. ..$ dy : num 0
## - attr(*, "class")= chr "geoviz"
At this stage, you still do not draw anything. You have created a configuration file containing the data and parameters needed to build the map.
Render
This configuration file will be rendered using the
viz_render() function.
viz_render(map)Thus, creating a complete map with geovizr could be
written as follows.
map <- viz_create(projection = "EqualEarth") |>
viz_outline() |>
viz_graticule(stroke = "white", step = 20) |>
viz_path(data = world) |>
viz_header(text = "Hello World") |>
viz_render()From a technical perspective, the viz_render() function
returns an HTML block (+ JavaScript for interactivity) containing a map
in SVG format.
Save maps
The maps created with the geoviz package thus generate a web page.
You can save this web page with the htmlwidgets
package:
viz_create(zoomable = T) |>
viz_path(data = world, tip = T) |>
viz_render() |>
saveWidget("mymap.html", selfcontained = TRUE)You can also directly save the map in SVG format to edit it with a
drawing software like Inkscape. For this, you just need to use the
viz_save() command instead of
viz_render().
viz_create() |>
viz_path(data = world) |>
viz_save("mymap.svg")By doing this, the map is returned and a window opens, prompting you
to download it. Thus, the geovizr package can be a way to
create draft maps before refining them in a CAD environment.