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: [email protected] <mailto:[email protected]>
-- 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: [email protected] <mailto:[email protected]>
-- 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 <[email protected] <mailto:[email protected]>> 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
    <[email protected] <mailto:[email protected]>> 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
        <[email protected] <mailto:[email protected]>>
        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" <[email protected]
        <mailto:[email protected]>> 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
        <[email protected] <mailto:[email protected]>
        >>> <mailto:[email protected]
        <mailto:[email protected]>>> 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
        <[email protected] <mailto:[email protected]>
        >>> <mailto:[email protected]
        <mailto:[email protected]>>> 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
        >>>> <[email protected] <mailto:[email protected]>
        <mailto:[email protected] <mailto:[email protected]>>>
        >>>> 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
        >>>> [email protected]
        <mailto:[email protected]>
        <mailto:[email protected]
        <mailto:[email protected]>>
        >>>> http://lists.osgeo.org/mailman/listinfo/portugal
        >>>>
        >>>>
        >>>>
        >>>>
        >>>> _______________________________________________
        >>>> Portugal mailing list
        >>>> [email protected]
        <mailto:[email protected]>
        <mailto:[email protected]
        <mailto:[email protected]>>
        >>>> http://lists.osgeo.org/mailman/listinfo/portugal
        >>>
        >>>
        >>> _______________________________________________
        >>> Portugal mailing list
        >>> [email protected]
        <mailto:[email protected]>
        <mailto:[email protected]
        <mailto:[email protected]>>
        >>> http://lists.osgeo.org/mailman/listinfo/portugal
        >>>
        >>>
        >>>
        >>>
        >>>
        >>> _______________________________________________
        >>> Portugal mailing list
        >>> [email protected] <mailto:[email protected]>
        >>> http://lists.osgeo.org/mailman/listinfo/portugal
        >
        >
        > _______________________________________________
        > Portugal mailing list
        > [email protected] <mailto:[email protected]>
        > http://lists.osgeo.org/mailman/listinfo/portugal
        >
        >
        > _______________________________________________
        > Portugal mailing list
        > [email protected] <mailto:[email protected]>
        > http://lists.osgeo.org/mailman/listinfo/portugal
        >
        >




    _______________________________________________
    Portugal mailing list
    [email protected]  <mailto:[email protected]>
    http://lists.osgeo.org/mailman/listinfo/portugal


    _______________________________________________
    Portugal mailing list
    [email protected] <mailto:[email protected]>
    http://lists.osgeo.org/mailman/listinfo/portugal




_______________________________________________
Portugal mailing list
[email protected]
http://lists.osgeo.org/mailman/listinfo/portugal

_______________________________________________
Portugal mailing list
[email protected]
http://lists.osgeo.org/mailman/listinfo/portugal

Responder a