Kesamaan antara dua lintasan atau lebih


11

Saya memiliki data truk ( http://www.chorochronos.org/ ).

Data ini adalah koordinat gps dari beberapa lintasan truk di Athena.

Saya harus menghitung kesamaan antara trajetories, untuk menghapus yang sangat mirip!

Masalah:

Merah dan hijau serupa, tetapi biru, hitam dan (merah atau hijau) adalah lintasan yang berbeda. Saya ingin menghapus salah satu similares, merah atau hijau.

Data dalam titik (geometri, lat dan panjang, x dan y) (koordinat gps), gambar adalah contoh lintasan


1
Apa yang terjadi jika merah dan hijau serupa, dan hijau dan hitam serupa, tetapi merah dan hitam tidak serupa? Juga, bagaimana Anda mendefinisikan "mirip" - apakah itu proporsi garis jatuh dalam jarak garis lain, atau metrik lain?
Floem

Saya hanya ingin tetap dengan lintasan yang berbeda dari yang lain. Trajetories adalah koordinat gps, bukan garis ...
user2883056

1
Anda memiliki tag untuk postgis dan postgresql tetapi tidak disebutkan di badan pertanyaan Anda. Meskipun pemberian tag itu penting, jika Anda menggunakan produk-produk itu, saya sangat menyarankan untuk merekamnya di badan pertanyaan Anda karena, setelah melihat judulnya, ini akan menjadi bagian dari pertanyaan Anda yang mendapat semua perhatian.
PolyGeo

2
Saya setuju dengan @ phloem - pertanyaan kuncinya adalah "bagaimana Anda mendefinisikan yang serupa"? Semua rute pergi dari AB, jadi mereka 'mirip' dalam arti itu. Anda perlu memberikan informasi lebih lanjut tentang bagaimana Anda akan mengevaluasi hasil yang sukses
Stephen Lead

Jawaban:


10

Ukuran yang sangat mudah, tetapi tidak fantastis adalah untuk mendapatkan jarak Hausdorff antara setiap kombinasi, yang dilakukan dengan fungsi ST_HausdorffDistance . Menggunakan perkiraan LineStrings dari gambar Anda, ini semua ditampilkan dengan warna biru, dan jarak Hausdorff ditampilkan untuk salah satu pasangan garis berwarna merah:

Jarak Hausdorff

Dan permintaan untuk mengurutkan 6 kombinasi dalam urutan menurun:

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)

Jadi itu berfungsi dengan baik untuk contoh ini, tetapi itu bukan teknik yang bagus atau kuat untuk garis pengelompokan, karena satu-satunya metrik adalah titik tunggal dengan jarak terbesar, daripada membandingkan perbedaan garis lengkap. Ada banyak metode yang lebih baik, tetapi mereka akan lebih rumit.


Jawaban bagus. Saya mungkin akan menggunakan sesuatu seperti titik ST_Interpolate dan kemudian menghitung jarak rata-rata untuk setiap set poin terkait sebagai pendekatan yang naif. Apa yang Anda pikirkan dengan metode yang jauh lebih baik?
John Powell

1
@ JohnBarça metode yang lebih baik adalah membandingkan statistik spasial dari cakupan setiap baris. Satu metode akan merasterisasi setiap baris, melakukan blur Gaussian dengan raster, lalu menentukan korelasi nilai raster bertepatan dari setiap kombinasi. Metode yang didasarkan pada alat ST_Segmentize dan ST_Interpolate juga akan berfungsi.
Mike T

4

Saya tidak memiliki akses ke PostGres / PostGIS, tetapi di sini saya akan membahasnya di ArcGIS (atau lainnya).

  1. Hitung panjang garis asli menjadi kolom statis
  2. Buffer baris Anda sesuai dengan cara Anda mendefinisikan "mirip". Jangan membubarkan buffer. Buffer yang dihasilkan akan memiliki FID yang sama dengan baris asli.
  3. Buffer berpotongan dan garis asli. Lapisan yang dihasilkan akan mengidentifikasi FID yang berpartisipasi dalam persimpangan tertentu (misalnya, "FID_lines" dan "FID_buff").
  4. Larutkan layer dari # 3 oleh dua kolom FID asli dan kolom panjang asli
  5. Abaikan baris yang dihasilkan yang memiliki nilai yang sama untuk dua kolom FID asli menggunakan kueri definisi, atau cara lain (tentu saja garis buffered dan berpotongan dengan buffer sendiri akan sepenuhnya tumpang tindih).
  6. Tambahkan kolom angka dan isi dengan panjang baru
  7. Bagilah panjang baru dengan panjang asli (ke dalam kolom baru) untuk mendapatkan rasio dari garis asli yang jatuh ke buffer setiap baris terdekat.
  8. Periksa nilai untuk rasio. Simpan yang sudah Anda tetapkan sebagai "cukup mirip". Misalnya, mungkin garis yang berada dalam buffer garis lain karena 75% dari panjangnya cukup mirip, mungkin batas Anda 50% perjanjian, dll.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.