Todos os produtos
Search
Central de documentação

ApsaraDB RDS:ST_Split

Última atualização: Oct 13, 2026

Divide uma trajetória em uma matriz de subtrajetórias. Há três sobrecargas disponíveis: divisão por geometria, por regra e por índice.

A função retorna trajectory[]. Use unnest() para expandir o resultado em linhas individuais.

Sintaxe

SELECT unnest(ST_split(a, '{0}'::int[] || '{0,1,3,5}'::int[] || ST_leafcount(a) - 1)) FROM traj;
-- Result: 4 rows

Parâmetros

Parâmetro

Tipo

Descrição

traj

trajectory

A trajetória a ser dividida.

geom

geometry

O objeto de geometria usado como limite de divisão. Suporta apenas Point e MultiPoint.

radius_of_buffer

float8

O raio do buffer ao redor da geometria Point, em metros. A trajetória é dividida ao cruzar o limite do buffer.

config

text

String JSON que especifica uma regra de divisão. Consulte Regras de divisão.

indexes

int[]

Índices dos pontos de divisão. A indexação começa em 0.

Como funciona

Divisão por geometria

Informe uma geometria Point ou MultiPoint e um raio de buffer. A função cria um buffer circular ao redor de cada ponto e divide a trajetória ao cruzar o limite de um buffer.

Split a trajectory based on a geometry object.

Se nenhuma parte da trajetória interceptar qualquer buffer, não ocorre divisão e a função retorna a trajetória original inalterada.

Divisão por regra

Informe uma string JSON com exatamente uma chave de regra. O comportamento depende da família da regra:

  • As regras **cut_point.*** dividem a trajetória em pontos de amostragem específicos (ponto B no diagrama).

  • As regras **cut_edge.*** dividem a trajetória em arestas específicas (ponto C no diagrama).

  • As regras **drop_edge.*** removem completamente as arestas correspondentes. Use-as para limpar ruídos dos dados de trajetória, como remover segmentos muito longos causados por perda de sinal de GPS ou grandes saltos posicionais.

Split a trajectory based on a rule.

Regras de divisão

Regra

Tipo de valor

Descrição

cut_point.max_point

Inteiro positivo

Divide a cada N pontos de amostragem.

cut_point.even_divide

Inteiro positivo

Divide em N partes iguais. Se a trajetória tiver menos arestas que N, cada aresta se tornará uma subtrajetória independente.

cut_edge.time_interval

Intervalo de tempo positivo

Divide em intervalos de tempo regulares. Opcionalmente, especifique um horário de referência: "1 hour, 2000-01-01".

cut_edge.geohash

Inteiro par positivo

Divide de forma que cada subtrajetória fique dentro de uma célula de grade Geohash na precisão especificada. Os dados da trajetória devem usar coordenadas de latitude e longitude.

drop_edge.temporal_length

Intervalo de tempo

Remove arestas com duração maior que a especificada.

drop_edge.spatial_distance_2d

Ponto flutuante

Remove arestas com distância euclidiana 2D maior que a especificada. Se todas as arestas forem maiores que o limiar, retorna {}.

Divisão por índice

Informe uma matriz de índices de pontos. Para n índices, a função retorna n-1 subtrajetórias. Os pontos inicial e final da trajetória não precisam estar incluídos na matriz de índices.

Exemplos

Preparar dados de amostra

SELECT unnest(ST_split(a, '{0}'::int[] || '{0,1,3,5}'::int[] || ST_leafcount(a) - 1)) FROM traj;
-- Result: 4 rows

Divisão por geometria

Divida a trajetória sempre que ela passar a até 23.000 metros de qualquer ponto em MULTIPOINT(100 30, 105 35, 110 35). Isso gera 4 subtrajetórias.

SELECT unnest(ST_split(a, '{0}'::int[] || '{0,1,3,5}'::int[] || ST_leafcount(a) - 1)) FROM traj;
-- Result: 4 rows
SELECT unnest(ST_split(a, '{0}'::int[] || '{0,1,3,5}'::int[] || ST_leafcount(a) - 1)) FROM traj;
-- Result: 4 rows

Caso limite: Se o radius_of_buffer for muito pequeno e a trajetória não interceptar nenhuma zona de buffer, não ocorre divisão e a função retorna a trajetória original como uma matriz de um único elemento.

Divisão por regra

Todos os exemplos a seguir usam a mesma trajetória de 19 pontos definida inline.

