Eu tenho uma tabela PostGIS com dados de posição de vários veículos e quero criar linhas a partir desses pontos.
Os dados podem ser selecionados por identificação do veículo e ordenados por carimbo de data e hora, mas como criar linhas a partir do resultado?
Basicamente, o que eu preciso é de um segmento de linha do ponto 1 ao ponto 2, finalizar a linha e novamente do ponto 2 ao ponto 3. É claro que tudo isso em consideração ao ID do veículo.
O último é necessário porque eu quero calcular a direção e a velocidade do cruzeiro de um ponto para o outro.
postgis
point
line
geometry-conversion
Thomas Becker
fonte
fonte
SELECT ais_data.mmsi, ST_MakeLine(ais_data.geom) AS newgeom INTO ais_lines FROM (SELECT * FROM ais_data ORDER BY ais_data.mmsi, ais_data.bs_ts ASC) AS ais_data GROUP BY ais_data.mmsi;
Isso me dará a pista de todos os veículos e não é exatamente o que eu preciso. Como dizer ao ST_MakeLine () para criar uma linha do ponto 1 ao ponto 2, finalizar a linha e iniciar uma nova do ponto 2 ao ponto 3 ...?ORDER BY ais_data.bs_ts
- é possível? Portanto, o ponto 1, o ponto 2 e assim por diante são basicamente as informações do ponto fornecidas em cada linha como resultado da instrução Select.Respostas:
Isso pode ser feito de várias maneiras, usando auto-junções ou subconsultas correlacionadas, mas o uso das funções da janela é provavelmente a maneira mais fácil.
A função
lead()
retorna um valor à frente na partição especificada e nossa partição é(PARTITION BY <vehicle_id> ORDER BY <timestamp>)
Essa consulta nos fornece o número do veículo, a posição desse ponto na partição (que é igual à posição da linha que começa com ele) e as duas geometrias que farão a linha. É claro que ele retorna NULL geom2 para o último ponto, portanto, precisamos verificar isso na consulta externa.
fonte