Mescla várias trajetórias em uma única trajetória.
Sintaxe
-- Aggregate form: merges all rows in a trajectory column
trajectory ST_TrajMerge(trajectory SET_ trajs);
trajectory ST_TrajMerge(trajectory SET trajs, bool doSort, bool doDeduplicate);
-- Array form: merges a trajectory array (e.g., built with array_agg())
trajectory ST_TrajMerge(trajectory[] trajs, bool doSort default true, bool doDeduplicate default true);
Parâmetros
|
Parâmetro |
Descrição |
Padrão |
|
|
Coluna de trajetória (forma agregada) ou array de trajetórias a mesclar. |
— |
|
|
Ordena todos os pontos da trajetória resultante por timestamp. |
|
|
|
Indica se os pontos duplicados devem ser removidos da trajetória resultante. |
|
Valor de retorno
A trajetória mesclada.
Descrição
A função ST_TrajMerge combina vários objetos de trajetória em um só. Dois parâmetros controlam a qualidade do resultado:
doSortreordena todos os pontos por timestamp após a mesclagem. Desative essa opção apenas se as trajetórias de entrada já estiverem em ordem cronológica.doDeduplicateremove pontos duplicados entre trajetórias adjacentes. Por exemplo, se o ponto final de uma trajetória for idêntico ao ponto inicial da seguinte, esses pontos serão unificados.Ambos os parâmetros têm
truecomo valor padrão. As etapas de ordenação e deduplicação adicionam sobrecarga, mas garantem resultados precisos independentemente da ordem de entrada.
Exemplo
Preparar dados
CREATE TABLE test_trajs_merge(traj trajectory);
INSERT INTO test_trajs_merge VALUES
('{"trajectory":{"version":1,"type":"STPOINT","leafcount":2,"start_time":"2000-01-01 00:00:00","end_time":"2000-01-02 00:00:00","spatial":"LINESTRING(0 0,4 0)","timeline":["2000-01-01 00:00:00","2000-01-02 00:00:00"]}}'),
('{"trajectory":{"version":1,"type":"STPOINT","leafcount":2,"start_time":"2000-01-02 00:00:00","end_time":"2000-01-03 00:00:00","spatial":"LINESTRING(4 0,2 0)","timeline":["2000-01-02 00:00:00","2000-01-03 00:00:00"]}}'),
('{"trajectory":{"version":1,"type":"STPOINT","leafcount":2,"start_time":"2000-01-04 00:00:00","end_time":"2000-01-05 00:00:00","spatial":"LINESTRING(2 2,3 3)","timeline":["2000-01-04 00:00:00","2000-01-05 00:00:00"]}}'),
('{"trajectory":{"version":1,"type":"STPOINT","leafcount":2,"start_time":"2000-01-03 00:00:00","end_time":"2000-01-04 00:00:00","spatial":"LINESTRING(3 0,2 2)","timeline":["2000-01-03 00:00:00","2000-01-04 00:00:00"]}}'),
('TRAJECTORY EMPTY'),
(NULL);
A tabela contém quatro trajetórias no período de 2000-01-01 a 2000-01-05, uma trajetória vazia e uma linha NULL.
Mesclar sem ordenação ou deduplicação
SELECT st_TrajMerge(traj, false, false) FROM test_trajs_merge;
Resultado (leafcount: 8): há pontos duplicados e os timestamps estão fora de ordem.
{"trajectory":{"version":1,"type":"STPOINT","leafcount":8,"start_time":"2000-01-01 00:00:00","end_time":"2000-01-05 00:00:00","spatial":"LINESTRING(0 0,4 0,4 0,2 0,2 2,3 3,3 0,2 2)","timeline":["2000-01-01 00:00:00","2000-01-02 00:00:00","2000-01-02 00:00:00","2000-01-03 00:00:00","2000-01-04 00:00:00","2000-01-05 00:00:00","2000-01-03 00:00:00","2000-01-04 00:00:00"]}}
Mesclar apenas com ordenação
SELECT st_TrajMerge(traj, true, false) FROM test_trajs_merge;
Resultado (leafcount: 8): todos os pontos estão em ordem cronológica, mas os duplicados permanecem.
{"trajectory":{"version":1,"type":"STPOINT","leafcount":8,"start_time":"2000-01-01 00:00:00","end_time":"2000-01-05 00:00:00","spatial":"LINESTRING(0 0,4 0,4 0,3 0,2 0,2 2,2 2,3 3)","timeline":["2000-01-01 00:00:00","2000-01-02 00:00:00","2000-01-02 00:00:00","2000-01-03 00:00:00","2000-01-03 00:00:00","2000-01-04 00:00:00","2000-01-04 00:00:00","2000-01-05 00:00:00"]}}
Mesclar apenas com deduplicação
SELECT st_TrajMerge(traj, false, true) FROM test_trajs_merge;
Resultado (leafcount: 7): como os timestamps estão fora de ordem, o sistema não identifica corretamente os duplicados adjacentes e alguns permanecem.
{"trajectory":{"version":1,"type":"STPOINT","leafcount":7,"start_time":"2000-01-01 00:00:00","end_time":"2000-01-04 00:00:00","spatial":"LINESTRING(0 0,4 0,2 0,2 2,3 3,3 0,2 2)","timeline":["2000-01-01 00:00:00","2000-01-02 00:00:00","2000-01-03 00:00:00","2000-01-04 00:00:00","2000-01-05 00:00:00","2000-01-03 00:00:00","2000-01-04 00:00:00"]}}
Mesclar com ordenação e deduplicação (padrão)
SELECT st_TrajMerge(traj) FROM test_trajs_merge;
Resultado (leafcount: 6): todos os pontos estão ordenados e todos os pontos finais duplicados foram removidos.
{"trajectory":{"version":1,"type":"STPOINT","leafcount":6,"start_time":"2000-01-01 00:00:00","end_time":"2000-01-05 00:00:00","spatial":"LINESTRING(0 0,4 0,3 0,2 0,2 2,3 3)","timeline":["2000-01-01 00:00:00","2000-01-02 00:00:00","2000-01-03 00:00:00","2000-01-03 00:00:00","2000-01-04 00:00:00","2000-01-05 00:00:00"]}}
Mesclar um array de trajetórias
Use array_agg() para coletar as trajetórias em um array antes de passá-las à forma de array da função ST_TrajMerge.
SELECT st_TrajMerge(array_agg(traj), true, true) FROM test_trajs_merge;
Resultado (leafcount: 6): mesma saída da forma agregada com ordenação e deduplicação ativadas.
{"trajectory":{"version":1,"type":"STPOINT","leafcount":6,"start_time":"2000-01-01 00:00:00","end_time":"2000-01-05 00:00:00","spatial":"LINESTRING(0 0,4 0,3 0,2 0,2 2,3 3)","timeline":["2000-01-01 00:00:00","2000-01-02 00:00:00","2000-01-03 00:00:00","2000-01-03 00:00:00","2000-01-04 00:00:00","2000-01-05 00:00:00"]}}
Resumo das combinações de parâmetros
|
** |
** |
Pontos ordenados |
Duplicados removidos |
** |
|
|
|
Não |
Não |
8 |
|
|
|
Sim |
Não |
8 |
|
|
|
Não |
Parcialmente |
7 |
|
|
|
Sim |
Sim |
6 |
Recomendamos definir doSort e doDeduplicate como true (valor padrão). Embora isso afete ligeiramente o desempenho, garante a precisão dos resultados.