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

Pedro Venâncio pedrongvenancio at yahoo.com
Sat Jul 23 09:09:46 EDT 2011


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



More information about the Portugal mailing list