<div dir="ltr">Bom dia,<br><br>Sei que este não é um forúm de programação, mas desconfio que haverá por aqui malta que talvez me possa ajudar<br>(desconfio que a solução será simples).<br><br>Estou a usar o pgrouting para cálculo de áreas de influência de escolas, tendo como base informação do osm. Concretamente, estou a usar a função pgr_drivingdistance.<br>
<br>Estou a criar uma tabela para cada nó destino (escola) que me devovle o id de cada nó da rede, o custo de deslocação e a geometria associada.<br><br>O código é o seguinte: <br><br>-----<br>drop table if exists contagio71197;<br>
create table contagio71197 as<br>SELECT foo.id1 as no, foo.cost as cost71197, vertices_tmp.the_geom<br> FROM vertices_tmp inner join pgr_drivingdistance('<br>      SELECT gid AS id,<br>          source,<br>          target,<br>
          tempo::float8 AS cost<br>      FROM lisboa',<br>      71197,<br>      20,<br>      false,<br>      false) as foo<br>on (<a href="http://vertices_tmp.id">vertices_tmp.id</a> = foo.id1);<br><br>---------------------------------<br>
<br>De seguida o que faço é celeccionar o custo mínimo com a função least para ele me dar para cada nó a distância à escola mais próxima.<br><br>Bom, o problema é que tenho cerca de 100 escolas e estar a correr isto 100 vezes, alterando nomes não é propriamente um exemplo de boas práticas.<br>
<br>Escrevi o seguinte código que corre o código acima dentro de um loop. A coluna numero.nn tem os ids de todos os nós que correspondem a escolas.<br><br>---------------------------------------<br>DO $$<br>DECLARE<br>    i integer;<br>
BEGIN<br>FOR i IN (select nn from numero)<br>LOOP<br>EXECUTE <br>'create table contagio' || i || ' as<br>SELECT id1 as no, cost as cost' || i ||<br>' FROM pgr_drivingdistance('<br>      SELECT gid AS id,<br>
          source,<br>          target,<br>          tempo::float8 AS cost<br>      FROM lisboa', '<br>      || i || ' ,<br>      30,<br>      false,<br>      false)'<br>;<br>END LOOP;<br>END; <br>$$;<br><br>
---------------------------------------------------------------------------<br><br>Bom, o problema está nas " ' ". A seguir ao EXECUTE tenho uma string com o query. Mas dentro dessa string uso uma função, o pgr_drivingdistance, cujo primeiro argumento também é uma string.<br>
<br>Tentei resolver o problema com duplos dollar ($$), mas não resulta. Mais concretamente, num query simples, o pgr_drivingdistance corre com os $$; dentro do EXECUTE não.<br><br>Provavelmente para alguma malta que anda por aqui a solução será trivial. Infelizmente para mim não.<br>
<br>Obrigado.<br>Abraço,<br>António<br></div>