library(tmap)
library(tmap.mapgl)
library(sf)
library(spData)
data("world", package = "spData")
waterfalls <- data.frame(
  name = c("Iguazu Falls", "Niagara Falls", "Victoria Falls"),
  lat = c(-25.686785, 43.092461, -17.931805),
  lon = c(-54.444981, -79.047150, 25.825558)
)
waterfalls_sf <- st_as_sf(
  waterfalls,
  coords = c("lon", "lat"),
  crs = "EPSG:4326"
)

## EXAMPLE 4 ---------------------------------------------------------------
tm <- tm_shape(world) +
  tm_polygons() +
  tm_shape(waterfalls_sf) +
  tm_symbols(fill = "name") 

tm

# tm <- tm_shape(us_states) +
#   tm_polygons()

tmap_mode("view")

tm

tm + tm_view(control.position = c("left", "bottom"),
             set_view = 5)

tm + tm_basemap(c("OpenStreetMap"))

# tmap_providers() / .tmap_providers$
tm + tm_basemap(c("OpenStreetMap",
                  "CartoDB.Positron",
                  "Esri.WorldImagery"),
                zoom = 2)


tmap_mode("maplibre")
tm + tm_basemap(c("OpenStreetMap"))

# tmap_providers() / .tmap_providers$
tm + tm_basemap(c("ofm.dark"))

tmap_mode("plot")
tm
tm + tm_basemap(c("OpenStreetMap")) 

tmap_mode("view")
tm2 <- tm_shape(world) +
  tm_polygons(
    hover = "name_long",
    popup.vars = c("name_long", "pop", "lifeExp")
  ) +
  tm_shape(waterfalls_sf) +
  tm_symbols(fill = "name") 

tm2

tmap_mode("maplibre")
tm2

# leaflet (view):
# + quick interactive maps
# + many features
# + shiny integration

# tmap.mapgl (maplibre/mapbox):
# + better performance for large datasets
# + 3D polygon viz
# + globe view (it is great, but still distorts a lot, especially on the edges)
# - some tmap features are not supported
# - mapbox mode requires an API key