<html>
<head>
<meta content="text/html; charset=ISO-8859-1"
http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#000000">
Resolvido, troquei os cifrões por plicas<br>
<br>
<br>
On 22-08-2011 11:50, Pedro Costa wrote:
<blockquote cite="mid:4E523468.2080801@sapo.pt" type="cite">
<meta content="text/html; charset=ISO-8859-1"
http-equiv="Content-Type">
Pessoal alguém pode ajudar-me a inserir a funçaõ via shell? Dá-me
erro e penso que está relacionado com os cifrões $$<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
On 22-08-2011 02:04, Diego Moreira wrote:
<blockquote
cite="mid:CADUiXMKyp3QUago=2ur1BYJRMTS87xFJNP6rCTvJrRaHXHMb9A@mail.gmail.com"
type="cite">Boa Noite Pedro,<br>
<br>
Como sugestão do Pedro Venâncio, e tbm considero importante
vamos dar fechamento ao post. Vou voltar a te responder aqui
para caso alguem venha depois, será mais fácil encontrar uma
resposta.<br>
<br>
Segue a conversa referente a esse post, mas que estava em outro.<br>
<br>
<b><span style="color: rgb(255, 0, 0);">Em 20-08-2011 23:34,
Diego Moreira escreveu: </span></b>
<div style="color: rgb(255, 0, 0);"><b><span
id="q_131ec599ffbb8185_1" class="h4"><br>
</span></b></div>
<b><span style="color: rgb(255, 0, 0);"> Opá, </span><br
style="color: rgb(255, 0, 0);">
<span style="color: rgb(255, 0, 0);"> </span><br
style="color: rgb(255, 0, 0);">
<span style="color: rgb(255, 0, 0);"> Então </span><span
style="color: rgb(255, 0, 0);" class="il">Pedro</span><span
style="color: rgb(255, 0, 0);">,</span><br style="color:
rgb(255, 0, 0);">
<span style="color: rgb(255, 0, 0);"> </span><br
style="color: rgb(255, 0, 0);">
<span style="color: rgb(255, 0, 0);"> Esse problema, no meu
ponto de vista, pode ser resolvido de duas formas:</span><br
style="color: rgb(255, 0, 0);">
<span style="color: rgb(255, 0, 0);"> </span><br
style="color: rgb(255, 0, 0);">
<span style="color: rgb(255, 0, 0);"> 1 - Refatorar a tabela
rua para que permita somente lineString. Uma Rua é composta
por vários trechos, cada tupla da tabela seria um trecho.
(Acho a mais interessante).</span><br style="color: rgb(255,
0, 0);">
<span style="color: rgb(255, 0, 0);"> </span><br
style="color: rgb(255, 0, 0);">
<span style="color: rgb(255, 0, 0);"> 2 - "Encapsular" a
função </span><code style="color: rgb(255, 0, 0);">ST_Line_Interpolate_Point,
</code><span style="color: rgb(255, 0, 0);">caso vc tenha uma
MultiLine, ela calcula o ponto a X distancia para cada linha
e retorna um multPoint.</span><br style="color: rgb(255, 0,
0);">
<span style="color: rgb(255, 0, 0);"> </span><br
style="color: rgb(255, 0, 0);">
<span style="color: rgb(255, 0, 0);"> O que acha?</span><br
style="color: rgb(255, 0, 0);">
<span style="color: rgb(255, 0, 0);"> </span><br
style="color: rgb(255, 0, 0);">
<span style="color: rgb(255, 0, 0);"> </span><br
style="color: rgb(255, 0, 0);" clear="all">
<span style="color: rgb(255, 0, 0);"> Diego Moreira Carvalho </span><br
style="color: rgb(255, 0, 0);">
<span style="color: rgb(255, 0, 0);"> </span><br
style="color: rgb(255, 0, 0);">
<br style="color: rgb(255, 0, 0);">
<span style="color: rgb(255, 0, 0);">Caro Diego,</span><br
style="color: rgb(255, 0, 0);">
<span style="color: rgb(255, 0, 0);"> </span><br
style="color: rgb(255, 0, 0);">
<span style="color: rgb(255, 0, 0);"> Eu preferia optar pela
segunda opção uma vez que não me era conveniente modificar
os trechos...Pode ajudar-me a fazer isso para testarmos?</span><br
style="color: rgb(255, 0, 0);">
<span style="color: rgb(255, 0, 0);"> </span></b>
<pre cols="72"><b><span style="color: rgb(255, 0, 0);">Com os melhores cumprimentos,
</span><span style="color: rgb(255, 0, 0);" class="il">Pedro</span><span style="color: rgb(255, 0, 0);"> Costa
Geógrafo
Especializado em Sistemas de Informação Geográfica e Ordenamento do Território</span></b>
</pre>
<br>
Respondendo:<br>
<br>
Seguem duas funções:<br>
<br>
<b style="color: rgb(0, 102, 0);">CREATE OR REPLACE FUNCTION
smartUnion(geom1 geometry, geom2 geometry) RETURNS geometry AS
$$<br>
-- Autor: Diego Moreira Carvalho<br>
-- E-mail: <a moz-do-not-send="true"
href="mailto:moreira.geo@gmail.com">moreira.geo@gmail.com</a><br>
-- Data: 20/08/2011<br>
-- Descrição: Esta função retorna a união das duas geometrias,
caso alguma geometria seja inválida, retorna a que é válida.<br>
DECLARE<br>
retorno geometry;<br>
BEGIN<br>
IF ST_IsValid(geom1) AND ST_IsValid(geom2) THEN<br>
retorno := ST_Union(geom1, geom2);<br>
ELSIF ST_IsValid(geom1) THEN<br>
retorno := geom1;<br>
ELSIF ST_IsValid(geom2) THEN<br>
retorno := geom2;<br>
END IF;<br>
RETURN retorno; <br>
END;<br>
$$ LANGUAGE plpgsql;<br>
<br>
<br>
CREATE OR REPLACE FUNCTION
Line_Interpolate_Point_Alter(a_linestring geometry, a_fraction
float) RETURNS geometry AS $$<br>
-- Autor: Diego Moreira Carvalho<br>
-- E-mail: <a moz-do-not-send="true"
href="mailto:moreira.geo@gmail.com">moreira.geo@gmail.com</a><br>
-- Data: 21/08/2011<br>
-- Descrição: Esta função é o encapsulamento da função
ST_Line_Interpolate_Point para aceitar multiLines<br>
DECLARE<br>
numGeometries integer;<br>
it integer;<br>
segment geometry;<br>
point geometry;<br>
retorno geometry;<br>
BEGIN<br>
numGeometries := ST_NumGeometries(a_linestring); <br>
<br>
IF numGeometries > 0 THEN<br>
numGeometries := numGeometries;<br>
ELSE<br>
numGeometries := 0;<br>
END IF;<br>
<br>
IF numGeometries > 0 THEN<br>
it := 1;<br>
WHILE it < (numGeometries + 1) LOOP<br>
segment := ST_GeometryN(a_linestring, it);<br>
point := ST_Line_Interpolate_Point(segment,
a_fraction);<br>
retorno := smartUnion(point, retorno);<br>
it := it +1;<br>
END LOOP;<br>
ELSE<br>
point := ST_Line_Interpolate_Point(a_linestring,
a_fraction);<br>
retorno := point;<br>
END IF;<br>
RETURN retorno; <br>
END;<br>
$$ LANGUAGE plpgsql;<br>
</b><br>
Vc deve usa-la assim:<br>
<br>
UPDATE passeios <br>
SET rua =<br>
(SELECT FID_ FROM ruas<br>
ORDER BY ST_Distance(<b style="color: rgb(0, 102, 0);">
Line_Interpolate_Point_Alter</b>(ruas.wkb_geometry, 0.5),
passeios.wkb_geometry)) ASC LIMIT 1)<br>
<br>
Qualquer problema é só falar;<br>
<br>
<br>
Com os melhores cumprimentos,<br>
<br clear="all">
Diego Moreira Carvalho <br>
<br>
<br>
<br>
<div class="gmail_quote">Em 19 de agosto de 2011 12:53, Pedro
Costa <span dir="ltr"><<a moz-do-not-send="true"
href="mailto:pedrocostaarma@sapo.pt">pedrocostaarma@sapo.pt</a>></span>
escreveu:<br>
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div bgcolor="#FFFFFF" text="#000000"> Encontrei que podemos
acrescentar geometryN para aceita multi-geometrias:<br>
<br>
UPDATE passeios <br>
SET rua =<br>
(SELECT FID_ FROM ruas<br>
<br>
<br>
ORDER BY
ST_Distance(ST_Line_Interpolate_Point(geometryN(ruas.wkb_geometry,
0.5), passeios.wkb_geometry)) ASC LIMIT 1)<br>
<br>
<br>
No entanto não reconhece a função
<div class="im"><br>
<br>
<br>
<br>
On 19-08-2011 13:28, Diego Moreira wrote: </div>
<div>
<div class="h5">
<blockquote type="cite">Resolveu?<br>
<br clear="all">
Diego Moreira Carvalho <br>
<br>
<br>
<br>
<div class="gmail_quote">Em 19 de agosto de 2011
09:13, Diego Moreira <span dir="ltr"><<a
moz-do-not-send="true"
href="mailto:moreira.geo@gmail.com"
target="_blank">moreira.geo@gmail.com</a>></span>
escreveu:<br>
<blockquote class="gmail_quote" style="margin:0 0
0 .8ex;border-left:1px #ccc
solid;padding-left:1ex"> O método
ST_Line_Interpolate_Point retorna um ponto ao
longo de uma linha dado uma porcentagem do
comprimento desta linha.... se passarmos sempre
0.5, teremos sempre o meio da linha...
independente do numero de vértices que ela tem,<br>
Agora eu acho que resolve<br>
<br>
<br>
"UPDATE passeios SET rua =<br>
(SELECT FID_ FROM eixos_rua ORDER BY
ST_Distance(<b>ST_Line_Interpolate_Point(eixos_rua.wkb_geometry,
0.5)</b> , passeios.wkb_geometry) ASC LIMIT
1)"<br>
<br>
<br>
Diego Moreira Carvalho<br>
<br>
<br>
<br>
<br>
Em 19 de agosto de 2011 08:54, Pedro Costa <<a
moz-do-not-send="true"
href="mailto:pedrocostaarma@sapo.pt"
target="_blank">pedrocostaarma@sapo.pt</a>>
escreveu:
<div>
<div> <br>
> Exactamente, neste caso estou a mudar a
unha, mas sabes alguma maneira mais<br>
> rápida?<br>
><br>
> Obrigado<br>
><br>
><br>
><br>
> On 19-08-2011 12:50, Diego Moreira
wrote:<br>
><br>
> Provavelmente os mal atribuídos estao
relacionados a ruas que tem somente<br>
> dois ou tres pontos.... da para
resolver...<br>
><br>
> Em 19/08/2011 06:47, "Pedro Costa" <<a
moz-do-not-send="true"
href="mailto:pedrocostaarma@sapo.pt"
target="_blank">pedrocostaarma@sapo.pt</a>>
escreveu:<br>
>> Caro Diego,<br>
>><br>
>> Funcionou... Obrigado pela ajuda.<br>
>> Apesar de tudo alguns passeios
ainda são mal atribuídos, mas melhorou<br>
>> bastante...<br>
>><br>
>> Com os melhores cumprimentos,<br>
>><br>
>> Pedro Costa<br>
>><br>
>><br>
>><br>
>><br>
>><br>
>> Em 18-08-2011 20:04, Diego Moreira
escreveu:<br>
>>> Acho que vai dar certo, o pg
numa divisão do tipo 3/2 retorna 1,<br>
>>> retornaria 1.5 se fosse
3.0/2...<br>
>>> Então... acho que vai
funcionar.<br>
>>><br>
>>> Diego Moreira Carvalho<br>
>>><br>
>>><br>
>>><br>
>>> Em 18 de agosto de 2011 16:00,
Diego Moreira <<a moz-do-not-send="true"
href="mailto:moreira.geo@gmail.com"
target="_blank">moreira.geo@gmail.com</a><br>
>>> <mailto:<a
moz-do-not-send="true"
href="mailto:moreira.geo@gmail.com"
target="_blank">moreira.geo@gmail.com</a>>>
escreveu:<br>
>>><br>
>>> NumPoints(geometry)<br>
>>><br>
>>> Encontra e Retorna o número de
pontos na primeira linha na<br>
>>> geometria. Retorna NULO se não
há nenhuma linha na geometria.<br>
>>><br>
>>> PointN(geometry,integer)<br>
>>><br>
>>> Retorna o enésimo ponto na
primeira linha na geometria.<br>
>>> Retorna NULO se não há nenhuma
linha na geometria.<br>
>>><br>
>>> "UPDATE passeios SET rua =<br>
>>> (SELECT FID_ FROM eixos_rua
ORDER BY<br>
>>>
ST_Distance(PointN(eixos_rua.wkb_geometry,<br>
>>>
NumPoints(eixos_rua.wkb_geometry)/2) ,
passeios.wkb_geometry) ASC<br>
>>> LIMIT 1)"<br>
>>><br>
>>><br>
>>> Sera que isso dá certo? caso
não, o problema é que a função PointN<br>
>>> espera receber um inteiro, mas
o resultado da divisão por 2<br>
>>> retorna um numero tipo 3.5<br>
>>><br>
>>> Diego Moreira Carvalho<br>
>>><br>
>>><br>
>>><br>
>>> Em 18 de agosto de 2011 15:49,
Pedro Costa <<a moz-do-not-send="true"
href="mailto:pedrocostaarma@sapo.pt"
target="_blank">pedrocostaarma@sapo.pt</a><br>
>>> <mailto:<a
moz-do-not-send="true"
href="mailto:pedrocostaarma@sapo.pt"
target="_blank">pedrocostaarma@sapo.pt</a>>>
escreveu:<br>
>>><br>
>>> É exactamente por isso Diego.
Mas sabes como faço para<br>
>>> determinar a contagem de pontos
em sql?<br>
>>><br>
>>> Obrigado<br>
>>><br>
>>><br>
>>><br>
>>><br>
>>> On 18-08-2011 19:40, Diego
Moreira wrote:<br>
>>>> Boa tarde Pedrom<br>
>>>><br>
>>>> Acredito que tal problema
ocorre porque as vezes a<br>
>>>> estremidade da rua
adjacente a que deveria ser escolhida é<br>
>>>> mais próxima. Acho que o
problema pode ser resolvido da<br>
>>>> seguinte forma:<br>
>>>><br>
>>>> Pego o ponto n/2 do eixo da
rua: se a rua tem dez pontos pego<br>
>>>> o 5 ponto, e executo aquela
mesma sql, só que com este ponto,<br>
>>>> e não com a
geometria(eixos_rua.wkb_geometry).<br>
>>>><br>
>>>> Acho que deve resolver.<br>
>>>><br>
>>>> Espero ter ajudado.<br>
>>>><br>
>>>> Diego Moreira Carvalho<br>
>>>><br>
>>>><br>
>>>><br>
>>>> Em 18 de agosto de 2011
11:39, Pedro Costa<br>
>>>> <<a
moz-do-not-send="true"
href="mailto:pedrocostaarma@sapo.pt"
target="_blank">pedrocostaarma@sapo.pt</a>
<mailto:<a moz-do-not-send="true"
href="mailto:pedrocostaarma@sapo.pt"
target="_blank">pedrocostaarma@sapo.pt</a>>><br>
>>>> escreveu:<br>
>>>><br>
>>>> Pessoal é o seguinte, eu
tenho duas tabelas no pgadmin<br>
>>>> (passeios e ruas), e quero
que o campo rua dos passeios<br>
>>>> seja prenchido pela rua
correspondente. Isto pode<br>
>>>> fazer-se em função da
distância, como o João Carvalho me<br>
>>>> ajudou:<br>
>>>><br>
>>>> "UPDATE passeios SET rua =
(SELECT FID_ FROM eixos_rua<br>
>>>> ORDER BY<br>
>>>>
ST_Distance(eixos_rua.wkb_geometry,passeios.wkb_geometry)<br>
>>>> ASC LIMIT 1)"<br>
>>>><br>
>>>> No entanto em muitos casos
a rua escolhida não é a<br>
>>>> correspondente, esta query
não é muito eficiente neste<br>
>>>> caso. Alguém sabe uma
maneira diferente em que seja<br>
>>>> escolhida a rua que está
mais próxima "em toda a sua<br>
>>>> extensão"?<br>
>>>> Podem ver a imagem em anexo
para perceberem melhor, as<br>
>>>> linhas verdes são os
passeios e as vermelhas os eixos de<br>
>>>> rua. Alguém tem alguma
ideia que possa ajudar?<br>
>>>><br>
>>>> Obrigado<br>
>>>><br>
>>>>
_______________________________________________<br>
>>>> Portugal mailing list<br>
>>>> <a moz-do-not-send="true"
href="mailto:Portugal@lists.osgeo.org"
target="_blank">Portugal@lists.osgeo.org</a>
<mailto:<a moz-do-not-send="true"
href="mailto:Portugal@lists.osgeo.org"
target="_blank">Portugal@lists.osgeo.org</a>><br>
>>>> <a moz-do-not-send="true"
href="http://lists.osgeo.org/mailman/listinfo/portugal" target="_blank">http://lists.osgeo.org/mailman/listinfo/portugal</a><br>
>>>><br>
>>>><br>
>>>><br>
>>>><br>
>>>>
_______________________________________________<br>
>>>> Portugal mailing list<br>
>>>> <a moz-do-not-send="true"
href="mailto:Portugal@lists.osgeo.org"
target="_blank">Portugal@lists.osgeo.org</a>
<mailto:<a moz-do-not-send="true"
href="mailto:Portugal@lists.osgeo.org"
target="_blank">Portugal@lists.osgeo.org</a>><br>
>>>> <a moz-do-not-send="true"
href="http://lists.osgeo.org/mailman/listinfo/portugal" target="_blank">http://lists.osgeo.org/mailman/listinfo/portugal</a><br>
>>><br>
>>><br>
>>>
_______________________________________________<br>
>>> Portugal mailing list<br>
>>> <a moz-do-not-send="true"
href="mailto:Portugal@lists.osgeo.org"
target="_blank">Portugal@lists.osgeo.org</a>
<mailto:<a moz-do-not-send="true"
href="mailto:Portugal@lists.osgeo.org"
target="_blank">Portugal@lists.osgeo.org</a>><br>
>>> <a moz-do-not-send="true"
href="http://lists.osgeo.org/mailman/listinfo/portugal"
target="_blank">http://lists.osgeo.org/mailman/listinfo/portugal</a><br>
>>><br>
>>><br>
>>><br>
>>><br>
>>><br>
>>>
_______________________________________________<br>
>>> Portugal mailing list<br>
>>> <a moz-do-not-send="true"
href="mailto:Portugal@lists.osgeo.org"
target="_blank">Portugal@lists.osgeo.org</a><br>
>>> <a moz-do-not-send="true"
href="http://lists.osgeo.org/mailman/listinfo/portugal"
target="_blank">http://lists.osgeo.org/mailman/listinfo/portugal</a><br>
><br>
><br>
>
_______________________________________________<br>
> Portugal mailing list<br>
> <a moz-do-not-send="true"
href="mailto:Portugal@lists.osgeo.org"
target="_blank">Portugal@lists.osgeo.org</a><br>
> <a moz-do-not-send="true"
href="http://lists.osgeo.org/mailman/listinfo/portugal"
target="_blank">http://lists.osgeo.org/mailman/listinfo/portugal</a><br>
><br>
><br>
>
_______________________________________________<br>
> Portugal mailing list<br>
> <a moz-do-not-send="true"
href="mailto:Portugal@lists.osgeo.org"
target="_blank">Portugal@lists.osgeo.org</a><br>
> <a moz-do-not-send="true"
href="http://lists.osgeo.org/mailman/listinfo/portugal"
target="_blank">http://lists.osgeo.org/mailman/listinfo/portugal</a><br>
><br>
><br>
<br>
</div>
</div>
</blockquote>
</div>
<br>
<br>
<fieldset></fieldset>
<br>
<pre>_______________________________________________
Portugal mailing list
<a moz-do-not-send="true" href="mailto:Portugal@lists.osgeo.org" target="_blank">Portugal@lists.osgeo.org</a>
<a moz-do-not-send="true" href="http://lists.osgeo.org/mailman/listinfo/portugal" target="_blank">http://lists.osgeo.org/mailman/listinfo/portugal</a>
</pre>
</blockquote>
<br>
</div>
</div>
</div>
<br>
_______________________________________________<br>
Portugal mailing list<br>
<a moz-do-not-send="true"
href="mailto:Portugal@lists.osgeo.org">Portugal@lists.osgeo.org</a><br>
<a moz-do-not-send="true"
href="http://lists.osgeo.org/mailman/listinfo/portugal"
target="_blank">http://lists.osgeo.org/mailman/listinfo/portugal</a><br>
<br>
</blockquote>
</div>
<br>
<br>
<fieldset class="mimeAttachmentHeader"></fieldset>
<br>
<pre wrap="">_______________________________________________
Portugal mailing list
<a moz-do-not-send="true" class="moz-txt-link-abbreviated" href="mailto:Portugal@lists.osgeo.org">Portugal@lists.osgeo.org</a>
<a moz-do-not-send="true" class="moz-txt-link-freetext" href="http://lists.osgeo.org/mailman/listinfo/portugal">http://lists.osgeo.org/mailman/listinfo/portugal</a>
</pre>
</blockquote>
<br>
</blockquote>
<br>
</body>
</html>