Criando linhas a partir de pontos usando o PostGIS?

10

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.

Thomas Becker
fonte
11
A função ST_MakeLine () fará isso, assim que você tiver o timestamp GROUP BY vehicle_id e ORDER BY. Veja: postgis.refractions.net/docs/ST_MakeLine.html
Micha
Tudo bem, eu simplesmente tentei e emiti a seguinte declaração: 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 ...?
Thomas Becker
O que são "ponto 1", "ponto 2", "ponto 3"? Como você os reconhece?
Micha
Pensei em reconhecê-los através da ordenação do carimbo de data e hora ... 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.
Thomas Becker
Você pode, numa primeira fase gerar uma linha por veículo e depois gerar vértice desta linha usando dicas de lista de discussão postgis postgis.17.x6.nabble.com/...
ThomasG77

Respostas:

12

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.

SELECT mmsi, num, ST_MAKELINE(geom,geom2) FROM (
  SELECT mmsi, row_number() OVER w AS num, geom, lead(geom) OVER w AS geom2
  FROM ais_data WINDOW w AS (PARTITION BY mmsi ORDER BY bs_ts) ) as q
WHERE geom2 IS NOT NULL;
Jakub Kania
fonte