2017-09-27 24 views
6

Ich habe diese Frage auf gis.stackexchange gestellt (aber da mein aktuelles Problem eher ein DB-Problem als GIS zu sein scheint, versuche ich hier mein Glück). Hier ist die Frage, auf gis.stackexchange: https://gis.stackexchange.com/questions/256535/postgis-2-3-splitting-multiline-by-pointsPostGIS 2.3 Eine Zeile nach Punkten aufteilen

Ich habe einen Trigger, in dem ich ein Looping, wenn eine neue Zeile Einfügen des Satzes von gespaltet Linien in meiner Tabelle einfügen, aber aus irgendeinem Grund, den ich habe nicht das gewünschte Ergebnis denn im Beispiel bekomme ich nur zwei von drei Zeilen. Was mache ich falsch?

Hier kommt der Code der Trigger-Funktion:

CREATE OR REPLACE FUNCTION public.split_cable() 
     RETURNS trigger AS 
    $BODY$ 
    DECLARE compte integer; 
    DECLARE i integer := 2; 
    BEGIN 
    compte = (SELECT count(*) FROM boite WHERE st_intersects(boite.geom, new.geom)); 

    WHILE i < compte LOOP 
     WITH brs AS (SELECT row_number() over(), boite.geom FROM boite, cable2 
      WHERE st_intersects(boite.geom, new.geom) 
    -- here the ORDER BY serve to get the "boite" objects in a specific order 
      ORDER BY st_linelocatepoint(st_linemerge(new.geom),boite.geom)), 
      brs2 AS (SELECT st_union(geom) AS geom FROM brs), 
      cables AS (SELECT (st_dump(st_split(new.geom, brs2.geom))).geom FROM brs2) 
     INSERT INTO cable2 (geom) VALUES (
     SELECT st_multi(cables.geom) FROM cables WHERE st_startpoint(geom) = (SELECT geom FROM brs WHERE brs.row_number = i)); 
     i = i + 1; 
    END LOOP; 

    new.geom = (WITH brs AS (SELECT row_number() over(), boite.geom FROM boite, cable2 
      WHERE st_intersects(boite.geom, new.geom) 
      ORDER BY st_linelocatepoint(st_linemerge(new.geom),boite.geom)), 
      brs2 AS (SELECT st_union(geom) as geom from brs), 
      cables AS (SELECT (st_dump(st_split(new.geom, brs2.geom))).geom FROM brs2) 
      SELECT st_multi(cables.geom) FROM cables WHERE st_startpoint(geom) = (SELECT geom FROM brs WHERE brs.row_number = 1)); 
    RETURN new; 
    END 
    $BODY$ 
     LANGUAGE plpgsql; 
+0

was ist der anfängliche Wert von 'compte' in Ihrem Beispiel? – MiguelKVidal

+0

@MiguelKVidal es kann jeder, aber immer mindestens 2. Für ein Beispiel sagen wir, es ist 3, mit anderen Worten ist es ein Fall, in dem ich mit der Aufteilung in zwei Zeilen der Anfangszeile enden sollte. –

+0

Versuchen Sie, den Wert Ihres 'compte' (vor dem' while') und Ihren 'SELECT' auszugeben, bevor Sie die neuen Werte einfügen. Es wird viel helfen, besser zu verstehen, was passiert. – MiguelKVidal

Antwort

0

Dies ist eine relativ komplexe Abfrage ist und viele bewegliche Teile. meine Empfehlung die Abfrage für das Debuggen umfasst mehrere Ideen:

  1. Betrachten Sie die Funktion in kleinere Funktionen aufgeteilt, die leichter zu testen sind, und dann bilden die Funktion aus einer Menge von Teilen Sie als sicher Arbeit wissen Du brauchst sie.

  2. exportieren Sie eine Reihe von Zwischenergebnissen in eine Zwischentabelle, Sie können die Zwischenergebnissätze einfach mit einem grafischen Werkzeug visualisieren und besser abschätzen, wo die Daten falsch gelaufen sind.

  3. ist möglich, dass die Kombination von ST_ Funktionen Sie die Geometrien nicht erstellen verwenden Sie Sie denken sie schaffen, ein Weg, dies zu entscheiden, indem sie die Ergebnisse der geografischen Funktion Kombinationen Visualisierung ist aus, wie st_dump (st_split (...))) oder st_dump (st_split (...)) zum Beispiel.

  4. vielleicht diese Überprüfung: st_startpoint (geom) = (SELECT geom VON brs WHERE brs.row_number = i)) könnte durch die Prüfung "Punkte in der Nähe" und nicht "exakter Punkt" gemacht werden, vielleicht sind die Punkte sehr nahe, wie in Zentimetern nahe, machen sie im Wesentlichen "den gleichen Punkt", aber nicht wirklich der genaue Punkt. Dies ist jedoch nur eine Annahme.

  5. Sie können mehr Daten mit StackOverflow teilen! wie ein kleiner Datensatz oder Beispiel, so können wir tatsächlich den Code ausführen! :)

Verwandte Themen