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 |
|
|
int |
Quantidade de pontos da trajetória em tr1 que interceptam tr2. |
|
|
int |
Quantidade de pontos da trajetória em tr2 que interceptam tr1. Este valor pode diferir de |
|
|
int |
Número de pontos em tr1 cuja distância até tr2 atende às tolerâncias de distância e tempo. |
|
|
int |
Número de pontos em tr2 cuja distância até tr1 atende às tolerâncias de distância e tempo. |
|
|
double |
Limite inferior do índice de Jaccard. Calculado como |
|
|
double |
Limite superior do índice de Jaccard. Calculado como |
Parâmetros
|
Parâmetro |
Tipo |
Padrão |
Descrição |
|
|
trajectory |
— |
Primeira trajetória. |
|
|
trajectory |
— |
Segunda trajetória. |
|
|
double |
— |
Distância máxima permitida entre um par correspondente de pontos de trajetória, em metros. |
|
|
text |
|
String JSON que controla o cálculo das distâncias. Consulte campos do parâmetro unit. |
|
|
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. |
|
|
timestamp |
|
Início do intervalo de tempo. Quando especificado, a função compara apenas as subtrajetórias entre |
|
|
timestamp |
|
Fim do intervalo de tempo. Quando especificado, a função compara apenas as subtrajetórias entre |
Campos do parâmetro unit
|
Campo |
Tipo |
Padrão |
Descrição |
|
|
string |
None |
Sistema de coordenadas para reprojeção das trajetórias antes do cálculo das distâncias. Valores válidos: |
|
|
string |
null |
Unidade de medição de distância. Valores válidos: |
|
|
bool |
true |
Defina se a função deve usar um modelo de elipsoide quando |
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 |
|
|
4 |
4 pontos em tr1 interceptam tr2 |
|
|
20 |
20 pontos em tr2 interceptam tr1 |
|
|
4 |
4 pontos em tr1 atendem às tolerâncias de distância e tempo |
|
|
10 |
10 pontos em tr2 atendem às tolerâncias de distância e tempo |
|
|
0.2 |
Similaridade conservadora: |
|
|
0.714... |
Similaridade otimista: |