Estou usando o PostGIS há muito tempo, mas nunca tive que usar a LINESTRING
geometria ...! :)
Aqui está o que eu gostaria de fazer: Eu tenho uma tabela de cadeias de linhas (representando ruas de uma determinada cidade, SRID 3395) e gostaria de encontrar as cadeias de linhas mais próximas de um determinado ponto (posição GPS, SRID 4326).
A solução que encontrei é selecionar todas as cadeias de linhas no meu ponto usando o expand()
método e determinar a distância entre cada cadeia de linhas e meu ponto usando o ST_Distance()
método.
Aqui está o SQL:
SELECT myLineId, myLineName, ST_Distance(ST_Transform(GeomFromText('POINT(LON LAT)',4326),3395),myLineGeom) AS myLineDistance
FROM myLines
WHERE myLineGeom && expand(ST_Transform(GeomFromText('POINT(LON LAT)',4326),3395), 100)
ORDER BY myLineDistance;
Os resultados parecem bons, mas sinto que algo está errado na minha implementação.
1) Vocês acham que expand()
podem obter todas as cadeias de linhas em questão?
2) Vocês acham que ST_Distance()
é o método certo para usar? Acho que estou fazendo errado, já que a distância que eu gostaria de obter é a menor distância entre o ponto e minha linha e não a distância entre o ponto e um dos pontos da cadeia de linhas.
Ilustração:
Hallo
Primeiro, a pergunta sobre o que ST_Distance retorna. ST_Distance retorna a menor distância entre a linha e o ponto (ou que tipos de geometria são inseridos) Isso significa que ST_Distance entre o ponto (1 3) e a cadeia de linhas (0 0,0 10) retornará 1. A distância não será medida entre o ponto e (0 0) ou o ponto e (0 10) mas do ponto (1 3) a (0 3).
Então, pelo que entendi, ST_Distance dá a resposta que você deseja.
Se você deseja encontrar o ponto (0 3) no exemplo acima, pode usar ST_Closestpoint se tiver o PostGIS 1.5. Para o meu exemplo, use-o assim: ST_Closestpoint ('LINESTRING (0 0,0 10)' :: geometry, ' POINT (1 3) ':: geometry), então você deve obter o ponto (0 3) em retorno, o ponto na linha que está mais próximo do seu ponto.
HTH Nicklas
fonte
Eu encontrei :) (Bem, eu acho: P)
Usando o
ST_Line_Locate_Point()
eST_Line_Interpolate_point()
eu consegui obter um ponto que NÃO faz parte da definição LINESTRING, mas ESTÁ na linha mencionada :) Tudo o que tenho a fazer é obter a distância do meu ponto até esse ponto e pronto.O
ST_Line_Locate_Point()
método encontra a localização do ponto mais próximo da linha ao ponto especificado, oST_Line_Interpolate_Point
método transforma essa localização em um ponto.fonte
ST_Distance(geometry g1, geometry g2)
Este tópico do Postgis pode responder http://postgis.refractions.net/pipermail/postgis-users/2007-June/016045.html
fonte