[OSM-dev-fr] regrouper les voies parallèles
Vincent Pottier
vpottier at gmail.com
Ven 25 Mar 10:20:48 GMT 2011
Le 25/03/2011 09:15, Nicolas Dumoulin a écrit :
> Bonjour,
>
> Ma problématique de départ est de calculer la longueur des aménagements
> cyclables d'une commune, sens unique et double-sens. Facile. Sauf que j'ai
> deux situations qui posent problèmes :
>
> - quand il y a deux pistes séparées de la chaussée, une de chaque côté. Ça
> fait deux ways dans la base, qui sont détectés avec une approche naïve comme
> deux sections en sens-unique. Or, je voudrai comptabiliser une fois la
> longueur de la rue équipée. Exemple :
> http://www.openstreetmap.org/?lat=45.775679&lon=3.090125&zoom=18&layers=M
>
> - quand une voie séparée en deux est équipée de bandes cyclables, là aussi ça
> donne deux comptages en sens unique. Exemple :
> http://www.openstreetmap.org/?lat=45.76286&lon=3.11849&zoom=17&layers=C
>
> L'idée serait donc de trouver un moyen de regrouper les voies parallèles à une
> distance en dessous d'un seuil.
>
> 1. Est-ce faisable avec postgis ?
Certainement. Mais, si les exceptions ne sont pas trop nombreuses
('osm_id NOT IN (...)' ), il vaut mieux les exclure du calcul général et
les calculer à part.
Sinon je crois bien il faut une sacrée requête avec de bonnes jointures
et avec un buffer
On crée une table dans laquelle chaque way reçoit un buffer
On compte le nombre de buffer dans lequel s'incrit chaque way (>= au
moins le sien)
On divise la longueur du way par le nombre de buffers
On réutilise la même table temporaire pour réutiliser les mêmes
conditions de sélection de way
Après, il suffit d'ajuster les paramètre du buffer. Là, je ne maitrise
pas bien (SRID...)
WITH buffered AS (
SELECT *, ST_BUFFER(...) as buffer
FROM ma_table
WHERE conditions
)
SELECT *, ST_LENGTH(cycle.way)/count(buf.osm_id) AS length
FROM buffered AS cycle
JOIN buffered AS buf
ON ST_WITHIN(cycle.way, buf.buffer)
Pas testé non plus.
--
FrViPofm
Plus d'informations sur la liste de diffusion dev-fr