[OSM-talk-fr] [osmose] "too many ways in relation"
Yoann ARNAUD
yarnaud at crans.org
Dim 19 Juil 08:23:22 UTC 2009
sylvain letuffe a écrit :
> Ben alors ? alala, ces passionnés, impossible d'être "vraiment" en vacances et
> de tout laisser de coté.
Héhé, en fait je retappe une maison à la campagne, il faut bien que je
m'occupe le soir ;)
>> et ce, en optant pour la
>> superposition des ways.
> +
>> On peut, ça limite le nombre de faux, mais ça ne résoud pas ce que je
>> cherche à résoudre :(
>
> <mode philosophe à 2 balles>
> A résoudre ? mais y'a-t-il un problème ? Ou alors "aiguiller" vers une méthode
> pour tagguer (qui consiste à superposer des ways) ?
Mon "problème" est d'écrire la requête ci-dessous, en fait.
>> Mon idée à moi est d'éxécuter dans postgis une requête qui fait ça :
>>
>> - Trouver dans une relation admin_level = 8,
>> - deux ways successifs (qui se touchent),
>> - qui appartiennent tous les 2 exactement aux mêmes relations
>> admin_level = 8
> fiuuu, ça m'a l'air coton... j'ai pas d'idée
>>> PS: quid du test d'intersection de way boundary ou de même
>>> natural/landuse ? qui monteraient à coup sûr un croisement pas normal ?
>> Pareille, si on m'aide pour la requête, je le testerai.
>
> Etienne avait déjà fait pas mal d'essais mais on a découvert que osm2pgsql
> (qui est le plus abouti pour faire du osm->objet GIS) n'était pas fichu
> d'enregistrer de manière cohérente les coordonnées dans la base et on se
> retrouvait avec des erreurs d'arrondi.
>
> De sorte que la fonction GIS classique pour faire ça : un tout "bête"
> st_intersects sortait plein de faux positif car 1 cas sur deux, deux ways qui
> se touchent uniquement étaient considérés comme s'intersectant.
> (je sais pas si je suis clair sans dessin)
>
> Solution 1, propre et dure : patcher osm2pgsql pour corriger le problème
Etienne a fait ça récemment, cependant il faut réimporter entièrement la
base postgis car elle est pleine d'arrondis. Il fera ça en septembre sur
le backend d'Osmose.
> solution 2, bidouille douteuse et lente alternative que j'ai trouvé :
> ****************
> select astext(st_transform(st_intersection(l1.way,l2.way),4020)) as
> point_insersection, l1.osm_id,l2.osm_id from planet_osm_line as l1,
> planet_osm_line as l2 where
> st_intersects(ST_RemovePoint(ST_RemovePoint(l1.way,st_npoints(l1.way)-1),0),ST_RemovePoint(ST_RemovePoint(l2.way,st_npoints(l2.way)-1),0))
> and l1.way && l2.way and l1.boundary='administrative' and
> l2.boundary='administrative' and l1.osm_id>0 and l2.osm_id>0 and
> l1.osm_id!=l2.osm_id and st_npoints(l1.way)>4 and st_npoints(l2.way)>4 and
> l1.way && st_transform('SRID=4020;LINESTRING(0 40,4 45)',900913) limit 5;
> ****************
> Bien que cette requête semble marcher, elle n'est pas du tout optimisée et son
> temps de traitement est abominable. Je cherche toujours...
Bon ben attendons septembre alors...
--
Yoann.
Plus d'informations sur la liste de diffusion Talk-fr