[Portugal] expressão sql para preencher tabela com rua mais próxima
Pedro Costa
pedrocostaarma at sapo.pt
Mon Aug 22 07:05:56 EDT 2011
Resolvido, troquei os cifrões por plicas
On 22-08-2011 11:50, Pedro Costa wrote:
> 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 $$
>
>
>
>
>
>
>
> On 22-08-2011 02:04, Diego Moreira wrote:
>> Boa Noite Pedro,
>>
>> 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.
>>
>> Segue a conversa referente a esse post, mas que estava em outro.
>>
>> *Em 20-08-2011 23:34, Diego Moreira escreveu: *
>> *
>> *
>> *Opá,
>>
>> Então Pedro,
>>
>> Esse problema, no meu ponto de vista, pode ser resolvido de duas formas:
>>
>> 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).
>>
>> 2 - "Encapsular" a função |ST_Line_Interpolate_Point, |caso vc tenha
>> uma MultiLine, ela calcula o ponto a X distancia para cada linha e
>> retorna um multPoint.
>>
>> O que acha?
>>
>>
>> Diego Moreira Carvalho
>>
>>
>> Caro Diego,
>>
>> 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?
>> *
>> *Com os melhores cumprimentos,
>>
>> Pedro Costa
>> Geógrafo
>> Especializado em Sistemas de Informação Geográfica e Ordenamento do Território*
>>
>>
>> Respondendo:
>>
>> Seguem duas funções:
>>
>> *CREATE OR REPLACE FUNCTION smartUnion(geom1 geometry, geom2
>> geometry) RETURNS geometry AS $$
>> -- Autor: Diego Moreira Carvalho
>> -- E-mail: moreira.geo gmail.com <mailto:moreira.geo gmail.com>
>> -- Data: 20/08/2011
>> -- Descrição: Esta função retorna a união das duas geometrias, caso
>> alguma geometria seja inválida, retorna a que é válida.
>> DECLARE
>> retorno geometry;
>> BEGIN
>> IF ST_IsValid(geom1) AND ST_IsValid(geom2) THEN
>> retorno := ST_Union(geom1, geom2);
>> ELSIF ST_IsValid(geom1) THEN
>> retorno := geom1;
>> ELSIF ST_IsValid(geom2) THEN
>> retorno := geom2;
>> END IF;
>> RETURN retorno;
>> END;
>> $$ LANGUAGE plpgsql;
>>
>>
>> CREATE OR REPLACE FUNCTION Line_Interpolate_Point_Alter(a_linestring
>> geometry, a_fraction float) RETURNS geometry AS $$
>> -- Autor: Diego Moreira Carvalho
>> -- E-mail: moreira.geo gmail.com <mailto:moreira.geo gmail.com>
>> -- Data: 21/08/2011
>> -- Descrição: Esta função é o encapsulamento da função
>> ST_Line_Interpolate_Point para aceitar multiLines
>> DECLARE
>> numGeometries integer;
>> it integer;
>> segment geometry;
>> point geometry;
>> retorno geometry;
>> BEGIN
>> numGeometries := ST_NumGeometries(a_linestring);
>>
>> IF numGeometries > 0 THEN
>> numGeometries := numGeometries;
>> ELSE
>> numGeometries := 0;
>> END IF;
>>
>> IF numGeometries > 0 THEN
>> it := 1;
>> WHILE it < (numGeometries + 1) LOOP
>> segment := ST_GeometryN(a_linestring, it);
>> point := ST_Line_Interpolate_Point(segment, a_fraction);
>> retorno := smartUnion(point, retorno);
>> it := it +1;
>> END LOOP;
>> ELSE
>> point := ST_Line_Interpolate_Point(a_linestring, a_fraction);
>> retorno := point;
>> END IF;
>> RETURN retorno;
>> END;
>> $$ LANGUAGE plpgsql;
>> *
>> Vc deve usa-la assim:
>>
>> UPDATE passeios
>> SET rua =
>> (SELECT FID_ FROM ruas
>> ORDER BY
>> ST_Distance(*Line_Interpolate_Point_Alter*(ruas.wkb_geometry, 0.5),
>> passeios.wkb_geometry)) ASC LIMIT 1)
>>
>> Qualquer problema é só falar;
>>
>>
>> Com os melhores cumprimentos,
>>
>> Diego Moreira Carvalho
>>
>>
>>
>> Em 19 de agosto de 2011 12:53, Pedro Costa <pedrocostaarma sapo.pt
>> <mailto:pedrocostaarma sapo.pt>> escreveu:
>>
>> Encontrei que podemos acrescentar geometryN para aceita
>> multi-geometrias:
>>
>> UPDATE passeios
>> SET rua =
>> (SELECT FID_ FROM ruas
>>
>>
>> ORDER BY
>> ST_Distance(ST_Line_Interpolate_Point(geometryN(ruas.wkb_geometry, 0.5),
>> passeios.wkb_geometry)) ASC LIMIT 1)
>>
>>
>> No entanto não reconhece a função
>>
>>
>>
>>
>> On 19-08-2011 13:28, Diego Moreira wrote:
>>> Resolveu?
>>>
>>> Diego Moreira Carvalho
>>>
>>>
>>>
>>> Em 19 de agosto de 2011 09:13, Diego Moreira
>>> <moreira.geo gmail.com <mailto:moreira.geo gmail.com>> escreveu:
>>>
>>> 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,
>>> Agora eu acho que resolve
>>>
>>>
>>> "UPDATE passeios SET rua =
>>> (SELECT FID_ FROM eixos_rua ORDER BY
>>> ST_Distance(*ST_Line_Interpolate_Point(eixos_rua.wkb_geometry,
>>> 0.5)* , passeios.wkb_geometry) ASC LIMIT 1)"
>>>
>>>
>>> Diego Moreira Carvalho
>>>
>>>
>>>
>>>
>>> Em 19 de agosto de 2011 08:54, Pedro Costa
>>> <pedrocostaarma sapo.pt <mailto:pedrocostaarma sapo.pt>>
>>> escreveu:
>>>
>>> > Exactamente, neste caso estou a mudar a unha, mas sabes
>>> alguma maneira mais
>>> > rápida?
>>> >
>>> > Obrigado
>>> >
>>> >
>>> >
>>> > On 19-08-2011 12:50, Diego Moreira wrote:
>>> >
>>> > Provavelmente os mal atribuídos estao relacionados a ruas
>>> que tem somente
>>> > dois ou tres pontos.... da para resolver...
>>> >
>>> > Em 19/08/2011 06:47, "Pedro Costa" <pedrocostaarma sapo.pt
>>> <mailto:pedrocostaarma sapo.pt>> escreveu:
>>> >> Caro Diego,
>>> >>
>>> >> Funcionou... Obrigado pela ajuda.
>>> >> Apesar de tudo alguns passeios ainda são mal atribuídos,
>>> mas melhorou
>>> >> bastante...
>>> >>
>>> >> Com os melhores cumprimentos,
>>> >>
>>> >> Pedro Costa
>>> >>
>>> >>
>>> >>
>>> >>
>>> >>
>>> >> Em 18-08-2011 20:04, Diego Moreira escreveu:
>>> >>> Acho que vai dar certo, o pg numa divisão do tipo 3/2
>>> retorna 1,
>>> >>> retornaria 1.5 se fosse 3.0/2...
>>> >>> Então... acho que vai funcionar.
>>> >>>
>>> >>> Diego Moreira Carvalho
>>> >>>
>>> >>>
>>> >>>
>>> >>> Em 18 de agosto de 2011 16:00, Diego Moreira
>>> <moreira.geo gmail.com <mailto:moreira.geo gmail.com>
>>> >>> <mailto:moreira.geo gmail.com
>>> <mailto:moreira.geo gmail.com>>> escreveu:
>>> >>>
>>> >>> NumPoints(geometry)
>>> >>>
>>> >>> Encontra e Retorna o número de pontos na primeira linha na
>>> >>> geometria. Retorna NULO se não há nenhuma linha na
>>> geometria.
>>> >>>
>>> >>> PointN(geometry,integer)
>>> >>>
>>> >>> Retorna o enésimo ponto na primeira linha na geometria.
>>> >>> Retorna NULO se não há nenhuma linha na geometria.
>>> >>>
>>> >>> "UPDATE passeios SET rua =
>>> >>> (SELECT FID_ FROM eixos_rua ORDER BY
>>> >>> ST_Distance(PointN(eixos_rua.wkb_geometry,
>>> >>> NumPoints(eixos_rua.wkb_geometry)/2) ,
>>> passeios.wkb_geometry) ASC
>>> >>> LIMIT 1)"
>>> >>>
>>> >>>
>>> >>> Sera que isso dá certo? caso não, o problema é que a
>>> função PointN
>>> >>> espera receber um inteiro, mas o resultado da divisão por 2
>>> >>> retorna um numero tipo 3.5
>>> >>>
>>> >>> Diego Moreira Carvalho
>>> >>>
>>> >>>
>>> >>>
>>> >>> Em 18 de agosto de 2011 15:49, Pedro Costa
>>> <pedrocostaarma sapo.pt <mailto:pedrocostaarma sapo.pt>
>>> >>> <mailto:pedrocostaarma sapo.pt
>>> <mailto:pedrocostaarma sapo.pt>>> escreveu:
>>> >>>
>>> >>> É exactamente por isso Diego. Mas sabes como faço para
>>> >>> determinar a contagem de pontos em sql?
>>> >>>
>>> >>> Obrigado
>>> >>>
>>> >>>
>>> >>>
>>> >>>
>>> >>> On 18-08-2011 19:40, Diego Moreira wrote:
>>> >>>> Boa tarde Pedrom
>>> >>>>
>>> >>>> Acredito que tal problema ocorre porque as vezes a
>>> >>>> estremidade da rua adjacente a que deveria ser escolhida é
>>> >>>> mais próxima. Acho que o problema pode ser resolvido da
>>> >>>> seguinte forma:
>>> >>>>
>>> >>>> Pego o ponto n/2 do eixo da rua: se a rua tem dez
>>> pontos pego
>>> >>>> o 5 ponto, e executo aquela mesma sql, só que com este
>>> ponto,
>>> >>>> e não com a geometria(eixos_rua.wkb_geometry).
>>> >>>>
>>> >>>> Acho que deve resolver.
>>> >>>>
>>> >>>> Espero ter ajudado.
>>> >>>>
>>> >>>> Diego Moreira Carvalho
>>> >>>>
>>> >>>>
>>> >>>>
>>> >>>> Em 18 de agosto de 2011 11:39, Pedro Costa
>>> >>>> <pedrocostaarma sapo.pt <mailto:pedrocostaarma sapo.pt>
>>> <mailto:pedrocostaarma sapo.pt <mailto:pedrocostaarma sapo.pt>>>
>>> >>>> escreveu:
>>> >>>>
>>> >>>> Pessoal é o seguinte, eu tenho duas tabelas no pgadmin
>>> >>>> (passeios e ruas), e quero que o campo rua dos passeios
>>> >>>> seja prenchido pela rua correspondente. Isto pode
>>> >>>> fazer-se em função da distância, como o João Carvalho me
>>> >>>> ajudou:
>>> >>>>
>>> >>>> "UPDATE passeios SET rua = (SELECT FID_ FROM eixos_rua
>>> >>>> ORDER BY
>>> >>>> ST_Distance(eixos_rua.wkb_geometry,passeios.wkb_geometry)
>>> >>>> ASC LIMIT 1)"
>>> >>>>
>>> >>>> No entanto em muitos casos a rua escolhida não é a
>>> >>>> correspondente, esta query não é muito eficiente neste
>>> >>>> caso. Alguém sabe uma maneira diferente em que seja
>>> >>>> escolhida a rua que está mais próxima "em toda a sua
>>> >>>> extensão"?
>>> >>>> Podem ver a imagem em anexo para perceberem melhor, as
>>> >>>> linhas verdes são os passeios e as vermelhas os eixos de
>>> >>>> rua. Alguém tem alguma ideia que possa ajudar?
>>> >>>>
>>> >>>> Obrigado
>>> >>>>
>>> >>>> _______________________________________________
>>> >>>> Portugal mailing list
>>> >>>> Portugal lists.osgeo.org
>>> <mailto:Portugal lists.osgeo.org>
>>> <mailto:Portugal lists.osgeo.org
>>> <mailto:Portugal lists.osgeo.org>>
>>> >>>> http://lists.osgeo.org/mailman/listinfo/portugal
>>> >>>>
>>> >>>>
>>> >>>>
>>> >>>>
>>> >>>> _______________________________________________
>>> >>>> Portugal mailing list
>>> >>>> Portugal lists.osgeo.org
>>> <mailto:Portugal lists.osgeo.org>
>>> <mailto:Portugal lists.osgeo.org
>>> <mailto:Portugal lists.osgeo.org>>
>>> >>>> http://lists.osgeo.org/mailman/listinfo/portugal
>>> >>>
>>> >>>
>>> >>> _______________________________________________
>>> >>> Portugal mailing list
>>> >>> Portugal lists.osgeo.org
>>> <mailto:Portugal lists.osgeo.org>
>>> <mailto:Portugal lists.osgeo.org
>>> <mailto:Portugal lists.osgeo.org>>
>>> >>> http://lists.osgeo.org/mailman/listinfo/portugal
>>> >>>
>>> >>>
>>> >>>
>>> >>>
>>> >>>
>>> >>> _______________________________________________
>>> >>> Portugal mailing list
>>> >>> Portugal lists.osgeo.org <mailto:Portugal lists.osgeo.org>
>>> >>> http://lists.osgeo.org/mailman/listinfo/portugal
>>> >
>>> >
>>> > _______________________________________________
>>> > Portugal mailing list
>>> > Portugal lists.osgeo.org <mailto:Portugal lists.osgeo.org>
>>> > http://lists.osgeo.org/mailman/listinfo/portugal
>>> >
>>> >
>>> > _______________________________________________
>>> > Portugal mailing list
>>> > Portugal lists.osgeo.org <mailto:Portugal lists.osgeo.org>
>>> > http://lists.osgeo.org/mailman/listinfo/portugal
>>> >
>>> >
>>>
>>>
>>>
>>>
>>> _______________________________________________
>>> Portugal mailing list
>>> Portugal lists.osgeo.org <mailto:Portugal lists.osgeo.org>
>>> http://lists.osgeo.org/mailman/listinfo/portugal
>>
>>
>> _______________________________________________
>> Portugal mailing list
>> Portugal lists.osgeo.org <mailto:Portugal lists.osgeo.org>
>> http://lists.osgeo.org/mailman/listinfo/portugal
>>
>>
>>
>>
>> _______________________________________________
>> Portugal mailing list
>> Portugal lists.osgeo.org
>> http://lists.osgeo.org/mailman/listinfo/portugal
>
-------------- próxima parte ----------
Um anexo em HTML foi limpo...
URL: http://lists.osgeo.org/pipermail/portugal/attachments/20110822/e1f003bb/attachment-0001.html
More information about the Portugal
mailing list