Todos los productos
Search
Centro de documentos

ApsaraDB RDS:ST_Split

Última actualización: Sep 09, 2026

ST_Split divide una trayectoria en un arreglo de subtrayectorias. Cuenta con tres firmas disponibles, cada una diseñada para una estrategia distinta: por geometría, por regla o por índice.

Sintaxis

trajectory[] ST_Split(trajectory traj, geometry geom, float8 radius_of_buffer);
trajectory[] ST_Split(trajectory traj, text config);
trajectory[] ST_Split(trajectory traj, int[] indexes);

Parámetros

Parámetro

Descripción

traj

La trayectoria que se va a dividir.

geom

El objeto de geometría espacial que se utiliza para dividir la trayectoria. Solo son compatibles los tipos Point y MultiPoint.

radius_of_buffer

El radio (en metros) del búfer construido alrededor de la geometría Point. Consulte la nota siguiente para conocer el motivo por el que se requiere un búfer.

config

Una cadena JSON que especifica la regla de división. Solo se permite una regla por llamada.

indexes

Un arreglo de enteros con los índices de los puntos donde se realiza la división. Los índices comienzan en 0.

División por geometría

ST_Split(trajectory traj, geometry geom, float8 radius_of_buffer)

Divide la trayectoria en cualquier punto que caiga dentro de la zona de búfer alrededor de la geometría. Devuelve los segmentos restantes como un arreglo de subtrayectorias. Cuando se proporciona una geometría MultiPoint, la trayectoria puede dividirse en varias ubicaciones.

Un punto de trayectoria y un objeto de geometría rara vez se intersecan de forma exacta debido a la precisión de punto flotante. El parámetro radius_of_buffer crea una zona de búfer alrededor de cada Point para capturar de manera confiable los puntos de trayectoria cercanos como ubicaciones de división. Establezca este valor según la precisión de coordenadas de sus datos y la tolerancia espacial aceptable.

Split a trajectory based on a geometry object.

Ejemplo: divida una trayectoria en tres puntos con un búfer de 23 km.

CREATE TABLE tr_split_traj (id integer, traj trajectory);

INSERT INTO tr_split_traj VALUES (
  3,
  ST_MakeTrajectory(
    'STPOINT'::leaftype,
    st_geomfromtext('LINESTRING(99.027 29.7555,99.313 29.9975,99.852 30.0745,104.879 35.0795,105.044 35.1235,105.187 35.0685,109.906 35.0795,110.071 35.1675,110.192 35.0355,110.544 35.0245,111.017 34.8045)', 4326),
    ARRAY[
      '2010-01-01 14:30'::timestamp, '2010-01-01 15:00', '2010-01-01 15:10',
      '2010-01-01 15:20', '2010-01-01 15:30', '2010-01-01 15:40',
      '2010-01-01 15:50', '2010-01-01 16:00', '2010-01-01 16:10',
      '2010-01-01 16:20', '2010-01-01 16:30'
    ],
    '{"leafcount":11,"attributes":{"velocity":{"type":"integer","length":2,"nullable":true,"value":[120,130,140,150,160,170,180,190,200,210,220]}}}'
  )
);

SELECT id, unnest(ST_Split(traj, st_geomfromtext('MULTIPOINT(100 30,105 35,110 35)'), 23000)) AS subtraj
FROM tr_split_traj;

La geometría MULTIPOINT divide la trayectoria en 4 subtrayectorias, una por cada segmento entre los tres puntos de división.

División por regla

ST_Split(trajectory traj, text config)

Divide la trayectoria con base en una regla JSON. Pase exactamente una regla por llamada.

Las reglas de config se agrupan en tres categorías, tal como se ilustra a continuación:

  • cut_point.* — divide en un punto de muestreo (punto B en el diagrama).

  • cut_edge.* — divide en una arista entre dos puntos de muestreo (punto C en el diagrama).

  • drop_edge.* — elimina una arista entre dos puntos de muestreo (la arista entre el punto A y el punto B).

Split a trajectory based on a rule.

Reglas disponibles

Regla

Tipo de valor

Comportamiento

cut_point.max_point

Entero positivo

Divide cada N puntos de muestreo. El intervalo N es el valor que usted especifique.

cut_point.even_divide

Entero positivo

Divide la trayectoria en N partes iguales. Si la trayectoria tiene menos aristas que N, cada arista se convierte en una subtrayectoria.

cut_edge.time_interval

Rango de tiempo positivo

Divide en cada límite de arista que cruce el intervalo de tiempo especificado. Acepta una marca de tiempo de anclaje opcional: "<interval>, <anchor>".

