-- Leo's gemini proxy

-- Connecting to unbon.cafe:1965...

-- Connected

-- Sending request

-- Meta line: 20 text/gemini;

R-OpenStreetMap : Emprise au sol


2023-04-28


Inspiré du travail de SK53[1] j'ai ressorti les couverts et me suis relancé sur R (Un langage de programmation destiné au traitement de données). L'occasion d'à la fois me dérouiller un peu, de voir les interactions entre les communautés R et OpenStreetMap, et d'apprendre à jouer avec des données spatiales. Le code est fonctionnel mais nécessite encore un peu de peaufinage[2].


R n'est pas fourni par défaut sur ma distribution, ce qui a donc nécessité les bricoles d'usage pour l'installer avec l'interface RStudio – À défaut d'alternatives. Je ferai abstraction des installations de paquets nécessaires pour les librairies R par la suite (De tête il y en a eu pour pas moins de 2 Go).


En route


J'avais comme point de départ l'entrée de journal très succincte, ainsi qu'un morceau de code partagé sur le Fediverse :


qplot(x=area,data=ten,
geom="histogram",binwidth=25)
+aes(y=cumsum(
after_stat(count))
)

+labs(x="area of pitch",
y="count", title="Area of Tennis Courts in Great Britain on OSM")

+scale_x_continuous(
breaks=seq(0,2500,250),
limits=c(0,2500)
)

Bien qu'utilisant une syntaxe qui ne me sied guère le code semble relativement propre – Spoiler, je ne l'utiliserai finalement pas –, reste à savoir comment générer le jeu de données : je n'ai pas trouvé d'explication sur le passage d'une requête Overpass vers le calcul de surfaces. Ni le nettoyage des données au passage, je suppose qu'il y a aussi bien des nœuds, que des polygones, que – sigh – des multipolygones.


Spatial R : Comme le Spécial K™ mais avec plus que des lignes


J'utilise les paquets suivants :


dplyr : Manipulation de données générale ;

osmdata, sf, et units : Géographie ;

ggplot2 : Standard pour les graphiques.


Overpass dans R


En lieu et place d'un jeu de donnée externe, osmdata permet de directement faire une requête Overpass. Je l'utilise pour rechercher les chemins (ouverts ou fermés) qui portent les attributs `leisure = pitch` et `sport = tennis`.


À noter que la valeur de timeout ne suffit probablement pas pour le projet initial et qu'il faudra attendre un certain moment, je me limite au département du Doubs comme preuve de concept.


item <- area_boundingBox %>%
  opq(osm_types = "way", timeout = 180) %>%
  add_osm_feature(key = "leisure", value = "pitch") %>%
  add_osm_feature(key = "sport", value = "tennis") %>%
  osmdata_sf()

Nettoyage et calcul


Le code a généré une variable complexe avec des listes imbriquées, on peut de manière simple ne garder que les polygones – Ne me demandez pas de détails sur les autres éléments –, et calculer un nouveau champ `area` pour chaque élément correspondant à sa surface.


polygons <- item$osm_polygons

polygons <- mutate(polygons, area = st_area(polygons$geometry))

Ça donne quoi ?


Vient alors le fun, la révélation des résultats ! La fonction `summary` permet de simplement voir l'homogénéité du jeu de données, s'il y a des valeurs extrêmes ou non.


summary(polygons$area)

Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
61.09  536.55  634.11  640.94  682.94 2688.95

La valeur standard étant 260,87 m², on peut raisonnablement répondre à la question initiale de SK53 en retrouvant sa conclusion : non, les courts de tennis ne sont pas cartographiés unitairement mais plutôt par lot de 2 ou 3 si l'on se base sur les valeurs de 1er et 3eme quartiles (75 % des courts).


On pourrait s'arrêter ici, mais ce serait dommage de ne pas avoir au moins un joli graphique à encadrer chez soi :


`ggplot(polygons, aes(y=area)) + geom_boxplot()` donne une version visuelle de tableau précédent : La majorité de terrains fait entre 540 et 680 m², 25 % se trouvent en dehors ;

`plot(polygons$area)` donne un graphique brut mais néanmoins intéressant révèlant les différents éléments du jeu de données ;

`ggplot(polygons, aes(area)) + geom_freqpoly()` est encore plus intéressant, on observe globalement deux pics correspondants à une centaine de terrains proches des 260 m² attendus, ainsi que de 640 m² potentiellement deux terrains et l'espace les séparant ;

`ggplot(polygons, aes(area)) + geom_histogram(binwidth = 50)` idem que précédemment.


La fonction `coord_cartesian(xlim = c(200, 700))` permet de mettre en valeur ces deux pics en zoomant dessus.


Pour étayer la réponse à SK53 : Non, les courts de tennis – dans le Doubs et jusqu'en date de l'analyse – ne sont pas cartographiés unitairement… mais par paire ! La distribution ici penchant plus vers les paires que les simples comme en Grande-Bretagne.


Ré application : Passion bitume


Je n'ai que peu d'intérêt pour le tennis – pour ne pas parler de dégoût. Le code est cependant assez simple pour pouvoir être ré-appliqué à d'autres thèmes comme le golf et ses vastes gazons, ou, de loin un sujet que je préfère… les parkings. Il suffit alors de remplacer l'attribut de requête en `add_osm_feature(key = "amenity", value = "parking")` et le même code peut-être réutilisé sans vergogne !


On dénombre donc 11441 parkings surfaciques dans le Doubs, dont 75 % mesurent entre 100 et 830 m² – le maximum étant à 131176 pour le parking de PSA à Étupes rue Pierre Marti ! Le minimum est de 4 m², valeur plus que douteuse et en effet, cela vient d'éléments à côté de Murten (Suisse) où la valeur `parking_space` serait plus pertinente en plus d'avoir une géométrie sous-évaluée – Mes tracés sur images sont plus proches des 15 m² habituels.


Références


[1] Do people map single tennis courts?, SK53 2023

[2] R-OpenStreetMap_SurfaceArea, LeJun 2023

-- Response ended

-- Page fetched on Sun May 19 01:34:23 2024