Sự tương đồng giữa hai hoặc nhiều quỹ đạo


11

Tôi có dữ liệu của xe tải ( http://www.chorochronos.org/ ).

Dữ liệu này là tọa độ gps của nhiều quỹ đạo của xe tải ở Athens.

Tôi phải tính toán sự giống nhau giữa các máy bay phản lực, để xóa những thứ rất giống nhau!

Vấn đề:

Đỏ và Xanh tương tự nhau, nhưng xanh dương, đen và (đỏ hoặc xanh lục) là những quỹ đạo khác nhau. Tôi muốn xóa một trong những tương tự, màu đỏ hoặc màu xanh lá cây.

Dữ liệu được tính theo điểm (hình học, lat và long, x và y) (tọa độ gps), hình ảnh là ví dụ về quỹ đạo


1
Điều gì xảy ra nếu màu đỏ và màu xanh lá cây là tương tự nhau, và màu xanh lá cây và màu đen là tương tự nhau, nhưng màu đỏ và màu đen không giống nhau? Ngoài ra, làm thế nào để bạn xác định "tương tự" - đó là một tỷ lệ của dòng nằm trong một khoảng cách của dòng khác, hoặc một số số liệu khác?
phloem

Tôi chỉ muốn ở lại với những quỹ đạo khác với những người khác. Các máy bay phản lực là tọa độ gps, không phải đường dây ...
user2883056

1
Bạn có các thẻ cho postgispostgresql nhưng không đề cập đến trong phần câu hỏi của bạn. Mặc dù việc gắn thẻ rất quan trọng, nhưng nếu bạn đang sử dụng những sản phẩm đó, tôi thực sự khuyên bạn nên ghi lại chúng trong phần câu hỏi của bạn bởi vì, sau khi liếc vào tiêu đề, đây sẽ là phần câu hỏi của bạn thu hút mọi sự chú ý.
PolyGeo

2
Tôi đồng ý với @phloem - câu hỏi chính là "làm thế nào để bạn xác định tương tự"? Tất cả các tuyến đường đi từ AB, vì vậy chúng là 'tương tự' theo nghĩa đó. Bạn cần cung cấp thêm thông tin về cách bạn sẽ đánh giá một kết quả thành công
Stephen Lead

Câu trả lời:


10

Một biện pháp thực sự dễ dàng, nhưng không tuyệt vời là lấy khoảng cách Hausdorff giữa mỗi kết hợp, được thực hiện với hàm ST_HausdorffDistance . Sử dụng LineStrings gần đúng từ hình của bạn, tất cả đều được hiển thị bằng màu xanh lam và khoảng cách Hausdorff được hiển thị cho một trong các cặp dòng màu đỏ:

Khoảng cách Hausdorff

Và truy vấn để sắp xếp 6 kết hợp theo thứ tự giảm dần:

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)

Vì vậy, nó hoạt động tốt trong ví dụ này, nhưng nó không phải là một kỹ thuật tuyệt vời hay mạnh mẽ để phân cụm các dòng, vì chỉ số duy nhất là điểm duy nhất có khoảng cách lớn nhất, thay vì so sánh sự khác biệt của các dòng hoàn chỉnh. Có nhiều phương pháp tốt hơn, nhưng chúng sẽ phức tạp hơn.


Câu trả lời tốt đẹp. Tôi có thể đã sử dụng một cái gì đó như điểm ST_Interpolate và sau đó tính khoảng cách trung bình cho mỗi tập hợp các điểm liên quan như một cách tiếp cận ngây thơ. Bạn đã có những gì trong tâm trí bằng các phương pháp tốt hơn nhiều?
John Powell

1
@ JohnBarça phương pháp tốt hơn sẽ là so sánh số liệu thống kê không gian về phạm vi bảo hiểm của từng dòng. Một phương pháp sẽ rasterise từng dòng, làm mờ Gaussian với raster, sau đó xác định mối tương quan của các giá trị raster trùng khớp từ mỗi kết hợp. Một phương thức dựa trên các công cụ ST_Segmentize và ST_Interpolate cũng sẽ hoạt động.
Mike T

4

Tôi không có quyền truy cập vào PostGres / PostGIS, nhưng đây là cách tôi sẽ thực hiện trong ArcGIS (hoặc khác).

  1. Tính chiều dài của các dòng ban đầu vào một cột tĩnh
  2. Bộ đệm các dòng của bạn theo cách bạn xác định "tương tự". Không hòa tan bộ đệm. Bộ đệm kết quả sẽ có FID bằng với dòng ban đầu.
  3. Giao nhau bộ đệm và dòng gốc. Lớp kết quả sẽ xác định các FID tham gia vào giao lộ cụ thể đó (ví dụ: "FID_lines" và "FID_buff").
  4. Hòa tan lớp từ # 3 bằng hai cột FID ban đầu và cột có độ dài ban đầu
  5. Bỏ qua các dòng kết quả có cùng giá trị cho hai cột FID ban đầu bằng cách sử dụng truy vấn định nghĩa hoặc các phương tiện khác (tất nhiên một dòng được đệm và xen kẽ với bộ đệm của chính nó sẽ chồng lấp hoàn toàn).
  6. Thêm một cột số và điền vào nó với độ dài mới
  7. Chia chiều dài mới với độ dài ban đầu (thành một cột mới) để có tỷ lệ của dòng ban đầu rơi vào bộ đệm của mỗi dòng gần đó.
  8. Kiểm tra các giá trị cho tỷ lệ. Giữ những cái mà bạn đã xác định là "đủ tương tự". Ví dụ, có lẽ một dòng nằm trong bộ đệm của một dòng khác với 75% chiều dài của nó là đủ tương tự, có lẽ mức cắt của bạn là thỏa thuận 50%, v.v.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.