Obrigado Diego.<div><br></div><div>Cheguei até aqui... e está a funcionar.</div><div>É provavel que se possa melhorar a função pois não está a verificar falhas possiveis...</div><div>A função recebe uma LINESTRING como argumento e retorna outra LINESTRING que contorna poligonos da tabela obstaculos que a 1ª intersecte. Isto considerando que os obstaculos não se intersectam...</div>
<div><br></div><div><div>CREATE OR REPLACE FUNCTION contorno(linha geometry) RETURNS geometry AS $$</div><div>DECLARE</div><div>    obstaculo RECORD;</div><div>    linha_contorno geometry;</div><div>    linha_contorno_comprimento float;</div>
<div>BEGIN</div><div>    linha_contorno := linha;</div><div>    FOR obstaculo IN SELECT * FROM obstaculos where ST_Intersects(linha_contorno, the_geom) LOOP</div><div><br></div><div>        SELECT INTO linha_contorno, linha_contorno_comprimento</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>ST_LineMerge(ST_SymDifference(ring, line)) as the_geom,</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>ST_Length(ST_LineMerge(ST_SymDifference(ring, line))) as comprimento</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>FROM (</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>SELECT </div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>linha_contorno as line,</div>
<div><span class="Apple-tab-span" style="white-space:pre">                        </span>ST_ExteriorRing(geom) as ring </div><div><span class="Apple-tab-span" style="white-space:pre">                </span>FROM (</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>SELECT *<span class="Apple-tab-span" style="white-space:pre">        </span></div>
<div><span class="Apple-tab-span" style="white-space:pre">                        </span>FROM ST_Dump ((</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>SELECT ST_Polygonize(ST_Union(ST_Boundary(poly), line)) AS mpoly</div>
<div><span class="Apple-tab-span" style="white-space:pre">                                </span>FROM</div><div><span class="Apple-tab-span" style="white-space:pre">                                        </span>(SELECT obstaculo.the_geom AS poly) AS a,</div><div><span class="Apple-tab-span" style="white-space:pre">                                        </span>(SELECT linha_contorno AS line) AS b</div>
<div><span class="Apple-tab-span" style="white-space:pre">                        </span>))</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>) t2 order by ST_Area(geom) limit 1</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>) t1 order by comprimento limit 1;</div>
<div>    END LOOP;</div><div>    RETURN linha_contorno;</div><div>END;</div><div>$$ LANGUAGE plpgsql;</div><br><div class="gmail_quote">No dia 19 de Agosto de 2011 13:23, Diego Moreira <span dir="ltr">&lt;<a href="mailto:moreira.geo@gmail.com">moreira.geo@gmail.com</a>&gt;</span> escreveu:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Acho que o procedimento pode ser assim:<br>
<br>
Uma função com os seguintes passos.<br>
<br>
1 - Selecione os poligonos que intesectam o box da linha ou a propria<br>
linha. Vc deve definir isso, pois os resultados poderam ser<br>
diferentes.<br>
2 - Una os poligonos; ST_Union<br>
3 - Pegue o anel exterior; ST_ExteriorRing<br>
4 - Faça a diferença; ST_Difference. O anel deve ser o primeiro<br>
parametro da função. O resultado deve ser uma coleção<br>
5 - Verifique qual elemento tem menor comprimento e retorne ele.<br>
<br>
Espero ter ajudado,<br>
<br>
Com os melhores cumprimentos.<br>
<br>
Diego Moreira Carvalho<br>
<br>
<br>
<br>
Em 16 de agosto de 2011 09:40, Marco Afonso &lt;<a href="mailto:mafonso333@gmail.com">mafonso333@gmail.com</a>&gt; escreveu:<br>
<div><div></div><div class="h5">&gt;<br>
&gt; Boa tarde,<br>
&gt; Gostaria de saber se existe uma forma de, dado um ponto inicial A e um ponto final B, chegar a uma LINESTRING (a mais curta) que contorne N poligonos que possam existir entre estes dois pontos.<br>
&gt; Conheço a solução pgRouting... mas gostava de saber se apenas com operações entre geometrias (ST_SymDifference, ST_Intersection, ST_LineMerge, etc...) seria possível chegar a uma linha que contornasse poligonos...<br>

&gt; Encontrei este método para dividir poligonos<br>
&gt; <a href="http://trac.osgeo.org/postgis/wiki/UsersWikiSplitPolygonWithLineString" target="_blank">http://trac.osgeo.org/postgis/wiki/UsersWikiSplitPolygonWithLineString</a><br>
&gt; Apartir destes resultados, penso que seria possível order por comprimento do perímetro e fazer ST_SymDifference + ST_LineMerge da linha inicial... mas ainda não cheguei a uma query que funcionasse... ou talvez não seja possível de todo...<br>

&gt; Obrigado<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
</div></div>&gt; _______________________________________________<br>
&gt; Portugal mailing list<br>
&gt; <a href="mailto:Portugal@lists.osgeo.org">Portugal@lists.osgeo.org</a><br>
&gt; <a href="http://lists.osgeo.org/mailman/listinfo/portugal" target="_blank">http://lists.osgeo.org/mailman/listinfo/portugal</a><br>
&gt;<br>
_______________________________________________<br>
Portugal mailing list<br>
<a href="mailto:Portugal@lists.osgeo.org">Portugal@lists.osgeo.org</a><br>
<a href="http://lists.osgeo.org/mailman/listinfo/portugal" target="_blank">http://lists.osgeo.org/mailman/listinfo/portugal</a><br>
</blockquote></div><br></div>