[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