둘 이상의 궤적 간의 유사성


11

트럭 데이터가 있습니다 ( http://www.chorochronos.org/ ).

이 데이터는 아테네에서 트럭의 여러 궤도의 GPS 좌표입니다.

매우 유사한 것을 삭제하기 위해 trajetories 사이의 유사성을 계산해야합니다!

문제:

빨강과 녹색은 비슷하지만 파랑, 검정 및 (빨간색 또는 녹색)은 다른 궤적입니다. 빨간색 또는 녹색의 유사 항목 중 하나를 삭제하고 싶습니다.

데이터는 포인트 (형상, 위도 및 경도, x 및 y) (좌표 gps)이며 이미지는 궤도의 예입니다.


1
빨강과 초록이 비슷하고 녹색과 검은 색이 비슷하지만 빨강과 검은 색이 비슷하지 않으면 어떻게됩니까? 또한 "유사"를 어떻게 정의합니까? 다른 선 또는 다른 메트릭의 거리 내에있는 선의 비율입니까?
phloem

나는 단지 다른 것과 다른 궤도를 유지하고 싶습니다. trajetories는 선이 아닌 GPS 좌표입니다.
user2883056

1
postgispostgresql에 대한 태그가 있지만 질문 본문에 언급하지 않았습니다. 태그를 지정하는 것이 중요하지만 해당 제품을 사용하는 경우 제목을 확인한 후 모든 관심을 끄는 질문 섹션이므로 질문 본문에 해당 제품을 기록하는 것이 좋습니다.
PolyGeo

2
@phloem에 동의합니다. 핵심 질문은 "어떻게 유사성을 정의합니까?"입니다. 모든 경로는 AB에서 출발하므로 그런 의미에서 '유사'합니다. 성공적인 결과를 평가하는 방법에 대한 자세한 정보를 제공해야합니다.
Stephen Lead

답변:


10

ST_HausdorffDistance 함수를 사용하여 각 조합 사이 의 Hausdorff 거리 를 얻는 것이 정말 쉽지만 환상적인 방법은 아닙니다 . 그림에서 대략적인 LineString을 사용하면 모두 파란색으로 표시되고 Hausdorff 거리는 한 쌍의 선 중 하나에 빨간색으로 표시됩니다.

하우스 도르프 거리

그리고 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 포인트와 같은 것을 사용하고 순진한 접근 방식으로 각 관련 포인트 세트의 평균 거리를 계산했을 것입니다. 훨씬 더 나은 방법으로 무엇을 생각 했습니까?
John Powell

1
@ JohnBarça 더 나은 방법은 각 라인의 범위에 대한 공간 통계를 비교하는 것입니다. 한 가지 방법은 각 선을 래스터 화하고 래스터와 함께 가우시안 블러를 수행 한 다음 각 조합에서 일치하는 래스터 값의 상관 관계를 결정합니다. ST_Segmentize 및 ST_Interpolate 도구를 기반으로하는 메소드도 작동합니다.
Mike T

4

PostGres / PostGIS에 액세스 할 수 없지만 다음은 ArcGIS (또는 기타)에서 어떻게 진행하는지 보여줍니다.

  1. 정적 행으로 원래 줄의 길이를 계산
  2. "유사한"정의 방법에 따라 라인을 버퍼링하십시오. 버퍼를 녹이지 마십시오. 결과 버퍼는 FID가 원래 줄과 같습니다.
  3. 버퍼와 원본 라인을 교차시킵니다. 결과 레이어는 특정 교차로에 참여하는 FID를 식별합니다 (예 : "FID_lines"및 "FID_buff").
  4. 두 개의 원래 FID 열과 원래 길이 열로 # 3에서 레이어를 디졸브
  5. 정의 쿼리 또는 다른 방법을 사용하여 두 개의 원래 FID 열에 대해 동일한 값을 갖는 결과 행을 무시하십시오 (물론 자체 버퍼와 버퍼링되고 교차 된 행은 완전히 겹칩니다).
  6. 숫자 열을 추가하고 새 길이로 채 웁니다.
  7. 새 길이를 원래 길이 (새 열로)로 나누면 각 근처 줄의 버퍼에 빠지는 원래 줄의 비율을 얻을 수 있습니다.
  8. 비율 값을 검사하십시오. "충분히 유사하다"고 정의한 것을 유지하십시오. 예를 들어, 길이의 75 % 동안 다른 라인의 버퍼 내에있는 라인은 충분히 유사 할 수 있습니다. 아마도 컷오프가 50 % 일치하는 등입니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.