Todos os produtos
Search
Central de documentação

ApsaraDB RDS:ST_JaccardSimilarity

Última atualização: Aug 22, 2026

Calcula o índice de Jaccard entre duas trajetórias ou subtrajetórias e retorna os limites inferior e superior da pontuação de similaridade.

Sintaxe

record ST_JaccardSimilarity(trajectory tr1, trajectory tr2, double tol_dist,
                            text unit default '{}', interval tol_time default NULL,
                            timestamp ts default '-infinity', timestamp te default 'infinity');

A função retorna um record com os seguintes campos:

Campo

Tipo

Descrição

nleaf1

int

Quantidade de pontos da trajetória em tr1 que interceptam tr2.

nleaf2

int

Quantidade de pontos da trajetória em tr2 que interceptam tr1. Este valor pode diferir de nleaf1. Por exemplo, se tr1 passar pelo mesmo ponto de tr2 duas vezes, nleaf1 será 1 e nleaf2 será 2.

inter1

int

Número de pontos em tr1 cuja distância até tr2 atende às tolerâncias de distância e tempo.

inter2

int

Número de pontos em tr2 cuja distância até tr1 atende às tolerâncias de distância e tempo.

jaccard_lower

double

Limite inferior do índice de Jaccard. Calculado como min(inter1, inter2) / (nleaf1 + nleaf2 - min(inter1, inter2)).

jaccard_upper

double

Limite superior do índice de Jaccard. Calculado como max(inter1, inter2) / (nleaf1 + nleaf2 - max(inter1, inter2)).

Parâmetros

Parâmetro

Tipo

Padrão

Descrição

tr1

trajectory

Primeira trajetória.

tr2

trajectory

Segunda trajetória.

tol_dist

double

Distância máxima permitida entre um par correspondente de pontos de trajetória, em metros.

unit

text

'{}'

String JSON que controla o cálculo das distâncias. Consulte campos do parâmetro unit.

tol_time

interval

NULL

Diferença de tempo máxima permitida entre um par correspondente de pontos de trajetória. Se for NULL ou negativo, a função corresponde os pontos apenas pela distância e ignora os timestamps.

ts

timestamp

-infinity

Início do intervalo de tempo. Quando especificado, a função compara apenas as subtrajetórias entre ts e te.

te

timestamp

infinity

Fim do intervalo de tempo. Quando especificado, a função compara apenas as subtrajetórias entre ts e te.

Campos do parâmetro unit

Campo

Tipo

Padrão

Descrição

Projection

string

None

Sistema de coordenadas para reprojeção das trajetórias antes do cálculo das distâncias. Valores válidos: auto (selecione dinamicamente Lambert Azimuthal ou UTM com base na longitude e latitude; a unidade de distância é metros) e srid (reprojeta usando o identificador de referência espacial (SRID) especificado). Se omitido, os cálculos usam o sistema de coordenadas original.

Unit

string

null

Unidade de medição de distância. Valores válidos: null (distância euclidiana baseada nas coordenadas brutas) e M (distância baseada na referência espacial das trajetórias, geralmente metros).

useSpheroid

bool

true

Defina se a função deve usar um modelo de elipsoide quando Unit for M. true: usa um elipsoide para distâncias precisas. false: usa uma esfera para distâncias aproximadas.

Funcionamento

O índice clássico de Jaccard para dois conjuntos corresponde ao tamanho da interseção dividido pelo tamanho da união. Para trajetórias, esse conceito se estende à correspondência espacial (e opcionalmente temporal). Um ponto da trajetória em tr1 intercepta tr2 se existir um ponto em tr2 dentro de tol_dist metros. Caso tol_time esteja definido, o ponto também deve estar dentro da janela de tempo especificada.

A relação de correspondência não é simétrica. O fato de tr1 passar perto de um ponto em tr2 uma vez tem contagem diferente de tr2 passar perto do mesmo ponto duas vezes. Por isso, a função retorna dois limites em vez de um único valor:

  • jaccard_lower: usa a menor contagem de interseção (min(inter1, inter2)) e fornece uma estimativa conservadora da sobreposição. Use este valor quando for necessário garantir um nível mínimo confirmado de similaridade.

  • jaccard_upper: usa a maior contagem de interseção (max(inter1, inter2)) e fornece uma estimativa otimista da sobreposição. Use este valor para capturar a correspondência mais ampla possível entre as duas trajetórias.

