12 votos

Similitud entre dos o más trayectorias

Tengo los datos de los camiones (http://www.chorochronos.org/).

Estos datos están las coordenadas gps de múltiples trayectorias de camiones en Atenas.

Tengo que calcular la similitud entre el trajetories, con el fin de eliminar aquellos que son muy similares!

Problem:

El rojo Y el Verde son similares, pero en azul, negro y rojo (o verde) son diferentes trayectorias. Quiero eliminar uno de los similares, rojo o verde.

Los datos están en los puntos (geometría , lat y long , x y y)(coordenadas gps), la imagen son ejemplos de trayectorias

10voto

hernan43 Puntos 566

Muy fácil, pero no fantástico medida es obtener la distancia de Hausdorff entre cada combinación, que se realiza con el ST_HausdorffDistance función. Uso aproximado LineStrings de su figura, estos se muestran en azul, y la distancia de Hausdorff es muestra de uno de los pares de líneas en rojo:

Hausdorff distance

Y la consulta para ordenar las 6 combinaciones en orden descendente:

WITH data AS (
  SELECT 'blue' AS name, 'LINESTRING (60 200, 110 290, 200 320, 330 320, 430 240, 450 200)'::geometry AS geom
  UNION SELECT 'black', 'LINESTRING (60 200, 120 270, 235 297, 295 207, 450 200)'::geometry
  UNION SELECT 'green', 'LINESTRING (60 200, 280 190, 450 200)'::geometry
  UNION SELECT 'red', 'LINESTRING (60 200, 150 210, 257 195, 360 210, 430 190, 450 200)'::geometry)
SELECT a.name || ' <-> ' || b.name AS compare, ST_HausdorffDistance(a.geom, b.geom)
FROM data a, data b WHERE a.name < b.name
ORDER BY ST_HausdorffDistance(a.geom, b.geom) DESC;

     compare     | st_hausdorffdistance
-----------------+----------------------
 blue <-> green  |                  130
 blue <-> red    |                  125
 black <-> blue  |     110.102502131467
 black <-> green |     104.846289061163
 black <-> red   |     97.9580173908678
 green <-> red   |     15.2677257073823
(6 rows)

Por lo que funciona bien para este ejemplo, pero no es un gran o técnica robusta para la agrupación de las líneas, ya que la única métrica es el único punto con el mayor distancia, en lugar de comparar las diferencias de las líneas completas. Hay mucho mejores métodos, pero será más complicado.

4voto

Marcin Puntos 11

No tengo acceso a PostGres/PostGIS, pero aquí es lo que yo haría en ArcGIS (o de otros).

  1. Calcular la longitud de las líneas originales en una columna estática
  2. Búfer de sus líneas de acuerdo a la definición de "similares". No se disuelven búferes. Resultando tampones han FID igual a la línea original.
  3. Se cruzan los buffers y las líneas originales. Capa resultante será identificar Fid participar en esa intersección (por ejemplo, "FID_lines" y "FID_buff").
  4. Disolver la capa de #3 por los dos originales de la FID y columnas de la longitud original de la columna
  5. Ignorar resultante de las líneas que tienen el mismo valor para los dos originales FID columnas utilizando una consulta de definición, o de otros medios (por supuesto, una línea en el búfer y se cruzó con su propio búfer se superponen totalmente).
  6. Agregar una columna numérico y rellenar con la nueva longitud
  7. Divida la nueva longitud con la longitud original (en una nueva columna) para obtener una relación de la línea original que cae en el búfer de cada cercanos de la línea.
  8. Inspeccionar los valores para la relación. Mantener a los que ha definido como "bastante similar". Por ejemplo, tal vez una línea de caer en el búfer de otra línea para el 75% de su longitud es bastante similar, tal vez su frecuencia de corte es de 50% de acuerdo, etc.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X