Comment extraire une sous-ligne d'une ligne avec des segments qui se chevauchent

15

Énoncé du problème: étant donné un itinéraire de bus (défini comme une ligne de ligne dans le_leom) et un ensemble d'emplacements d'arrêts de bus (pt1.the_geom, pt2.the_geom, ... ptn.the_geom), divisez l'itinéraire de bus en segments entre les arrêts de bus . J'utilise deux fonctions 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))

Ce qui précède fonctionne bien si l'itinéraire de bus n'a pas de sections qui se chevauchent. Cependant, s'il y a des sections qui se chevauchent, le ST_line_locate_point accrochera un point à l'autre extrémité de la chaîne de lignes. À titre d'exemple: le bus se déplace de A à B, fait une boucle, puis se déplace de B à A. «A à B» et «B à A» sont des itinéraires parallèles avec tous les points se chevauchant. En cas d'arrêts de bus P1 et P2, P2 est mappé au point P2 'à la place (dans la direction opposée). Le segment est extrait à tort dans ce cas (où des segments supplémentaires sont inclus).

Comment résoudre des problèmes comme celui-ci? Les itinéraires de bus qui se chevauchent peuvent se produire à n'importe quelle section de l'itinéraire ... EXEMPLE

user35469
la source
Y a-t-il un moyen pour vous d'identifier les terminaisons de vos lignes de bus et de diviser la ligne fermée en une ligne dans les deux sens? Ensuite, vous n'aurez plus de segments qui se chevauchent. Par exemple, vous pouvez trouver le point le plus éloigné de la ligne depuis le début et séparer votre ligne en deux directions à l'aide de ce point.
raphael
3
Ancienne question, mais il semble que vous ayez besoin de démarrer et d'enpoint des sections, de vous joindre au jeu de données de points et de supprimer toute section avec un ordre de point initial plus grand que le point final. Est-ce que cela a un sens?
Jorge Sanz
1
Voulez-vous s'il vous plaît fournir la géométrie WKT pour l'itinéraire de bus donné?
kttii

Réponses:

1

En supposant que l'itinéraire de bus ne se chevauche pas plus de 2 fois à un point donné, cela pourrait être résolu en inversant la ligne pour le deuxième point de localisation de ligne, en localisant le point le plus proche le plus proche de la fin de la ligne. Vous devrez soustraire cela de 1 pour l'utiliser dans la requête ST_LineSubstring. Par exemple

ST_LineSubstring(ln.the_geom,
  ST_LineLocatePoint(ln.the_geom, pt1.the_geom),
  1 - ST_LineLocatePoint(ST_Reverse(ln.the_geom), pt2.the_geom))
Nathan Lawrence
la source