<br><br><div class="gmail_quote">2009/12/16 Etienne Chové <span dir="ltr"><<a href="mailto:chove@crans.org">chove@crans.org</a>></span><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Emilie Laffray a écrit :<br>
><br>
><br>
> 2009/12/16 Etienne Chové <<a href="mailto:chove@crans.org">chove@crans.org</a> <mailto:<a href="mailto:chove@crans.org">chove@crans.org</a>>><br>
<div><div></div><div class="h5">><br>
>     Le 16/12/2009 14:53, Emilie Laffray a écrit :<br>
>      > ST_Length ne retourne que des valeurs dans l'unite de la<br>
>     projection sauf<br>
>      > si tu precises un spheroid. A noter qu'il faut Postgis 1.5 (en<br>
>     cours de<br>
>      > development) pour avoir le support geodesique.<br>
>      ><br>
>     <a href="http://postgis.refractions.net/documentation/manual-svn/ST_Length.html" target="_blank">http://postgis.refractions.net/documentation/manual-svn/ST_Length.html</a><br>
>      > pour la version sur svn<br>
>      ><br>
>      > Documentation actuelle.<br>
>      > <a href="http://postgis.refractions.net/documentation/manual-1.3/ch06.html" target="_blank">http://postgis.refractions.net/documentation/manual-1.3/ch06.html</a><br>
>      > ST_Length_spheroid<br>
>      ><br>
>      > Si tu veux une distance en metres, il me semble que tu dois pouvoir<br>
>      > faire une projection dans une zone UTM. Si tu fais la<br>
>     retroprojection a<br>
>      > chaque calcul ca va etre tres lent evidemment<br>
>      > <a href="http://trac.osgeo.org/postgis/wiki/UsersWikiNewbieMeasurementInMeters" target="_blank">http://trac.osgeo.org/postgis/wiki/UsersWikiNewbieMeasurementInMeters</a><br>
><br>
>     Si je copie cette doc pour la projection UTM, ça donne :<br>
><br>
>     SELECT route.highway,<br>
>            floor(<br>
>             sum(<br>
>              st_length(<br>
>               st_transform(<br>
>                st_intersection(zone.way, route.way),<br>
>                2163<br>
>               )<br>
>              )<br>
>             )<br>
>            ) AS distance<br>
>     FROM<br>
>       (SELECT highway, way FROM france_line WHERE highway<>'') AS route,<br>
>       (SELECT way FROM france_polygon WHERE name='Nantes') AS zone<br>
>     WHERE<br>
>       zone.way && route.way AND<br>
>       st_intersects(zone.way, route.way)<br>
>     GROUP BY<br>
>       route.highway;<br>
><br>
><br>
> 2163 est une zone pour les USA. Ça ne marchera pas pour Nantes. Tu es<br>
> obligée d'utiliser la fonction que tu trouves sur la page suivante:<br>
> <a href="http://trac.osgeo.org/postgis/wiki/UsersWikiplpgsqlfunctionsDistance" target="_blank">http://trac.osgeo.org/postgis/wiki/UsersWikiplpgsqlfunctionsDistance</a><br>
><br>
> Sinon ça ne marchera pas. Tu obtiendras une valeur erronée. La zone UTM<br>
> depend de l'endroit ou se trouve la géométrie. Une zone UTM ne couvre<br>
> que 6 degrés, et donc ca implique qu'il y a des "déformations" vers les<br>
> bords de la zone. C'est problématique pour les objets qui sont très<br>
> longs. Seul un vrai support géodésique résoudra ce problème. Ce support<br>
> géodésique va venir avec Postgis 1.5 mais ce n'est pas encore tout a<br>
> fait la.<br>
<br>
</div></div>Bon alors, wait and see.<br>
<div><div></div><div class="h5"><br></div></div></blockquote><div><br>Ta requete marcherait si tu la modifiais de la facon suivante avec la fonction utm_<br>SELECT route.highway,<br>             floor(<br>
             sum(<br>
              st_length(<br>
               st_transform(<br>
                st_intersection(zone.way, route.way),<br>
                utmzone(zone.way)<br>
               )<br>
              )<br>
             )<br>
            ) AS distance<br>
     FROM<br>
       (SELECT highway, way FROM france_line WHERE highway<>'') AS route,<br>
       (SELECT way FROM france_polygon WHERE name='Nantes') AS zone<br>
     WHERE<br>
       zone.way && route.way AND<br>
       st_intersects(zone.way, route.way)<br>
     GROUP BY<br>       route.highway;<br> <br></div></div>En terme de requête SQL, je ne suis pas sure que tu aies besoin de taper zone.way && route.way. Il me semble que ST_Intersects(zone.way, route.way) utilise déjà l'index, qui fait automatiquement un zone.way && route.way. Dans le cas présent, tu peux utiliser utmzone car la zone ne devrait pas être trop grande. Je ne sais pas dans quelle mesure la France sera affectée. Je pense que ca dépend de la manière dont tu écris ta requête. Dans l'exemple précédent, on essaie d'obtenir la zone UTM de Nantes au lieu de la zone UTM de la route. Si tu fais sur la France, clairement tu auras un problème.<br>
Je pense que ca ne changerait rien puisque la fonction sera appelée a chaque fois que tu as une route.<br>Enfin la vraie solution est bien sur un support géodésique, et la tu auras quelque chose de plus rapide et de plus précis.<br>
<br>Emilie Laffray<br>