--- title: "smartmap" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{smartmap} %\VignetteEncoding{UTF-8} %\VignetteEngine{knitr::rmarkdown} editor_options: chunk_output_type: console --- ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) library(leaflet) library(leafsync) ``` ```{r setup} library(smartmap) ``` smartmap produces interactive maps from a variety of R objects with minimal coding required. This makes it great for previewing spatial data. It provides only three functions: * `smap()`: The core function. Smartly create [leaflet](https://rstudio.github.io/leaflet/) maps from R objects. Maps created with `smap()` contain two dialogues in the top right corner: one for switching the background map and one for measuring distances and areas. * `smart_as_sf()`: Applies the same heuristics as `smap()`, but returns [sf](https://r-spatial.github.io/sf/) objects instead. * `as_coord_matrix`: Applies the same heuristics as `smap()`, but returns a numeric matrix with longitude and latitude instead. ## Data frames Viewing `data.frames` with longitude and latitude columns was the basic use case for which smartmap was created. The heuristics for automatically determining the geo-coordinate columns are simple, but should work for most use cases. ```{r echo = FALSE} cities <- data.frame( city = c("Bregenz", "Eisenstadt", "Wiener Neustadt", "Graz", "Klagenfurt", "Linz", "Salzburg", "Innsbruck", "Vienna"), LaTituDE = c(47.51669707, 47.83329908, 47.81598187, 47.0777582, 46.62034426, 48.31923281, 47.81047833, 47.28040733, 48.20001528), lng = c(9.766701588, 16.53329747, 16.24995357, 15.41000484, 14.3100203, 14.28878129, 13.0400203, 11.4099906, 16.36663896), pop = c(26928, 13165, 60621.5, 242780, 88588, 265161.5, 178274, 133840.5, 2065500), country = c("Austria", "Austria", "Austria", "Austria", "Austria", "Austria", "Austria", "Austria", "Austria"), province = c("Vorarlberg", "Burgenland", "Niederösterreich", "Steiermark", "Kärnten", "Oberösterreich", "Salzburg", "Tirol", "Wien") ) ``` ```{r eval = FALSE} print(cities) smap(cities) ``` ```{r out.width = "100%", echo = FALSE} print(cities) smap(cities) ```
source: [World Cities Database](https://simplemaps.com/data/world-cities)
## Shapefiles `smap()` also works with file system paths or urls to shapefiles. It even looks inside zip files if necessary! ```{r cache = TRUE, out.width = "100%"} # disabled url broken # smap("https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/50m/cultural/ne_50m_admin_0_countries.zip") ``` ## Point coordinates Numeric vectors of length 2 are interpreted as longitude/latitude coordinate pairs. If you supply names, smap uses them to identify the correct order. ```{r eval = FALSE} smap(c(16.422524, 48.185686)) smap(c(LAT = 48.185686, LoNgItuDE = 16.422524)) ``` ```{r out.width = "100%", echo = FALSE} smap(c(LAT = 48.185686, LoNgItuDE = 16.422524)) ``` ## Leaflet maps You can call `smap()` on existing leaflet objects to add background tiles and a ruler for measuring distance ```{r, eval=FALSE} library(leaflet) lf <- leaflet::leaflet(height=200) %>% leaflet::addCircleMarkers(lng = 16.422524, lat = 48.185686) lf smap(lf) ``` ```{r, echo = FALSE} library(leaflet) lf <- leaflet::leaflet(height=200) %>% leaflet::addCircleMarkers(lng = 16.422524, lat = 48.185686) leafsync::sync(lf, smap(lf), sync.cursor = FALSE) ``` ## Simple features (sf) Everyone who has worked with simple features will know that it is sometimes a bit awkward to convert between the different datatypes provided by the package (`sf::sf`, `sf::sfc` and `sf::sfg`). Toe remedy this `smap()` works natively with all three. ```{r, eval = FALSE} smap(sf::st_point(c(16.373311, 48.208482))) smap(sf::st_sfc(sf::st_point(c(16.373311, 48.208482)))) smap(sf::st_sf(coords = sf::st_sfc(sf::st_point(c(16.373311, 48.208482))), crs = 4326)) ``` ```{r out.width = "100%", echo = FALSE} smap(sf::st_sf(coords = sf::st_sfc(sf::st_point(c(16.373311, 48.208482))), crs = 4326)) ```