ความคล้ายคลึงกันระหว่างสองวิถีขึ้นไป


11

ฉันมีข้อมูลรถบรรทุก ( http://www.chorochronos.org/ )

ข้อมูลนี้เป็นพิกัดจีพีเอสของหลายเส้นทางการเคลื่อนที่ของรถบรรทุกในเอเธนส์

ฉันต้องคำนวณความคล้ายคลึงกันระหว่าง trajetories เพื่อที่จะลบสิ่งที่คล้ายกันมาก!

ปัญหา:

สีแดงและสีเขียวมีลักษณะคล้ายกัน แต่สีน้ำเงินสีดำและ (สีแดงหรือสีเขียว) เป็นวิถีที่แตกต่างกัน ฉันต้องการลบหนึ่งใน similares, สีแดงหรือสีเขียว

ข้อมูลอยู่ในจุด (เรขาคณิต, lat และ long, x และ y) (พิกัด gps), ภาพเป็นตัวอย่างของวิถี


1
จะเกิดอะไรขึ้นถ้าสีแดงและสีเขียวมีลักษณะคล้ายกันและสีเขียวและสีดำมีความคล้ายคลึงกัน แต่สีแดงและสีดำไม่เหมือนกัน นอกจากนี้คุณจะกำหนด "ที่คล้ายกัน" ได้อย่างไร - มันเป็นสัดส่วนของเส้นที่ตกลงไปในระยะทางของสายอื่นหรือตัวชี้วัดอื่น ๆ ?
phloem

ฉันแค่อยากอยู่กับวิถีที่แตกต่างจากคนอื่น trajetories เป็นพิกัด gps ไม่ใช่เส้น ...
user2883056

1
คุณมีแท็กสำหรับpostgisและpostgresqlแต่ไม่ต้องพูดถึงในส่วนคำถามของคุณ ในขณะที่การติดแท็กเป็นสิ่งสำคัญหากคุณกำลังใช้ผลิตภัณฑ์เหล่านั้นฉันขอแนะนำให้บันทึกไว้ในเนื้อความของคำถามเพราะหลังจากดูที่ชื่อแล้วนี่จะเป็นส่วนของคำถามที่ได้รับความสนใจทั้งหมด
PolyGeo

2
ฉันเห็นด้วยกับ @phloem - คำถามสำคัญคือ "คุณกำหนดคำเหมือนกันอย่างไร" เส้นทางทั้งหมดไปจาก AB ดังนั้นพวกเขาจึง 'คล้ายกัน' ในแง่นั้น คุณต้องให้ข้อมูลเพิ่มเติมเกี่ยวกับวิธีที่คุณประเมินผลลัพธ์ที่ประสบความสำเร็จ
Stephen Lead

คำตอบ:


10

การวัดที่ง่าย แต่ไม่สุดวิเศษคือการหาระยะห่างระหว่างHausdorffแต่ละชุดซึ่งทำด้วยฟังก์ชันST_HausdorffDistance ใช้ LineStrings โดยประมาณจากรูปของคุณสิ่งเหล่านี้จะแสดงเป็นสีน้ำเงินและระยะห่างของ Hausdorff จะแสดงสำหรับหนึ่งในคู่ของเส้นสีแดง:

ระยะทาง 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วิธีที่ดีกว่าคือการเปรียบเทียบสถิติเชิงพื้นที่ของความครอบคลุมของแต่ละบรรทัด วิธีหนึ่งจะแรสเตอร์แต่ละบรรทัดทำ Gaussian เบลอกับแรสเตอร์แล้วกำหนดความสัมพันธ์ของค่าแรสเตอร์บังเอิญจากแต่ละชุด วิธีการที่ใช้เครื่องมือ ST_Segmentize และ ST_Interpolate ก็สามารถใช้ได้เช่นกัน
Mike T

4

ฉันไม่สามารถเข้าถึง PostGres / PostGIS ได้ แต่นี่เป็นวิธีที่ฉันจะทำใน ArcGIS (หรืออื่น ๆ )

  1. คำนวณความยาวของบรรทัดต้นฉบับลงในคอลัมน์แบบคงที่
  2. บัฟเฟอร์บรรทัดของคุณตามวิธีที่คุณกำหนด "ที่คล้ายกัน" อย่าละลายบัฟเฟอร์ บัฟเฟอร์ผลลัพธ์จะมี FID เท่ากับบรรทัดเดิม
  3. ตัดบัฟเฟอร์และบรรทัดต้นฉบับ เลเยอร์ผลลัพธ์จะระบุ FID ที่เข้าร่วมในสี่แยกนั้น (ตัวอย่างเช่น "FID_lines" และ "FID_buff")
  4. ละลายเลเยอร์จาก # 3 โดยคอลัมน์ FID ดั้งเดิมสองคอลัมน์และคอลัมน์ความยาวดั้งเดิม
  5. ไม่ต้องสนใจบรรทัดผลลัพธ์ที่มีค่าเดียวกันสำหรับคอลัมน์ FID ดั้งเดิมสองคอลัมน์โดยใช้คิวรีคำนิยามหรือวิธีการอื่น ๆ (แน่นอนว่าบรรทัดที่บัฟเฟอร์และตัดกับบัฟเฟอร์ของตัวเองจะทับซ้อนกันทั้งหมด)
  6. เพิ่มคอลัมน์ตัวเลขและเติมด้วยความยาวใหม่
  7. แบ่งความยาวใหม่ด้วยความยาวเดิม (ลงในคอลัมน์ใหม่) เพื่อรับอัตราส่วนของบรรทัดเดิมที่ตกอยู่ในบัฟเฟอร์ของแต่ละบรรทัดที่อยู่ใกล้เคียง
  8. ตรวจสอบค่าสำหรับอัตราส่วน เก็บสิ่งที่คุณกำหนดไว้ว่า "คล้ายกันมากพอ" ตัวอย่างเช่นบางทีบรรทัดที่อยู่ในบัฟเฟอร์ของอีกบรรทัดหนึ่งสำหรับ 75% ของความยาวของมันนั้นใกล้เคียงกันมากพอคุณอาจจะเห็นด้วยกับข้อตกลง 50% เป็นต้น
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.