Làm cách nào để trích xuất sublinestring từ một linestring với các phân đoạn chồng chéo


15

Báo cáo sự cố: Đưa ra một tuyến xe buýt (được định nghĩa là ln.the_geom) và một tập hợp các vị trí dừng xe buýt (pt1.the_geom, pt2.the_geom, ... ptn.the_geom), chia tuyến xe buýt thành các đoạn giữa các điểm dừng xe buýt . Tôi đang sử dụng hai chức năng postgis

    ST_line_substring(ln.the_geom,ST_line_locate_point
    ln.the_geom,pt1.the_geom),ST_line_locate_point(ln.the_geom,pt2.the_geom))

Ở trên hoạt động tốt nếu tuyến xe buýt không có phần chồng chéo. Tuy nhiên, nếu có các phần chồng chéo, ST_line_locate_point sẽ chụp một điểm vào đầu kia của dòng. Ví dụ: Xe buýt đi từ A đến B, tạo một vòng lặp, sau đó đi từ B đến A. "A đến B" và "B đến A" là các tuyến song song với tất cả các điểm chồng chéo. Trong trường hợp xe buýt dừng P1 và P2, P2 được ánh xạ vào điểm P2 '(theo hướng ngược lại). Phân đoạn được trích xuất sai trong trường hợp này (trong đó bao gồm các phân đoạn bổ sung).

Làm thế nào để giải quyết vấn đề như thế này? Các tuyến xe buýt chồng chéo có thể xảy ra tại bất kỳ phần nào của tuyến đường ... THÍ DỤ


Có cách nào để bạn xác định termini của các tuyến xe buýt của bạn và chia linestring kín thành một dòng theo một trong hai hướng không? Sau đó, bạn sẽ không có các phân đoạn chồng chéo nữa. Ví dụ: bạn có thể tìm thấy điểm xa nhất trên dòng từ đầu và tách dòng của bạn thành hai hướng bằng cách sử dụng điểm đó.
raphael

3
Câu hỏi cũ nhưng, có vẻ như bạn cần bắt đầu và điểm ra các phần, tham gia với bộ dữ liệu điểm và xóa bất kỳ phần nào có thứ tự điểm ban đầu lớn hơn điểm cuối. Điều này có ý nghĩa gì không?
Jorge Sanz

1
Bạn sẽ vui lòng cung cấp WKT hình học cho tuyến xe buýt nhất định chứ?
kttii

Câu trả lời:


1

Giả sử rằng tuyến xe buýt tự trùng nhau không quá 2 lần tại bất kỳ điểm nào, thì điều này có thể được giải quyết bằng cách đảo ngược đường cho điểm định vị tuyến thứ hai, xác định vị trí gần điểm cuối gần nhất của điểm. Bạn sẽ cần phải trừ đi số này từ 1 để sử dụng trong truy vấn ST_LineSub chuỗi. Ví dụ

ST_LineSubstring(ln.the_geom,
  ST_LineLocatePoint(ln.the_geom, pt1.the_geom),
  1 - ST_LineLocatePoint(ST_Reverse(ln.the_geom), pt2.the_geom))
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.