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

Luís de Sousa luis.a.de.sousa at gmail.com
Sat Jul 23 13:44:11 EDT 2011


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 at 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 at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/portugal
>


More information about the Portugal mailing list