Ambos os valores variam de 0 (nenhuma sobreposição) a 1 (sobreposição completa).

Exemplo

O exemplo a seguir compara duas trajetórias em uma janela de tempo de três dias, com tolerância de distância de 100 metros e tolerância de tempo de 20 segundos.

WITH traj AS (
  SELECT
    ST_makeTrajectory('STPOINT'::leaftype,
      'SRID=4326;LINESTRING(114.49211 37.97921,114.49211 37.97921,114.49211 37.97921,114.49211 37.97921)'::geometry,
      ARRAY[
        to_timestamp(1590287775) AT TIME ZONE 'UTC',
        to_timestamp(1590287778) AT TIME ZONE 'UTC',
        to_timestamp(1590302169) AT TIME ZONE 'UTC',
        to_timestamp(1590302171) AT TIME ZONE 'UTC'
      ], '{}') a,
    ST_makeTrajectory('STPOINT'::leaftype,
      'SRID=4326;LINESTRING(114.49211 37.97921,114.49211 37.97921,114.49211 37.97921,114.49211 37.97921,114.49145 37.97781,114.49145 37.97781,114.49145 37.97781,114.49145 37.97781,114.49145 37.97781,114.49145 37.97781,114.49145 37.97781,114.49145 37.97781,114.49145 37.97781,114.49145 37.97781,114.49211 37.97921,114.49211 37.97921,114.49211 37.97921,114.49211 37.97921,114.49211 37.97921,114.49211 37.97921)'::geometry,
      ARRAY[
        to_timestamp(1590287765) AT TIME ZONE 'UTC',
        to_timestamp(1590287771) AT TIME ZONE 'UTC',
        to_timestamp(1590287778) AT TIME ZONE 'UTC',
        to_timestamp(1590287780) AT TIME ZONE 'UTC',
        to_timestamp(1590295992) AT TIME ZONE 'UTC',
        to_timestamp(1590295997) AT TIME ZONE 'UTC',
        to_timestamp(1590296013) AT TIME ZONE 'UTC',
        to_timestamp(1590296018) AT TIME ZONE 'UTC',
        to_timestamp(1590296025) AT TIME ZONE 'UTC',
        to_timestamp(1590296032) AT TIME ZONE 'UTC',
        to_timestamp(1590296055) AT TIME ZONE 'UTC',
        to_timestamp(1590296073) AT TIME ZONE 'UTC',
        to_timestamp(1590296081) AT TIME ZONE 'UTC',
        to_timestamp(1590296081) AT TIME ZONE 'UTC',
        to_timestamp(1590302169) AT TIME ZONE 'UTC',
        to_timestamp(1590302174) AT TIME ZONE 'UTC',
        to_timestamp(1590302176) AT TIME ZONE 'UTC',
        to_timestamp(1590302176) AT TIME ZONE 'UTC',
        to_timestamp(1590302172) AT TIME ZONE 'UTC',
        to_timestamp(1590302176) AT TIME ZONE 'UTC'
      ], '{}') b
)
SELECT ST_JaccardSimilarity(a, b, 100, '{"unit":"M"}', '20 second',
  '2020-05-23'::timestamptz AT TIME ZONE 'UTC',
  '2020-05-26'::timestamptz AT TIME ZONE 'UTC')
FROM traj;

Saída:

       st_jaccardsimilarity
-----------------------------------
 (4,20,4,10,0.2,0.714285714285714)
(1 row)

O resultado mapeia os campos de retorno da seguinte forma:

Campo

Valor

Significado

nleaf1

4

4 pontos em tr1 interceptam tr2

nleaf2

20

20 pontos em tr2 interceptam tr1

inter1

4

4 pontos em tr1 atendem às tolerâncias de distância e tempo

inter2

10

10 pontos em tr2 atendem às tolerâncias de distância e tempo

jaccard_lower

0.2

Similaridade conservadora: 4 / (4 + 20 - 4)

jaccard_upper

0.714...

Similaridade otimista: 10 / (4 + 20 - 10)