cut_edge.geohash

Número par positivo

Divide de modo que cada subtrayectoria quede dentro de una sola celda de cuadrícula Geohash con la precisión indicada. Los datos de la trayectoria deben usar coordenadas de latitud y longitud.

drop_edge.temporal_length

Rango de tiempo

Elimina cualquier arista cuya duración supere el rango de tiempo especificado.

drop_edge.spatial_distance_2d

Punto flotante

Elimina cualquier arista cuya distancia euclidiana 2D supere el valor especificado.

Ejemplos

cut_point.max_point — dividir cada 4 puntos

WITH traj AS (
  SELECT '{"trajectory":{"version":1,"type":"STPOINT","leafcount":19,...}}'::trajectory AS a
)
SELECT unnest(ST_Split(a, '{"cut_point.max_point":4}')) FROM traj;
-- Returns 5 sub-trajectories: four with 5 points each, one remainder with 3 points.

cut_point.even_divide — dividir en partes iguales

Cuando la cantidad de partes solicitada supera el número de aristas, cada arista se convierte en su propia subtrayectoria.

-- Request 100 parts from a 19-point trajectory (18 edges -> 18 sub-trajectories)
SELECT ST_Split(a, '{"cut_point.even_divide":100}') FROM traj;

cut_edge.time_interval — dividir en un intervalo de tiempo fijo

Pase "<interval>" para dividir según el tiempo transcurrido, o bien "<interval>, <anchor_date>" para alinear las divisiones con límites de reloj fijos.

-- Split every 50 minutes from the trajectory's start time
SELECT ST_Split(a, '{"cut_edge.time_interval":"50 minute"}') FROM traj;

-- Split at fixed 1-hour boundaries anchored to 2000-01-01 00:00
SELECT unnest(ST_Split(a, '{"cut_edge.time_interval":"1 hour, 2000-01-01"}')) FROM traj;

cut_edge.geohash — dividir por cuadrícula Geohash

El valor indica la precisión de Geohash (debe ser un número par positivo). Los valores más altos generan cuadrículas más finas y más divisiones.

-- Precision 2: coarse grid, fewer sub-trajectories
SELECT ST_Split(a, '{"cut_edge.geohash":2}') FROM traj;

-- Precision 20: fine grid, more sub-trajectories
SELECT ST_Split(a, '{"cut_edge.geohash":20}') FROM traj;
cut_edge.geohash requiere que la trayectoria utilice coordenadas de latitud y longitud.

drop_edge.spatial_distance_2d — eliminar aristas por distancia 2D

Elimina cualquier arista cuya distancia euclidiana 2D supere el valor especificado. Si se eliminan todas las aristas, la función devuelve un arreglo vacío ({}).

-- Remove edges longer than 13 units -> returns 1 sub-trajectory (18 remaining points)
SELECT ST_Split(a, '{"drop_edge.spatial_distance_2d":13}') FROM traj;

-- Remove edges longer than 10 units -> returns 7 sub-trajectories
SELECT ST_Split(a, '{"drop_edge.spatial_distance_2d":10}') FROM traj;

-- Remove edges longer than 1 unit -> all edges removed, returns {}
SELECT ST_Split(a, '{"drop_edge.spatial_distance_2d":1}') FROM traj;

División por índice

ST_Split(trajectory traj, int[] indexes)

Divide la trayectoria en los índices de punto especificados. Los índices comienzan en 0. Con n índices, la función produce n-1 subtrayectorias. No es necesario incluir los puntos inicial y final de la trayectoria en el arreglo de índices.

Ejemplo: divida en los índices 1, 3 y 5; esto devuelve 2 subtrayectorias (los segmentos [1–3] y [3–5]).

WITH traj AS (
  SELECT '{"trajectory":{"version":1,"type":"STPOINT","leafcount":19,...}}'::trajectory AS a
)
SELECT unnest(ST_Split(a, '{1,3,5}'::int[])) FROM traj;
-- Returns 2 sub-trajectories.

Ejemplo: incluir los índices inicial (0) y final (ST_leafcount(a) - 1) en el arreglo no altera el comportamiento de la división, pero hace explícitos los límites de los índices.

SELECT unnest(ST_Split(a, '{0}'::int[] || '{0,1,3,5}'::int[] || ST_leafcount(a) - 1)) FROM traj;
-- Returns 4 sub-trajectories (duplicate index 0 is ignored).

Pasos siguientes

  • ST_MakeTrajectory — construya una trayectoria a partir de geometrías y marcas de tiempo.

  • ST_leafcount — obtenga la cantidad de puntos de muestreo de una trayectoria.