2つ以上の軌跡間の類似性


11

トラックのデータがあります(http://www.chorochronos.org/)。

このデータは、アテネのトラックの複数の軌跡のGPS座標です。

非常に類似しているものを削除するために、軌跡間の類似性を計算する必要があります!

問題:

赤と緑は似ていますが、青、黒、(赤または緑)は異なる軌跡です。赤または緑の類似のものを削除したい。

データはポイント(geometry、latとlong、xとy)(座標gps)であり、画像は軌跡の例です


1
赤と緑が似ていて、緑と黒は似ているが、赤と黒が似ていない場合はどうなりますか?また、「類似」とはどのように定義するのですか。それは、他のラインから距離内にあるラインの割合ですか、それとも他のメトリックですか?
師部2014年

私は他とは異なる軌跡を維持したいだけです。trajetoriesはラインではなくgps座標です...
user2883056 '10 / 10/14

1
あなたはpostgispostgresqlのタグを持っていますが、質問の本文にはどちらも言及していません。タグ付けは重要ですが、これらの製品を使用している場合は、タイトルを一目見た後、これがすべての注意を引く質問のセクションになるため、質問の本文に記録することを強くお勧めします。
PolyGeo

2
私は@phloemに同意します-重要な質問は「類似のものをどのように定義するか」です。すべてのルートはABから行くので、その意味で「類似」しています。成功した結果をどのように評価するかについて、より多くの情報を提供する必要があります
Stephen Lead

回答:


10

ST_HausdorffDistance関数を使用して、各組み合わせ間のハウスドルフ距離を取得することは、非常に簡単ですが、素晴らしい方法ではありません。あなたの図からおおよそのLineStringを使用すると、これらはすべて青で表示され、Hausdorff距離は赤の線のペアの1つに対して表示されます。

ハウスドルフ距離

そして、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より良い方法は、各ラインのカバレッジの空間統計を比較することです。1つの方法は、各ラインをラスタライズし、ラスタでガウスぼかしを実行してから、各組み合わせから一致するラスタ値の相関を決定します。ST_SegmentizeおよびST_Interpolateツールに基づく方法も機能します。
マイクT

4

私はPostGres / PostGISにアクセスできませんが、ArcGIS(またはその他)でこれを実行する方法を次に示します。

  1. 静的な列への元の行の長さを計算します
  2. 「類似」の定義方法に応じて行をバッファリングします。バッファーを溶解しないでください。結果のバッファーは、元の行と同じFIDになります。
  3. バッファーと元の行を交差させます。結果のレイヤーは、その特定の交差に参加しているFIDを識別します(たとえば、「FID_lines」と「FID_buff」)。
  4. 2つの元のFID列と元の長さの列によって#3からレイヤーをディゾルブします
  5. 定義クエリまたはその他の手段を使用して、2つの元のFID列の値が同じである結果の行を無視します(もちろん、バッファーされ、独自のバッファーと交差する行は完全に重なります)。
  6. 数値列を追加し、新しい長さを入力します
  7. 新しい長さを元の長さで(新しい列に)割って、近くの各行のバッファーに入る元の行の比率を取得します。
  8. 比率の値を調べます。「十分に類似している」と定義したものを保持します。たとえば、別のラインのバッファ内にその長さの75%が収まっているラインは十分に類似していて、カットオフは50%一致しているなどです。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.