All Products
Search
Document Center

PolarDB:ST_lcsSimilarity

Last Updated:Mar 28, 2026

Computes the similarity between two trajectory objects using the longest common subsequence (LCSS) algorithm. Returns the count of consistent trajectory points.

Syntax

integer ST_lcsSimilarity(trajectory traj1, trajectory traj2, float8 dist, distanceUnit unit default 'M');
integer ST_lcsSimilarity(trajectory traj1, trajectory traj2, float8 dist, interval lag, distanceUnit unit default 'M');

Parameters

ParameterDescription
traj1The first trajectory object.
traj2The second trajectory object.
distThe spatial distance tolerance between two trajectory points, in meters.
lag(Optional) The time tolerance between two trajectory points. Omit this parameter to ignore the time dimension.
unitThe unit for the dist parameter. Default: 'M'. Valid values:
- 'M': meters
- 'KM': kilometers
- 'D': degrees. Valid only when the trajectory's spatial reference system identifier (SRID) is WGS84 (EPSG:4326).


How it works

The LCSS algorithm finds the maximum number of trajectory points that are consistent between two trajectories. Two trajectory points are consistent if they are within the specified spatial distance tolerance (dist) — and, when lag is provided, also within the specified time tolerance.

Similarity calculation algorithm

In the diagram above, points 1, 3, and 6 satisfy both conditions, so ST_lcsSimilarity returns 3.

Return value: The number of consistent trajectory points (an integer).

If a trajectory object has no explicit SRID set, the SRID defaults to 4326 (WGS84).

Examples

Compare without time tolerance

Use dist alone to match points based on spatial proximity only.

With traj AS (
    Select ST_makeTrajectory('STPOINT', 'LINESTRINGZ(114.000528 33.588163 54.87, 114.000535 33.588235 54.85, 114.000447 33.588272 54.69, 114.000348 33.588287 54.73, 114.000245 33.588305 55.26, 114.000153 33.588305 55.3)'::geometry,
                             ARRAY['2010-01-01 11:30'::timestamp, '2010-01-01 11:31', '2010-01-01 11:32', '2010-01-01 11:33','2010-01-01 11:34','2010-01-01 11:35'], NULL) a,
           ST_makeTrajectory('STPOINT', 'LINESTRINGZ(114.000529 33.588163 54.87, 114.000535 33.578235 54.85, 114.000447 33.578272 54.69, 114.000348 33.578287 54.73, 114.000245 33.578305 55.26, 114.000163 33.588305 55.3)'::geometry,
                             ARRAY['2010-01-01 11:29:58'::timestamp, '2010-01-01 11:31:02', '2010-01-01 11:33', '2010-01-01 11:33:09','2010-01-01 11:34','2010-01-01 11:34:30'], NULL) b)
Select st_LCSSimilarity(a, b, 100) from traj;

Result:

 st_lcssimilarity
------------------
 2
(1 row)

Compare with time tolerance

Add lag to require that matching points also fall within a time window. This is useful when timestamps matter — for example, in vehicle route matching or mobility pattern analysis.

With traj AS (
    Select ST_makeTrajectory('STPOINT', 'LINESTRINGZ(114.000528 33.588163 54.87, 114.000535 33.588235 54.85, 114.000447 33.588272 54.69, 114.000348 33.588287 54.73, 114.000245 33.588305 55.26, 114.000153 33.588305 55.3)'::geometry,
                             ARRAY['2010-01-01 11:30'::timestamp, '2010-01-01 11:31', '2010-01-01 11:32', '2010-01-01 11:33','2010-01-01 11:34','2010-01-01 11:35'], NULL) a,
           ST_makeTrajectory('STPOINT', 'LINESTRINGZ(114.000529 33.588163 54.87, 114.000535 33.578235 54.85, 114.000447 33.578272 54.69, 114.000348 33.578287 54.73, 114.000245 33.578305 55.26, 114.000163 33.588305 55.3)'::geometry,
                             ARRAY['2010-01-01 11:29:58'::timestamp, '2010-01-01 11:31:02', '2010-01-01 11:33', '2010-01-01 11:34:15','2010-01-01 11:34:50','2010-01-01 11:34:30'], NULL) b)
Select st_LCSSimilarity(a, b, 100, interval '30 seconds') from traj;

Result:

 st_lcssimilarity
------------------
 2
(1 row)