[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