[OSM-dev-fr] SQL pour les pistes cyclables

Nicolas Dumoulin nicolas_openstreetmap.org at dumoulin63.net
Lun 6 Déc 16:33:46 GMT 2010


Bonsoir,

Bon, j'ai réussi à faire une requête que je vous soumets pour extraire des 
stats par commune, en l'occurence le linéaire de :
 - bandes cyclables dans les deux sens
 - bande cyclable en sens unique (même sens que les voitures)
 - contre-sens cyclable
 - bande cyclable sur un seul côté d'une voie à double sens
 - pistes cyclables à chaussée séparée
 - total (en faisant x2 pour la première longueur)

Désolé si ça pique les yeux ;-)
Les résultats ont l'air cohérents. Je suis content pour une première.

select r1.Commune,
       r1.longueur as "Bandes deux sens",
       r2.longueur as "Bande sens unique",
       opposite.longueur as "Contre-sens",
       r3.longueur as "Bande simple",
       2*r1.longueur + r2.longueur + opposite.longueur + r3.longueur as "Total 
linéaire"
from
-- cycleway=lane sans oneway
(
  select c.name as Commune, coalesce(sum(length(l.way)),'0') as longueur
  from "public".planet_osm_polygon as c
    left join "public".planet_osm_line as l
      on l.cycleway='lane' AND (l.oneway='no' OR l.oneway IS NULL) AND 
(ST_Contains(c.way, l.way) OR ST_Intersects(c.way, l.way))
  where c.admin_level='8'
  group by c.name
) as r1,
-- cycleway=lane et oneway=yes
(
  select c.name as Commune, coalesce(sum(length(l.way)),'0') as longueur
  from "public".planet_osm_polygon as c
    left join "public".planet_osm_line as l
      on l.cycleway='lane' AND l.oneway='yes' AND (ST_Contains(c.way, l.way) 
OR ST_Intersects(c.way, l.way))
  where c.admin_level='8'
  group by c.name
) as r2,
-- cycleway:opposite=lane
(
  select c.name as Commune, coalesce(sum(length(l.way)),'0') as longueur
  from "public".planet_osm_polygon as c
    left join "public".planet_osm_line as l
      on l."cycleway"='opposite_lane' AND (ST_Contains(c.way, l.way) OR 
ST_Intersects(c.way, l.way))
  where c.admin_level='8'
  group by c.name
) as opposite,
-- cycleway:left=lane et cycleway:right=lane
(
  select c.name as Commune, coalesce(sum(length(l.way)),'0') as longueur
  from "public".planet_osm_polygon as c
    left join "public".planet_osm_line as l
      on (l."cycleway:right"='lane' OR l."cycleway:left"='lane') AND 
(ST_Contains(c.way, l.way) OR ST_Intersects(c.way, l.way))
  where c.admin_level='8'
  group by c.name
) as r3
where r1.commune = r2.commune AND r1.commune=opposite.commune AND 
r1.commune=r3.commune AND (r1.longueur <> '0' OR r2.longueur <> '0' OR 
opposite.longueur <> '0' OR r3.longueur <> '0');



-- 
Nicolas Dumoulin
http://wiki.openstreetmap.org/wiki/User:NicolasDumoulin



More information about the dev-fr mailing list