SELECT unnest(ST_split(a, '{0}'::int[] || '{0,1,3,5}'::int[] || ST_leafcount(a) - 1)) FROM traj;
-- Result: 4 rows

**cut_point.max_point — divide a cada 4 pontos (gera 5 subtrajetórias)**

SELECT unnest(ST_split(a, '{0}'::int[] || '{0,1,3,5}'::int[] || ST_leafcount(a) - 1)) FROM traj;
-- Result: 4 rows

**cut_point.max_point — divide a cada 10 pontos (gera 2 subtrajetórias)**

SELECT unnest(ST_split(a, '{0}'::int[] || '{0,1,3,5}'::int[] || ST_leafcount(a) - 1)) FROM traj;
-- Result: 4 rows

**cut_point.max_point — divide a cada 3 pontos (gera 7 subtrajetórias)**

SELECT unnest(ST_split(a, '{0}'::int[] || '{0,1,3,5}'::int[] || ST_leafcount(a) - 1)) FROM traj;
-- Result: 4 rows

**cut_point.even_divide — divide em 100 partes iguais**

Como a trajetória tem apenas 18 arestas (19 pontos) e 18 < 100, cada aresta se torna uma subtrajetória independente. O resultado é uma matriz de 18 subtrajetórias, cada uma com leafcount 2.

SELECT unnest(ST_split(a, '{0}'::int[] || '{0,1,3,5}'::int[] || ST_leafcount(a) - 1)) FROM traj;
-- Result: 4 rows

**cut_edge.geohash — divide por precisão Geohash 2 (gera 4 subtrajetórias)**

SELECT unnest(ST_split(a, '{0}'::int[] || '{0,1,3,5}'::int[] || ST_leafcount(a) - 1)) FROM traj;
-- Result: 4 rows

**cut_edge.geohash — divide por precisão Geohash 20 (gera 19 subtrajetórias)**

SELECT unnest(ST_split(a, '{0}'::int[] || '{0,1,3,5}'::int[] || ST_leafcount(a) - 1)) FROM traj;
-- Result: 4 rows

**drop_edge.spatial_distance_2d — remove arestas mais longas que 13 (gera 1 subtrajetória)**

SELECT unnest(ST_split(a, '{0}'::int[] || '{0,1,3,5}'::int[] || ST_leafcount(a) - 1)) FROM traj;
-- Result: 4 rows

**drop_edge.spatial_distance_2d — remove arestas mais longas que 10 (gera 7 subtrajetórias)**

SELECT unnest(ST_split(a, '{0}'::int[] || '{0,1,3,5}'::int[] || ST_leafcount(a) - 1)) FROM traj;
-- Result: 4 rows

**drop_edge.spatial_distance_2d — limiar de 1 (todas as arestas removidas)**

Quando o limiar é menor que o comprimento de todas as arestas, a função remove todas as arestas e retorna uma matriz vazia.

SELECT unnest(ST_split(a, '{0}'::int[] || '{0,1,3,5}'::int[] || ST_leafcount(a) - 1)) FROM traj;
-- Result: 4 rows

**cut_edge.time_interval — divide a cada 50 minutos (gera 5 subtrajetórias)**

SELECT unnest(ST_split(a, '{0}'::int[] || '{0,1,3,5}'::int[] || ST_leafcount(a) - 1)) FROM traj;
-- Result: 4 rows

**cut_edge.time_interval — divide a cada 1 hora com horário de referência em 2000-01-01 (gera 4 subtrajetórias)**

Use unnest() para expandir a matriz em linhas individuais.

SELECT unnest(ST_split(a, '{0}'::int[] || '{0,1,3,5}'::int[] || ST_leafcount(a) - 1)) FROM traj;
-- Result: 4 rows

Divisão por índice

3 índices — 2 subtrajetórias

SELECT unnest(ST_split(a, '{0}'::int[] || '{0,1,3,5}'::int[] || ST_leafcount(a) - 1)) FROM traj;
-- Result: 4 rows

6 índices (com duplicatas e pontos de limite) — 4 subtrajetórias

A função aceita valores de índice duplicados e índices de limite explícitos (0 e leafcount-1). Após a deduplicação e ordenação, 5 pontos de divisão exclusivos geram 4 subtrajetórias.

SELECT unnest(ST_split(a, '{0}'::int[] || '{0,1,3,5}'::int[] || ST_leafcount(a) - 1)) FROM traj;
-- Result: 4 rows