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;
was ist der anfängliche Wert von 'compte' in Ihrem Beispiel? – MiguelKVidal
@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. –
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