Skip to main content

02 - Première trame - les filaires

Renvoi à cette fiche d'exemple - cas de Toulon - en mars 2026

Vérification de la présence des tags maxspped dans la version OSM Geofabrick
sudo docker exec -it alteris_postgis psql -U alteris_admin -d alteris_geo -c "SELECT count(*) FROM osm_raw.roads WHERE tags ? 'maxspeed';"

-------
 91439
(1 row)

A/ Creer les filaires

c13028_laciotat.c13028_filaires 

sudo docker exec -it alteris_postgis psql -U alteris_admin -d alteris_geo -c "
-- 1. Nettoyage
DROP TABLE IF EXISTS c13028_laciotat.c13028_filaires_v3 CASCADE;

-- 2. Création de la couche avec ta logique 'Toulon'
CREATE TABLE c13028_laciotat.c13028_filaires_v3 AS
WITH extraction AS (
    SELECT 
        osm_id,
        name AS nom_voie,
        highway AS type_osm,
        tags->'lanes' AS nb_voies,
        tags->'maxspeed' AS vitesse_max,
        ST_Transform(way, 2154) AS geom_ligne
    FROM osm_raw.roads
    WHERE highway IS NOT NULL
    AND ST_Intersects(way, (SELECT ST_Union(way) FROM osm_raw.buildings WHERE name = 'La Ciotat' AND admin_level = '8'))
),
classification AS (
    SELECT 
        osm_id, nom_voie, type_osm, geom_ligne,
        CASE 
            -- Transit Lourd (T1 & T2)
            WHEN type_osm IN ('motorway', 'motorway_link') THEN 'F_T1'
            WHEN type_osm IN ('trunk', 'trunk_link') THEN 'F_T2'
            
            -- Transit Urbain (T3) : La complexité que tu voulais garder
            WHEN type_osm IN ('primary', 'secondary') 
                 AND (nb_voies IN ('3', '4', '5', '6', '7', '8') 
                      OR vitesse_max IN ('70', '80', '90', '110', '130')) 
            THEN 'F_T3'
            
            -- Desserte (D1, D2, D3)
            WHEN type_osm = 'primary' THEN 'F_D1' 
            WHEN type_osm = 'secondary' THEN 'F_D2'
            WHEN type_osm IN ('pedestrian', 'living_street') THEN 'F_D3'
            
            -- Local (L1, L2, L3)
            WHEN type_osm IN ('tertiary', 'residential') THEN 'F_L1'
            WHEN type_osm = 'unclassified' THEN 'F_L2'
            ELSE 'F_L3'
        END as code_pattern
    FROM extraction
)
SELECT 
    osm_id, 
    nom_voie, 
    code_pattern,
    ST_Buffer(geom_ligne, 
        CASE 
            WHEN code_pattern = 'F_T1' THEN 100
            WHEN code_pattern = 'F_T2' THEN 75
            WHEN code_pattern = 'F_T3' THEN 50
            WHEN code_pattern = 'F_D1' THEN 50
            WHEN code_pattern = 'F_D2' THEN 35
            WHEN code_pattern = 'F_D3' THEN 35
            WHEN code_pattern = 'F_L1' THEN 25
            ELSE 10 
        END
    )::geometry(Polygon, 2154) as geom
FROM classification;

-- 3. Indexation spatiale
CREATE INDEX idx_c13028_filaires_v3_geom ON c13028_laciotat.c13028_filaires_v3 USING GIST(geom);
"

 

sudo docker exec -it alteris_postgis psql -U alteris_admin -d alteris_geo -c "
SELECT code_pattern, count(*) 
FROM c13028_laciotat.c13028_filaires_v3 
GROUP BY code_pattern 
ORDER BY code_pattern;"


 code_pattern | count
--------------+-------
 F_D1         |    96
 F_D2         |   179
 F_D3         |    67
 F_L1         |  1129
 F_L2         |   148
 F_L3         |  3302
 F_T1         |    40
 F_T3         |    42
(8 rows)