Çakışan segmentlere sahip bir linestring'den alt çizgi nasıl çıkarılır


15

Sorun bildirimi: Bir otobüs yolu (ln.the_geom linestring olarak tanımlanır) ve bir dizi otobüs durağı konumu (pt1.the_geom, pt2.the_geom, ... ptn.the_geom) olarak tanımlandığında, otobüs yolunu otobüs durakları arasında bölümlere ayırın . İki postgis işlevi kullanıyorum

    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))

Otobüs güzergahında üst üste binen bölüm yoksa yukarıdakiler işe yarar. Ancak, çakışan bölümler varsa, ST_line_locate_point, linestring'in diğer ucuna bir nokta ekleyecektir. Örnek olarak: Otobüs A'dan B'ye gider, bir döngü oluşturur, sonra B'den A'ya gider. "A'dan B'ye" ve "B'den A'ya", tüm noktaları üst üste binen paralel rotalardır. Otobüs durakları P1 ve P2 durumunda, P2 bunun yerine P2 'noktasına (ters yönde) eşlenir. Bu durumda segment yanlış çıkarılır (fazladan segmentlerin dahil edildiği yerlerde).

Böyle problemler nasıl çözülür? Üst üste binen otobüs güzergahları, güzergahın herhangi bir bölümünde olabilir ... MİSAL


Otobüs güzergahlarınızın terminallerini belirlemenin ve kapalı çizgileri her iki yönde bir çizgiye bölmenin bir yolu var mı? O zaman artık çakışan segmentlere sahip olmayacaksınız. Örneğin, çizgideki en uzak noktayı en baştan bulabilir ve çizginizi bu noktayı kullanarak iki yöne ayırabilirsiniz.
raphael

3
Eski soru ancak, bölümlerin başlangıcını ve noktasını almanız, nokta veri kümesine katılmanız ve başlangıç ​​noktası bitiş noktasından daha büyük olan herhangi bir bölümü kaldırmanız gerekiyor gibi görünüyor. Bu bir anlam ifade ediyor mu?
Jorge Sanz

1
Lütfen verilen otobüs güzergahı için WKT geometrisini sağlayacak mısınız?
kttii

Yanıtlar:


1

Otobüs güzergahının herhangi bir noktada 2 kereden fazla örtüşmediğini varsayarsak, bu, ikinci satır tespit noktası için hattın tersine çevrilmesi ve hattın sonuna en yakın noktanın bulunmasıyla çözülebilir. ST_LineSubstring sorgusunda kullanmak için bunu 1'den çıkarmanız gerekir. Örneğin

ST_LineSubstring(ln.the_geom,
  ST_LineLocatePoint(ln.the_geom, pt1.the_geom),
  1 - ST_LineLocatePoint(ST_Reverse(ln.the_geom), pt2.the_geom))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.