18  Import de données

18.1 osmdata

Le package osmdata (Mark Padgham et al., 2017) permet d’extraire des données vectorielles depuis OSM en utilisant l’API Overpass turbo.

library(sf)
library(osmdata)
library(sf)
com <- st_read("data/lot.gpkg", layer = "communes", quiet = TRUE)

# Sélection de la commune de Cahors
cahors <- com[com$INSEE_COM == "46042", ]

# Définition d'une bounding box
q <- opq(bbox = st_bbox(st_transform(cahors, 4326)))

# Extraction des restaurants
req <- add_osm_feature(opq = q, key = 'amenity', value = "restaurant")
res <- osmdata_sf(req)

# Réduction du resultats :
# les points composant les polygones sont supprimés
res <- unique_osmdata(res)

Le résultat contient une couche de points et une couche de polygones. Cela signifie que certains restaurants (la très grande majorité) sont enregistrés sous forme de points dans OSM et d’autres sous forme de polygones. Pour obtenir une couche de points cohérente nous pouvons utiliser les centroïdes des polygones.

resto_point <- res$osm_points

# extraire les centroïdes des polygones
resto_poly_point <- st_centroid(res$osm_polygons)
#> Warning: st_centroid assumes attributes are constant over geometries
# identifier les champs en commun
chps <- intersect(names(resto_point), names(resto_poly_point))

# Union des deux couches
resto <- rbind(resto_point[, chps], resto_poly_point[, chps])

Affichage des résultats

library(mapview)
mapview(cahors) + mapview(resto)
Site web d’osmdata

18.2 osmextract

Le package osmextract (Gilardi et Lovelace, 2023) permet d’extraire des données depuis une base de données OSM directement. Ce package permet de travailler en local sur des volumes de données très importants et ainsi d’éviter de surcharger un serveur Overpass turbo.

La fonction oe_get() permet de télécharger un extrait de la base de données OSM sur une zone particulière et de sélectionner un type d’objet à importer.
L’argument place correspond au nom du fichier *.pbf accessible sur le site Geofabrik. L’argument extra_tag permet de sélectionner les objets de la base OSM correspondant à une clef particulière (se référer à la documentation d’OSM pour choisir les clefs).

Nous nous intéressons ici à l’ensemble des équipements (clef amenity) enregistrés dans la base OSM sous forme de points en Andorre.

library(osmextract)
osm_pt <- oe_get(place = "Andorra",      
                 layer = "points", 
                 extra_tags = "amenity", 
                 quiet = TRUE)

Des équipements de nature très variés sont saisis dans OSM:

unique(osm_pt$amenity)
#>  [1] NA                      "parking_entrance"      "fuel"                 
#>  [4] "arts_centre"           "restaurant"            "parking"              
#>  [7] "theatre"               "fast_food"             "bar"                  
#> [10] "hospital"              "atm"                   "school"               
#> [13] "pharmacy"              "ski_rental"            "toilets"              
#> [16] "bank"                  "veterinary"            "post_box"             
#> [19] "pub"                   "telephone"             "cafe"                 
#> [22] "public_building"       "shelter"               "car_wash"             
#> [25] "fountain"              "post_office"           "bench"                
#> [28] "place_of_worship"      "drinking_water"        "recycling"            
#> [31] "cinema"                "library"               "nightclub"            
#> [34] "police"                "kindergarten"          "mini_storage"         
#> [37] "bbq"                   "courthouse"            "car_rental"           
#> [40] "dojo"                  "waste_basket"          "water_point"          
#> [43] "dentist"               "doctors"               "townhall"             
#> [46] "bus_station"           "bicycle_parking"       "sanitary_dump_station"
#> [49] "charging_station"      "community_centre"      "waste_disposal"       
#> [52] "watering_place"        "internet_cafe"         "motorcycle_parking"   
#> [55] "photo_booth"           "locker"                "shower"               
#> [58] "events_venue"          "public_bookcase"       "animal_shelter"       
#> [61] "biergarten"            "childcare"             "clinic"               
#> [64] "lavoir"                "vending_machine"

Nous allons maintenant sélectionner les bars, cafés, pubs et restaurants et les visualiser sur une carte interactive.

poi <- c("bar", "cafe", "pub", "restaurant")
osm_pt <- osm_pt[osm_pt$amenity %in% poi, ]

library(leaflet)

pal <- colorFactor(palette = c("navy", "red", "darkgreen", "gold"),
                   domain = poi)

leaflet(osm_pt) |>
  addProviderTiles("OpenStreetMap.HOT") |>
  addCircleMarkers(radius = 4,
                   stroke = FALSE,
                   color = ~ pal(amenity),
                   fillOpacity = 1,
                   popup = osm_pt$name) |>
  addLegend(pal = pal,
            values = poi,
            opacity = 0.7,
            title = "OSM amenity",
            position = "bottomright"
  ) 
Site web d’osmextract