Re: [Portugal] Postgis - obter morada da rua mais próxima do ponto

Pedro Venâncio pedrongvenancio at yahoo.com
Sat Jul 23 18:13:58 EDT 2011


Olá Luís,

Pois, correndo o UPDATE depois de inserir os pontos, a coisa funciona, a trigger é que, aparentemente, não está a funcionar, mas também não devolve erro nenhum. No meio de tantas sub-queries, a certa altura já não consigo perceber se os "NEW." da trigger estão nas variáveis certas, mas já fiz várias tentativas e o resultado é sempre o mesmo... não preenche o campo morada_rede_viaria.


Como posso emitir a mensagem que referes?

Muito obrigado!

Abraço,
Pedro






----- Original Message -----
From: Luís de Sousa 

Olá Pedro,

Não consigo encontrar erros no trigger. Parece-me simplesmente que a
query não está a devolver resultados. Também poderá estar a devolver
mais que uma linha no resultado. O melhor é experimentar emitir uma
mensagem com o conteúdo do campo morada_rede_viaria antes do return
para ter a certeza.

Boa sorte,

Luís

2011/7/23 Pedro Venâncio <pedrongvenancio  yahoo.com>:
> Olá boa tarde,
>
>
> Ando há uns dias a tentar encontrar solução para este problema, inserir automaticamente a morada numa tabela postgis de pontos a partir da morada que se encontra numa tabela de linhas (rede_viaria). A solução que encontrei passa por obter a morada a partir da linha que se encontra mais próxima do ponto (até um limite de 80m):
>
> UPDATE plantas_emitidas
> SET morada_rede_viaria = morada
> From
> (select  t2.gid as p_id, t1.nome as morada
> from rede_viaria t1, plantas_emitidas t2,
> (select gid as plantas_emitidas_gid, (select gid from rede_viaria order by st_distance(rede_viaria.the_geom, plantas_emitidas.the_geom) limit 1 ) as rede_viaria_gid from plantas_emitidas) as t3
> where t1.gid = t3.rede_viaria_gid and t2.gid = t3.plantas_emitidas_gid and st_dwithin(t1.the_geom, t2.the_geom,80)
> ORDER BY t2.ref_int) as foo
> where p_id = plantas_emitidas.gid
>
> Esta solução funciona perfeitamente, no entanto não consigo criar uma trigger para a correr automaticamente sempre que adiciono novos pontos. Tentei assim
>
> CREATE OR REPLACE FUNCTION preenche_morada_plantas_from_rede_viaria()
> RETURNS TRIGGER AS
> $BODY$
> BEGIN
> SELECT morada INTO NEW.morada_rede_viaria
> From
> (select  t2.gid as p_id, t1.nome as morada
> from rede_viaria t1, plantas_emitidas t2,
> (select NEW.gid as plantas_emitidas_gid, (select gid from rede_viaria order by st_distance(rede_viaria.the_geom, NEW.the_geom) limit 1 ) as rede_viaria_gid from plantas_emitidas) as t3
> where t1.gid = t3.rede_viaria_gid and NEW.gid = t3.plantas_emitidas_gid and st_dwithin(t1.the_geom, t2.the_geom,80)
> ORDER BY t2.ref_int) as foo
> where p_id = NEW.gid;
> RETURN NEW;
> END;
> $BODY$
> LANGUAGE plpgsql VOLATILE
>
> CREATE TRIGGER update_nome_rua_plantas_from_rede_viaria
>   BEFORE INSERT OR UPDATE
>   ON plantas_emitidas
>   FOR EACH ROW
>   EXECUTE PROCEDURE preenche_morada_plantas_from_rede_viaria();
>
>
> Não dá erros, mas também não preenche o campo morada_rede_viaria na tabela de pontos.
>
>
> Agradeço quaisquer sugestões que me possam dar os mais experientes, porque acho que já não consigo avançar mais... Se for mais simples chegar ao mesmo resultado por outro caminho, também agradeço as dicas que me possam dar!
>
>
> Abraço! Bom fim de semana!
>
>
> Pedro Venâncio
>
> _______________________________________________
> Portugal mailing list
> Portugal  lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/portugal
>



More information about the Portugal mailing list