Todos os produtos
Search
Central de documentação

ApsaraDB RDS:ST_TrajMerge

Última atualização: Jul 05, 2026

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

trajs

Coluna de trajetória (forma agregada) ou array de trajetórias a mesclar.

doSort

Ordena todos os pontos da trajetória resultante por timestamp.

true

doDeduplicate

Indica se os pontos duplicados devem ser removidos da trajetória resultante.

true

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:

  • doSort reordena 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.

  • doDeduplicate remove 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 true como 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

**doSort**

**doDeduplicate**

Pontos ordenados

Duplicados removidos

**leafcount**

false

false

Não

Não

8

true

false

Sim

Não

8

false

true

Não

Parcialmente

7

true

true (padrão)

Sim

Sim

6

Nota

Recomendamos definir doSort e doDeduplicate como true (valor padrão). Embora isso afete ligeiramente o desempenho, garante a precisão dos resultados.