[Portugal] Postgis: linha de contorno de poligonos

Marco Afonso mafonso333 at gmail.com
Sat Aug 20 08:03:31 EDT 2011


Obrigado Diego.

Cheguei até aqui... e está a funcionar.
É provavel que se possa melhorar a função pois não está a verificar falhas
possiveis...
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...

CREATE OR REPLACE FUNCTION contorno(linha geometry) RETURNS geometry AS $$
DECLARE
    obstaculo RECORD;
    linha_contorno geometry;
    linha_contorno_comprimento float;
BEGIN
    linha_contorno := linha;
    FOR obstaculo IN SELECT * FROM obstaculos where
ST_Intersects(linha_contorno, the_geom) LOOP

        SELECT INTO linha_contorno, linha_contorno_comprimento
ST_LineMerge(ST_SymDifference(ring, line)) as the_geom,
ST_Length(ST_LineMerge(ST_SymDifference(ring, line))) as comprimento
FROM (
SELECT
linha_contorno as line,
ST_ExteriorRing(geom) as ring
FROM (
SELECT *
FROM ST_Dump ((
SELECT ST_Polygonize(ST_Union(ST_Boundary(poly), line)) AS mpoly
FROM
(SELECT obstaculo.the_geom AS poly) AS a,
(SELECT linha_contorno AS line) AS b
))
) t2 order by ST_Area(geom) limit 1
) t1 order by comprimento limit 1;
    END LOOP;
    RETURN linha_contorno;
END;
$$ LANGUAGE plpgsql;

No dia 19 de Agosto de 2011 13:23, Diego Moreira
<moreira.geo  gmail.com>escreveu:

> Acho que o procedimento pode ser assim:
>
> Uma função com os seguintes passos.
>
> 1 - Selecione os poligonos que intesectam o box da linha ou a propria
> linha. Vc deve definir isso, pois os resultados poderam ser
> diferentes.
> 2 - Una os poligonos; ST_Union
> 3 - Pegue o anel exterior; ST_ExteriorRing
> 4 - Faça a diferença; ST_Difference. O anel deve ser o primeiro
> parametro da função. O resultado deve ser uma coleção
> 5 - Verifique qual elemento tem menor comprimento e retorne ele.
>
> Espero ter ajudado,
>
> Com os melhores cumprimentos.
>
> Diego Moreira Carvalho
>
>
>
> Em 16 de agosto de 2011 09:40, Marco Afonso <mafonso333  gmail.com>
> escreveu:
> >
> > Boa tarde,
> > 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.
> > 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...
> > Encontrei este método para dividir poligonos
> > http://trac.osgeo.org/postgis/wiki/UsersWikiSplitPolygonWithLineString
> > 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...
> > Obrigado
> >
> >
> >
> >
> > _______________________________________________
> > Portugal mailing list
> > Portugal  lists.osgeo.org
> > http://lists.osgeo.org/mailman/listinfo/portugal
> >
> _______________________________________________
> Portugal mailing list
> Portugal  lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/portugal
>
-------------- próxima parte ----------
Um anexo em HTML foi limpo...
URL: http://lists.osgeo.org/pipermail/portugal/attachments/20110820/371ff72d/attachment.html


More information about the Portugal mailing list