So I have a database of pipes that is visually coded in qgis. My goal is to add a trigger to PGAdmin4 v5 that uses ST_StartPoint() and ST_EndPoint() to get the end points of the polyline (the pipe) as it is being entered. Then, I was going use this geometry to grab the nearest structure (a point) and autocomplete two columns with corresponding data. I have working code that gets me the endpoints of existing pipes and finds the nearest structures, but I want to use the newly created lines (the pipes) to complete the form automatically as it is being entered into the database.
Working Code:
SELECT p.id,
dump_line.geom,
st_endpoint(dump_line.geom) AS downstream,
j.geom_closest_downstream,
st_startpoint(dump_line.geom) AS upstream,
i.geom_closest_upstream
FROM sewers.pipes p,
LATERAL st_dump(st_setsrid(p.geom, 2965)) dump_line(path, geom),
LATERAL ( SELECT s.geom
FROM sewers.structures s
ORDER BY (st_endpoint(dump_line.geom) <-> s.geom)
LIMIT 1) j(geom_closest_downstream),
LATERAL ( SELECT s.geom
FROM sewers.structures s
ORDER BY (st_startpoint(dump_line.geom) <-> s.geom)
LIMIT 1) i(geom_closest_upstream);
I need to figure out how to get data from an update (adding an entry to qgis) and use its geometry instead of the geometry of existing pipes.
Just put this query into a function ..
CREATE OR REPLACE FUNCTION insert_pipe() RETURNS TRIGGER AS $$
BEGIN
SELECT
j.geom_closest_downstream,
i.geom_closest_upstream
INTO NEW.geom_closest_downstream, NEW.geom_closest_upstream
FROM ST_Dump(NEW.geom) dump_line,
LATERAL (SELECT s.geom
FROM structures s
ORDER BY ST_EndPoint((dump_line).geom)<->s.geom
LIMIT 1) j (geom_closest_downstream),
LATERAL (SELECT s.geom
FROM structures s
ORDER BY ST_StartPoint((dump_line).geom)<->s.geom
LIMIT 1) i (geom_closest_upstream);
RETURN NEW;
END; $$ LANGUAGE plpgsql;
And attach a trigger to it, e.g. a BEFORE INSERT OR UPDATE
trigger:
CREATE TRIGGER t_insert_pipe
BEFORE INSERT OR UPDATE ON pipes FOR EACH ROW EXECUTE PROCEDURE insert_pipe();
This demo might give you some hints: db<>fiddle