From a54d5322f3e1826b1989164ea1101a9e2475e76f Mon Sep 17 00:00:00 2001 From: Laupie2 Date: Thu, 5 Feb 2026 13:07:37 +0100 Subject: [PATCH] code de simplification de parking MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ce code permet de simplifier la représentation des parkings sur openardennemap. Avant, certains parkings comme ceux des campings étaient représenté par des voies de circulation ayant pour tag "service". Ils ne ressemblaient donc pas à un parking. Ce code permet de simplifier les routes services à l'interieur des lieux de camping + de prendre les zones ayant comme tag parking directement et de faire des ces zones, des zones de parkings sous forme polygone. --- .../parkingcodecomment\303\251.sql" | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 "ticket_4_parkingsimplification/parkingcodecomment\303\251.sql" diff --git "a/ticket_4_parkingsimplification/parkingcodecomment\303\251.sql" "b/ticket_4_parkingsimplification/parkingcodecomment\303\251.sql" new file mode 100644 index 0000000..6644fb0 --- /dev/null +++ "b/ticket_4_parkingsimplification/parkingcodecomment\303\251.sql" @@ -0,0 +1,83 @@ +WITH bbox AS ( + SELECT ST_Transform( + ST_MakeEnvelope( + 5.05, -- longitude Ouest + 49.78, -- latitude Sud + 5.10, -- longitude Est + 49.82, -- latitude Nord + 4326 -- système de coordonnées WGS84 + ), + 31370 -- Projection métrique (Web Mercator), on en aura besoin à cause de la future création de buffer + ) AS zone -- ici on créer une zone d'étude (plus précisement dans la ville de Bouillon pour étudier les parkings) +), + +parkings_campings AS ( + SELECT -- sélection des parkings et campings OSM situés dans la zone d'étude + osm_id, -- identifiant unique OpenStreetMap + ST_MakeValid(way) AS geom -- si un parking a une géométrie un peu cassée, avec cette ligne elle est corrigée pour éviter des bugs plus tard + FROM planet_osm_polygon, bbox + WHERE ( + amenity = 'parking' -- selection Parkings + OR tourism = 'camp_site' -- selection Campings + ) + AND ST_Intersects( + way, + bbox.zone -- uniquement ceux qui intersect la zone de Bouillon + ) +), + +service_roads AS ( + SELECT + ST_MakeValid(way) AS geom -- réparation des routes au cas ou il y aurait des bugs + FROM planet_osm_line, bbox + WHERE highway = 'service' -- Routes de type et qui ont le tag "service", pas les autoroutes et nationales + AND ST_Intersects( + way, + bbox.zone -- routes uniquement présente dans la zone de bouillon +), + +parking_with_roads AS ( --- creation table temporaire + fusion des parkings/campings avec leurs routes de service associées + SELECT + p.osm_id, -- Identifiant du parking/camping en sortie + + ST_Union( -- création d'une géom unique qui integre le parking et les routes + ARRAY[ -- permet d'avoir plusieurs geoms dans le ST_union + p.geom, -- Géométrie du parking ou camping finale sera plusieurs choses d'ou l'union 1. ici d'abord le parking + + COALESCE( -- on récupère des portions de routes qui se trouvent dans un buffer de 5 mètres autour du parking et avec le ST_union on fait une forme qui lie à la fois le parking et à la fois les routes trouvées autours*/ + ST_Union( + ST_Intersection( + r.geom, + ST_Buffer(p.geom, 5) -- zone d'influence du parking, on ne prend que la route qui est "utile" au parking et qui se retrouve donc dans un buffer de 5m autour + ) + ), + p.geom -- valeur de secours si aucune route n'existe, on reprend le parking lui même + ) + ] --- tableau des geom fermés + ) AS geom --- geom finale par parking + FROM parkings_campings p + + LEFT JOIN service_roads r -- Jointure spatiale avec les routes de service proches, permet de voir si les routes "service" passent à moins de 3m d'un parking + ON ST_Intersects( + p.geom, + ST_Buffer(r.geom, 3) -- Tolérance spatiale de 3 mètres, si une route "service" passe à moins de 3m du parking, on considère qu'elle en fait partie + ) + + GROUP BY p.osm_id, p.geom -- agregation pour fusionner les parkings et les routes qui leurs sont associés +) + +SELECT + osm_id AS cid, -- on renomme l'identifiant pour la couche finale + ST_SimplifyPreserveTopology( -- ici on va nettoyer la géométrie + ST_Buffer( + geom, + 2, -- Buffer de 2 mètres, permet d'arrondir les bords du parkings + 'join=round' + ), + 1 -- permet de simplifier et de lisser le résultat pour ne pas juste avoir un cercle "parfait" tout en gardant le côté arrondi amener par le buffer + ) AS geom +FROM parking_with_roads + + +WHERE geom IS NOT NULL + AND NOT ST_IsEmpty(geom); -- exclusion des géométries nulles ou vides