Сходство между двумя или более траекториями

11

У меня есть данные о грузовиках ( http://www.chorochronos.org/ ).

Эти данные представляют собой GPS-координаты нескольких траекторий грузовых автомобилей в Афинах.

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

Проблема:

Красный и зеленый похожи, но синий, черный и (красный или зеленый) разные траектории. Я хочу удалить один из similares, красный или зеленый.

Данные в точках (геометрия, широта и долгота, х и у) (координаты GPS), изображения являются примерами траекторий

user2883056
источник
1
Что произойдет, если красный и зеленый похожи, а зеленый и черный похожи, но красный и черный не похожи? Кроме того, как вы определяете «подобное» - это доля линии, попадающей на расстояние от другой линии, или какая-то другая метрика?
флоэма
Я просто хочу остаться с траекториями, которые отличаются от других. Траектории - это координаты GPS, а не линии ...
user2883056
1
У вас есть теги для postgis и postgresql, но они не упоминаются ни в вашем теле вопроса. Хотя пометки важны, если вы используете эти продукты, я настоятельно рекомендую записать их в тексте вашего вопроса, потому что после просмотра заголовка этот раздел вашего вопроса привлечет все внимание.
PolyGeo
2
Я согласен с @phloem - ключевой вопрос "как вы определяете подобное"? Все маршруты идут от AB, поэтому они «похожи» в этом смысле. Вам нужно предоставить больше информации о том, как вы оцените успешный результат
Стивен Лид,

Ответы:

10

Действительно простой, но не фантастический способ - получить расстояние Хаусдорфа между каждой комбинацией, что делается с помощью функции ST_HausdorffDistance . Используя приблизительные значения LineStrings на вашем рисунке, все они показаны синим цветом, а расстояние Хаусдорфа показано для одной из пар линий красным цветом:

Хаусдорфово расстояние

И запрос для сортировки 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% и т. Д.
флоэма
источник