💾 Archived View for unbon.cafe › lejun › posts › 20230428_rOsmArea.gmi captured on 2024-08-18 at 17:38:11. Gemini links have been rewritten to link to archived content
⬅️ Previous capture (2023-05-24)
-=-=-=-=-=-=-
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).
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.
J'utilise les paquets suivants :
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()
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))
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 :
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.
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.