Схожість між двома або більше траєкторіями


11

У мене є дані вантажівок ( http://www.chorochronos.org/ ).

Ці дані - координати gps декількох траєкторій вантажівок в Афінах.

Я повинен обчислити схожість між траєкторіями, щоб видалити ті, які дуже схожі!

Проблема:

Червоний і зелений схожі, але синій, чорний і (червоний або зелений) різні траєкторії. Я хочу видалити один із схожих зображень, червоний або зелений.

Дані в точках (геометрія, лат і довгі, х і у) (координати gps), зображення - приклади траєкторій


1
Що станеться, якщо червоний і зелений схожі, а зелений і чорний схожі, але червоний і чорний не схожі? Крім того, як ви визначаєте "подібний" - це пропорція лінії, що потрапляє на відстань іншого рядка, чи якась інша метрика?
флоема

Я просто хочу зупинитися на траєкторіях, які відрізняються від інших. Траєкторії - це координати gps, а не лінії ...
user2883056

1
У вас є теги для postgis та postgresql, але не вказуйте жодного з них у своєму питанні. Хоча тег є важливим, якщо ви використовуєте ці продукти, я настійно рекомендую записати їх у основну частину вашого запитання, оскільки після погляду на заголовок це буде розділ вашого питання, який приверне всю увагу.
PolyGeo

2
Я погоджуюся з @phloem - ключове питання "як ти визначаєш подібне"? Усі маршрути йдуть від АВ, тому в цьому сенсі вони «схожі». Вам потрібно надати додаткову інформацію про те, як ви оціните успішний результат
Stephen Lead

Відповіді:


10

Дійсно простий, але не фантастичний захід - отримати відстань Хаусдорфа між кожною комбінацією, що робиться за допомогою функції ST_HausdorffDistance . Використовуючи приблизні рядкові рядки з вашої фігури, всі вони показані синім кольором, а відстань Хаусдорфа відображається для однієї з парних рядків червоним кольором:

Відстань Хаусдорфа

І запит для сортування 6 комбінацій у порядку зменшення:

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)

Таким чином, це добре працює для цього прикладу, але це не є великою або надійною технікою кластеризації ліній, оскільки єдиною метрикою є єдина точка з найбільшою відстані, а не порівняння відмінностей повних ліній. Є набагато кращі методи, але вони будуть складнішими.


Гарна відповідь. Я, певно, використав би щось на зразок точки ST_Interpolate, а потім обчислив середні відстані для кожного набору пов'язаних точок як наївний підхід. Що ви мали на увазі набагато кращими методами?
Джон Пауелл

1
@ JohnBarça кращими методами було б порівняння просторової статистики покриття кожного рядка. Одним із методів було б растерізувати кожен рядок, зробити розмиття Гаусса з растром, а потім визначити кореляцію збіжних растрових значень від кожної комбінації. Метод, заснований на інструментах ST_Segmentize та ST_Interpolate, також працював.
Майк Т

4

У мене немає доступу до PostGres / PostGIS, але ось як я б це зробив у ArcGIS (або іншому).

  1. Обчисліть довжину вихідних рядків у статичну колонку
  2. Буферуйте рядки відповідно до того, як ви визначаєте "подібні". Не розчиняйте буфери. Отримані буфери матимуть FID, рівний початковому рядку.
  3. Перетинаються буфери та оригінальні лінії. Отриманий шар ідентифікує FID, які беруть участь у цьому конкретному перетині (наприклад, "FID_lines" та "FID_buff").
  4. Розведіть шар №3 двома оригінальними стовпцями FID та стовпцем початкової довжини
  5. Ігноруйте результуючі рядки, які мають однакове значення для двох оригінальних стовпців FID, використовуючи запит на визначення чи інші засоби (звичайно, буферна лінія та пересікається з її власним буфером повністю перекриються).
  6. Додайте числовий стовпчик і заповніть його новою довжиною
  7. Розділіть нову довжину з початковою довжиною (у новий стовпець), щоб отримати співвідношення вихідної лінії, що потрапляє в буфер кожного рядка, що знаходиться поруч.
  8. Перевірте значення співвідношення. Зберігайте ті, які ви визначили як "досить схожі". Наприклад, можливо, рядок, що потрапляє в буфер іншого рядка на 75% його довжини, є досить подібним, можливо, ваше відсічення становить 50% узгодження тощо.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.