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