Linear Referencing: Seite feststellen

Hallo Forumsbewohner!

Ich habe eine Liniengeometrie mit Stationierung und möchte feststellen auf welcher Seite der Linie ein Punkt liegt. Problem: Die Linie ist gewunden (Flußachse) also lässt sich das nicht trivial über Koordinatenvergleiche lösen.
Wenn ich entlang der Linie einen Punkt mit ST_LocateAlong konstruiere, kann ich ein positives oder negatives Offset angeben, so das der Punkt rechts oder links erzeugt wird. Also ist die Möglichkeit, die Orientierung einer Linie festzustellen vorhanden. Ich bräuchte sozusagen die Umkehrfunktion dazu, die mir den Offset mit Vorzeichen ausgibt.
ST_Distance gibt nur der Absolutwert des Abstands, über ein wüstes Gebastel liese sich der Rest mehr oder weniger elegant herleiten, was ich aber gern vermeiden würde.
Hat das Problem schon mal wer auf diese oder andere Weise gelöst?

Viele Grüße
Uwe

Hallo nochmal!

Ich habe mir die offset-Funktionalität von st_locatealong zunutze gemacht und folgende kleine Funktion geschrieben:

CREATE OR REPLACE FUNCTION st_determine_side(line geometry, point geometry)
  RETURNS integer AS
$BODY$

  DECLARE
    dist numeric := st_distance(line, point);
    m numeric := st_interpolatepoint(line, point);
    
  BEGIN
    if st_distance(point, st_locatealong(line, m, dist)) > dist then
      return -1;
    else
      return 1;
    end if;
  END;

  $BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

Es wird zuerst der absolute Abstand des Punktes von der Linie und der measure-Wert (dist, m) an der Stelle bestimmt. Danach wird mit locatealong ein Punkt im offset dist generiert und der Abstand zum Ausgangspunkt bestimmt. Wenn dieser Abstand grösser ist als der Urabstand dist liegt der Punkt auf der rechten Seite der Linie, die Funktion ergibt analog zu st_locatealong -1. Wenn der Abstand kleiner ist als dist liegt der Punkt aufder linken, positive Seite, es wird 1 zurückgegeben.


Gruß Uwe