Reverse Dependencies | ||||||
Type | sf | stars | terra | raster | rgdal | rgeos |
---|---|---|---|---|---|---|
Depends | 35 | 3 | 14 | 64 | 9 | 8 |
Imports | 414 | 27 | 120 | 280 | 109 | 69 |
Suggests | 177 | 30 | 60 | 97 | 85 | 50 |
Source : CRAN, 22 juin 2023 |
Rencontres R - Avignon
RIATE - CNRS
23 juin 2023
spatial
, sgeostat
, splancs
, akima
, geoR
, spatstat
, spdep
, maptools
.rgdal
(Bivand et al., 2023), interface entre R et GDAL/PROJ4sp
(Pebesma, 2018), classes et méthodes dédiées aux objets spatiaux, adoption rapidesp
par ggplot2
rgeos
(Bivand et Rundel, 2023), interface entre R et GEOS.raster
(Hijmans, 2023a), support des données rastersf
(Pebesma, 2018), remplace sp
, rgdal
et rgeos
stars
(Pebesma et Bivand, 2023), remplace raster
terra
(Hijmans, 2023b), remplace aussi raster
C’est une image localisée dans l’espace.
L’information géographique est alors stockée dans des pixels.
Chaque pixel, défini par une résolution, possède des valeurs qui peuvent être traitées et cartographiées.
Il s’agit d’objets géométriques de type points, lignes ou polygones.
Ces objets vectoriels ne pixellisent pas.
Chaque objet est défini par un identifiant unique.
Des bibliothèques géographiques largement utilisées :
Il s’agit de dépendances externes
Envisager la conteneurisation (Nüst et Pebesma, 2021).
Pour accompagner le processus d’archivage des packages :
Loading required package: sp
The legacy packages maptools, rgdal, and rgeos, underpinning the sp package,
which was just loaded, will retire in October 2023.
Please refer to R-spatial evolution reports for details, especially
https://r-spatial.org/r/2023/05/15/evolution4.html.
It may be desirable to make the sf package available;
package maintainers should consider adding sf to Suggests:.
The sp package is now running under evolution status 2
(status 2 uses the sf package in place of rgdal)
Warning in load_stuff(): rgeos: versions of GEOS runtime 3.11.1-CAPI-1.17.1
and GEOS at installation 3.9.0-CAPI-1.16.2differ
rgeos version: 0.6-3, (SVN revision 696)
GEOS runtime version: 3.11.1-CAPI-1.17.1
Please note that rgeos will be retired during October 2023,
plan transition to sf or terra functions using GEOS at your earliest convenience.
See https://r-spatial.org/r/2023/05/15/evolution4.html for details.
GEOS using OverlayNG
Linking to sp version: 1.6-0
Polygon checking: TRUE
Reverse Dependencies | ||||||
Type | sf | stars | terra | raster | rgdal | rgeos |
---|---|---|---|---|---|---|
Depends | 35 | 3 | 14 | 64 | 9 | 8 |
Imports | 414 | 27 | 120 | 280 | 109 | 69 |
Suggests | 177 | 30 | 60 | 97 | 85 | 50 |
Source : CRAN, 22 juin 2023 |
sf
Publié fin 2016 par Edzer Pebesma.
Principales fonctionnalités
|>
ou %>%
)tidyverse
.Les objets sf
sont des data.frame
dont l’une des colonnes contient des géométries.
Format très pratique, les données et les géométries sont intrinsèquement liées dans un même objet.
Linking to GEOS 3.11.1, GDAL 3.6.2, PROJ 9.1.1; sf_use_s2() is TRUE
Reading layer `mtq' from data source
`/home/tim/Documents/prz/RencontresR_2023/data/mtq.gpkg' using driver `GPKG'
Simple feature collection with 34 features and 7 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: 690574 ymin: 1592536 xmax: 735940.2 ymax: 1645660
Projected CRS: WGS 84 / UTM zone 20N
Les principaux formats de fichier sont pris en charge
Units: [m]
[,1] [,2] [,3] [,4] [,5]
[1,] 0.000 35316.29 3019.561 12247.132 17181.321
[2,] 35316.293 0.00 38303.361 25478.399 18597.357
[3,] 3019.561 38303.36 0.000 15099.121 20200.611
[4,] 12247.132 25478.40 15099.121 0.000 7149.189
[5,] 17181.321 18597.36 20200.611 7149.189 0.000
terra
Le package terra
permet de gérer des données vectorielles et surtout raster.
Il succède au package raster
(Hijmans, 2023a) du même auteur.
Principales fonctionnalités
D’autres packages : mapmisc
, choropletr
, oceanis
…
mapsf
mapsf
offre la plupart des types de carte utilisés habituellement.
Successeur de cartography
(Giraud et Lambert, 2017).
Fonctionnalités principales
library(mapsf)
# Import the sample dataset
mtq <- mf_get_mtq()
# Plot the base map
mf_map(x = mtq)
# Plot proportional symbols
mf_map(
x = mtq,
var = "POP",
type = "prop",
leg_title = "Population"
)
# Plot a map layout
mf_layout(
title = "Population in Martinique",
credits =
paste0("T. Giraud;",
"Sources: INSEE & IGN, 2018"
)
)
# Export a map with a theme and extra margins
mf_theme("agolalight", bg = "ivory1")
mf_export(
x = mtq, filename = "img/mtq.png",
width = 600, res = 120,
expandBB = c(0, 0, 0, .3)
)
# Plot a shadow
mf_shadow(mtq, col = "grey90", add = TRUE)
# Plot a choropleth map
mf_map(
x = mtq, var = "MED", type = "choro",
pal = "Dark Mint",
breaks = "quantile",
nbreaks = 6,
leg_title = "Median Income\n(euros)",
leg_val_rnd = -2,
add = TRUE
)
# Start an inset map
mf_inset_on(x = "worldmap", pos = "right")
# Plot mtq position on a worldmap
mf_worldmap(mtq, col = "#0E3F5C")
# Close the inset
mf_inset_off()
# Plot a title
mf_title("Wealth in Martinique, 2015")
# Plot credits
mf_credits("T. Giraud\nSources: INSEE & IGN, 2018")
# Plot a scale bar
mf_scale(size = 5)
# Plot a north arrow
mf_arrow("topleft")
dev.off()
leaflet
(Cheng et al., 2023), repose sur la bibliothèque JS leaflet
mapview
(Appelhans et al., 2022), repose sur le package leaflet
mapdeck
(Cooley, 2020), repose sur les bibliothèques JS Mapbox GL et Deck.gl
tmap
dispose d’un mode interactif (qui s’appuie sur le package leaflet
aussi).
Le package maptiles
(Giraud, 2023b) permet de télécharger des fonds de carte (raster).
Alternatives
ceramic
ggmap
(pour ggplot2
)ggspatial
(pour ggplot2
, utilise rosm
)mapboxapi
(mapbox)mapsapi
(google, utilise RgoogleMaps
)OpenStreetMap
(nécessite Java)RgoogleMaps
(google)rosm
De nombreuses palettes sont directement disponibles dans R-base et près de 70 (!) packages proposent des palettes.
paletteer
(Hvitfeldt, 2021) propose 2587 palettes (!!!)cols4all
(Tennekes, 2023) propose une app shinyspatstat
: Analyse statistique de semis de pointsgstat
: Variogram et Krigeagergeoda
: Geoda avec RGWmodel
, spgwr
: Geographically Weighted ModelsCRAN Task View: Analysis of Spatial Data
Session Geospatial à 11h!
La session Workflow a l’air cool aussi !
Maillages administratifs :
rnaturalearth
pour les pays du monde
giscoR
pour les régions européennes
tigris
, mapSpain
, geobr
…
Données climatiques :
geodata
(+ plein d’autres choses)
Altitudes :
elevatr
Occurences d’especes :
spocc
Données eco / socio / démographique :
wbstats
(World Bank)
eurostat
rdhs
(santé)
…
Données satellitaires :
sen2r
(Sentinel-2)
MODIStsp
(MODIS)
rgee
(Google Earth Engine)
nasapower
(météo, climato)
Le package osmdata
(Padgham et al., 2017) utilise l’API du service Overpass turbo pour extraire des données de la BD OpenStreetMap.
Nous utilisons le système de clef/valeur d’OSM pour construire la requête.
Une base de données cartographique libre et contributive.
Conditions d’utilisation
OpenStreetMap est en données libres : vous êtes libre de l’utiliser dans n’importe quel but tant que vous créditez OpenStreetMap et ses contributeurs. Si vous modifiez ou vous appuyez sur les données d’une façon quelconque, vous pouvez distribuer le résultat seulement sous la même licence. (…)
Contributions
(…) Nos contributeurs incluent des cartographes enthousiastes, des professionnels du SIG, des ingénieurs qui font fonctionner les serveurs d’OSM, des humanitaires cartographiant les zones dévastées par une catastrophe et beaucoup d’autres. (…)
Couverture/complétude
Pour modéliser les variations de densités de restaurants dans le centre ville d’Avignon nous pouvons utiliser la méthode de lissage par noyaux (KDE) grâce au package spatstat
(Baddeley et al., 2015).
On peut améliorer la représentation des résultats en les superposant à un fond de carte raster.
library(maptiles)
library(mapsf)
tiles_osm <- get_tiles(r,
provider = "CartoDB.Positron",
zoom = 15,
crop = TRUE,
cachedir = "cache")
mf_theme(mar = c(0,0,0,0), inner = TRUE)
mf_export(tiles_osm, filename = "img/avignon_dens1.png",
width = ncol(tiles_osm), height = nrow(tiles_osm))
mf_raster(tiles_osm, add = TRUE)
mf_raster(r, alpha = 0.6, add = TRUE)
mf_map(resto, add = TRUE)
dev.off()
Nous pouvons aussi transformer le raster des densités en polygones de plages de densités grâce au package mapiso
(Giraud, 2023a).
library(mapiso)
# Limites des classes
maxval <- max(values(r))
bks <- c(seq(0, floor(maxval), 1), maxval)
# Transformation du raster en polygones
iso_dens <- mapiso(r, breaks = bks)
# Suppression de la première classe ([0, 1[)
iso_dens <- iso_dens[-1, ]
# Affichage
mf_export(r, "img/iso_dens.png", width = ncol(r)*2)
mf_raster(r, add = TRUE)
mf_map(iso_dens, col = NA, add = TRUE)
dev.off()
La dernière étape consiste à superposer ces polygones au fond de carte.
mf_export(tiles_osm, filename = "img/avignon_dens2.png",
width = 600,
expandBB = c(0,0,0,.5))
mf_raster(tiles_osm, add = TRUE)
mf_map(iso_dens, var = "isomin", type = "choro",
breaks = bks[-1], border = "white",
pal = "Teal", alpha = .9,
leg_pos = "right",
leg_val_rnd = 1,
leg_title = paste0("Densité de restaurants dans\n",
"un voisinage gaussien (σ = 50m),\n",
"en restaurants par hectare"),
add = TRUE)
mf_map(resto, cex = .5, add = TRUE)
mf_credits("T. Giraud, 2023\nOpenStreetMap contributors, 2023",
pos = "bottomright", bg = "white")
mf_scale(pos = "bottomleft", size = 250, unit = "m")
mf_arrow(pos = "topright")
mf_title("Densité des restaurants dans le centre-ville d'Avignon")
dev.off()
Nous pouvons aussi utiliser un fond de carte vectoriel.
Ici nous allons préparer un fond de carte constitué :
library(sf)
library(osmdata)
center <- data.frame(x=3903683, y=2329735) |>
st_as_sf(coords = c("x","y"), crs = "EPSG:3035") |>
st_buffer(dist = 1000)
bb <- st_transform(center,"EPSG:4326") |>
st_bbox()
water <- opq(bbox = bb)|>
add_osm_feature(key = 'natural', value = "water") |>
osmdata_sf() |>
unique_osmdata()
river <- c(st_geometry(water$osm_polygons),
st_geometry(water$osm_multipolygons)) |>
st_cast('MULTIPOLYGON') |>
st_make_valid() |>
st_transform(st_crs(center))|>
st_intersection(center) |>
st_union()
green <- opq(bbox = bb)|>
add_osm_features(features = list(
"leisure" = c("park", "garden"),
"landuse" = c("cemetery", "grass", "forest"))
) |>
osmdata_sf() |>
unique_osmdata()
esp_vert <- st_geometry(green$osm_polygons) |>
st_cast('MULTIPOLYGON') |>
st_make_valid() |>
st_transform(st_crs(center))|>
st_intersection(center) |>
st_union()
highway <- opq(bbox = bb)|>
add_osm_feature(key = 'highway') |>
osmdata_sf() |>
unique_osmdata()
routes <- st_geometry(highway$osm_lines) |>
st_cast('LINESTRING') |>
st_make_valid() |>
st_transform(st_crs(center))|>
st_intersection(center) |>
st_union() |>
st_buffer(5) |>
st_buffer(-3)
railway <- opq(bbox = bb)|>
add_osm_feature(key = 'railway') |>
osmdata_sf() |>
unique_osmdata()
rail <- st_geometry(railway$osm_lines) |>
st_cast('LINESTRING') |>
st_make_valid() |>
st_transform(st_crs(center))|>
st_intersection(center) |>
st_union()
building <- opq(bbox = bb)|>
add_osm_feature(key = 'building') |>
osmdata_sf() |>
unique_osmdata()
batiments <- c(st_geometry(building$osm_polygons),
st_geometry(building$osm_multipolygons)) |>
st_cast('MULTIPOLYGON') |>
st_make_valid() |>
st_transform(st_crs(center))|>
st_intersection(center) |>
st_union()
restaurants <- opq(bbox = bb)|>
add_osm_feature(key = 'amenity', value = "restaurant") |>
osmdata_sf() |>
unique_osmdata()
restaurants_points <- st_geometry(restaurants$osm_points) |>
st_transform(st_crs(center))|>
st_intersection(center)
restaurants_poly <- st_geometry(restaurants$osm_polygons) |>
st_centroid() |>
st_transform(st_crs(center))|>
st_intersection(center)
resto <- c(restaurants_points, restaurants_poly)
tourism <- opq(bbox = bb)|>
add_osm_feature(key = 'tourism', value = "hotel") |>
osmdata_sf() |>
unique_osmdata()
hotel_points <- tourism$osm_points[, "name"] |>
st_set_agr("constant") |>
st_transform(st_crs(center))|>
st_intersection(center)
hotel_poly <- rbind(tourism$osm_polygons[, "name"],
tourism$osm_multipolygons[, "name"]) |>
st_set_agr("constant") |>
st_centroid() |>
st_transform(st_crs(center))|>
st_intersection(center)
hotel <- rbind(hotel_points, hotel_poly)
st_write(obj = hotel, dsn = "data/avignon.gpkg", layer = "hotel")
st_write(obj = resto, dsn = "data/avignon.gpkg", layer = "resto")
st_write(obj = batiments, dsn = "data/avignon.gpkg", layer = "batiments")
st_write(obj = rail, dsn = "data/avignon.gpkg", layer = "rail")
st_write(obj = routes, dsn = "data/avignon.gpkg", layer = "routes")
st_write(obj = esp_vert, dsn = "data/avignon.gpkg", layer = "esp_vert")
st_write(obj = river, dsn = "data/avignon.gpkg", layer = "river")
st_write(obj = center, dsn = "data/avignon.gpkg", layer = "center")
Il suffit maintenant de combiner toutes ces couches pour constituer un fond de carte.
library(mapsf)
mf_theme("candy", bg ="#f7f7f7")
mf_export(center, "img/avignon.png", width = 768, res = 110)
mf_map(center, col = "#f2efe9", border = NA, add = TRUE)
mf_map(river, col = "#aad3df", border = "#aad3df", lwd = .5, add = TRUE)
mf_map(esp_vert, col = "#c8facc", border = "#c8facc", lwd = .5, add = TRUE)
mf_map(rail, col = "grey50", lty = 2, lwd = .2, add = TRUE)
mf_map(routes, col = "white", border = "white", add = TRUE)
mf_map(batiments, col = "#d9d0c9", border = "#c6bab1", lwd = 1, add = TRUE)
mf_map(hotel, col = "white", bg = "#000094",
pch = 21, lwd = 1, cex = 1, add = TRUE)
mf_map(resto, col = "white", bg = "#940010",
pch = 23, lwd = 1, cex = 1, add = TRUE)
mf_map(center, col = NA, border = "grey25", lwd = 4, add = TRUE)
mf_title("Avignon")
mf_credits("T. Giraud, 2023\nOpenStreetMap contributors, 2023")
mf_scale(100, unit = "m")
mf_arrow(pos = "topright")
mf_legend(type = "symb", pos = "bottomright2",
val = c("Hotels", "Restaurants"),
pal = c("#000094", "#940010"),
pt_cex = c(1, 1), pt_pch = c(21, 23),
border = "white", title = "", val_cex = 1)
dev.off()
Nous voulons connaître tous les chemins empruntés par les conférenciers pour se rendre au Rencontres R 2023!
Le package tidygeocoder
(Cambon et al., 2021) permet d’utiliser un grand nombre de services de géocodage en ligne.
Passing 1 address to the Nominatim single address geocoder
Query completed in: 1 seconds
# A tibble: 1 × 3
address lat long
<chr> <dbl> <dbl>
1 74 rue Louis Pasteur, 84000 Avignon, FRANCE 43.9 4.82
library(sf)
geoconf <- st_as_sf(conf, coords = c("long", "lat"), crs = "EPSG:4326") |>
st_transform(st_crs(center))
mf_export(center, "img/avignon_conf.png", width = 768, res = 110)
mf_map(center, col = "#f2efe9", border = NA, add = TRUE)
mf_map(river, col = "#aad3df", border = "#aad3df", lwd = .5, add = TRUE)
mf_map(esp_vert, col = "#c8facc", border = "#c8facc", lwd = .5, add = TRUE)
mf_map(rail, col = "grey50", lty = 2, lwd = .2, add = TRUE)
mf_map(routes, col = "white", border = "white", add = TRUE)
mf_map(batiments, col = "#d9d0c9", border = "#c6bab1", lwd = 1, add = TRUE)
mf_map(geoconf, col = "white", bg = "#646400", pch = 22, lwd = 1, cex = 4, add = TRUE)
mf_map(hotel, col = "white", bg = "#000094", pch = 21, lwd = 1, cex = 1, add = TRUE)
mf_map(center, col = NA, border = "grey25", lwd = 4, add = TRUE)
mf_title("Rencontres R 2023")
mf_credits("T. Giraud, 2023\nOpenStreetMap contributors, 2023")
mf_scale(250, unit = "m")
mf_arrow(pos = "topright")
dev.off()
Le package osrm
(Giraud, 2022b) permet de calculer des trajets par le plus court chemin en s’appuyant sur les données d’OSM.
mf_export(center, "img/avignon_routes.png", width = 768, res = 110)
mf_map(center, col = "#f2efe9", border = NA, add = TRUE)
mf_map(river, col = "#aad3df", border = "#aad3df", lwd = .5, add = TRUE)
mf_map(esp_vert, col = "#c8facc", border = "#c8facc", lwd = .5, add = TRUE)
mf_map(rail, col = "grey50", lty = 2, lwd = .2, add = TRUE)
mf_map(routes, col = "white", border = "white", add = TRUE)
mf_map(batiments, col = "#d9d0c9", border = "#c6bab1", lwd = 1, add = TRUE)
mf_map(routes_hotel, col = "#940000", lwd = 2, add = TRUE)
mf_map(hotel, col = "white", bg = "#000094", pch = 21, lwd = 1, cex = 1, add = TRUE)
mf_map(geoconf, col = "white", bg = "#646400", pch = 22, lwd = 1, cex = 3, add = TRUE)
mf_map(center, col = NA, border = "grey25", lwd = 4, add = TRUE)
mf_title("Toutes les routes mènent aux Rencontres R")
mf_credits("T. Giraud, 2023\nOpenStreetMap contributors, 2023")
mf_scale(100, unit = "m")
mf_arrow(pos = "topright")
dev.off()
Il est possible d’agréger les tronçons empruntés par plusieurs routes grâce au package stplanr
(Lovelace et Ellison, 2018).
Nous pouvons ensuite cartographier ces tronçons agrégés par classes de taille.
mf_export(center, "img/avignon_routes_ag.png", width = 768, res = 110)
mf_map(center, col = "#f2efe9", border = NA, add = TRUE)
mf_map(river, col = "#aad3df", border = "#aad3df", lwd = .5, add = TRUE)
mf_map(esp_vert, col = "#c8facc", border = "#c8facc", lwd = .5, add = TRUE)
mf_map(rail, col = "grey50", lty = 2, lwd = .2, add = TRUE)
mf_map(routes, col = "white", border = "white", add = TRUE)
mf_map(batiments, col = "#d9d0c9", border = "#c6bab1", lwd = 1, add = TRUE)
mf_map(routes_hotel_ag, var = "w", type = "grad",
breaks = c(1,5,10,20,30,33),
lwd = c(2,5,9,13,19),
leg_pos = "topleft", col= "#940000",
leg_title = 'Nombre de trajets\nempruntant la voie',
add = TRUE)
mf_map(hotel, col = "white", bg = "#000094", pch = 21, lwd = 1, cex = 1, add = TRUE)
mf_map(geoconf, col = "white", bg = "#646400", pch = 22, lwd = 1, cex = 3, add = TRUE)
mf_map(center, col = NA, border = "grey25", lwd = 4, add = TRUE)
mf_title("Toutes les routes mènent aux Rencontres R")
mf_credits("T. Giraud, 2023\nOpenStreetMap contributors, 2023")
mf_scale(100, unit = "m")
mf_arrow(pos = "topright")
dev.off()
Pebesma et Bivand (2023)
Robert J. Hijmans (2023)
Rzine vise à Encourager la production et favoriser la diffusion de documentation sur la pratique de R en SHS.
ElementR est un groupe d’autoformation qui fédère trois unités de recherche en géographie : l’UMR Géographie-Cités, l’UMR PRODIG et l’UAR RIATE.
Ses activités sont accessibles à l’ensemble des membres du Campus Condorcet.