CREATE TABLE linestring_test (line ST_LineString); -- Create a U-shaped linestring: INSERT INTO linestring_test VALUES ( ST_LineFromText('linestring z (0 10 1, 0 0 3, 10 0 5, 10 10 7)', 0) ); -- Perpendicular point is coincident with the input point, -- on the base of the U: SELECT SE_PerpendicularPoint(line, ST_PointFromText('point(5 0)', 0)) FROM linestring_test; -- Perpendicular points are located on all three segments of the U: SELECT SE_PerpendicularPoint(line, ST_PointFromText('point(5 5)', 0)) FROM linestring_test; -- Perpendicular points are located at the endpoints of the U: SELECT SE_PerpendicularPoint(line, ST_PointFromText('point(5 10)', 0)) FROM linestring_test; -- Perpendicular point is on the base of the U: SELECT SE_PerpendicularPoint(line, ST_PointFromText('point(5 15)', 0)) FROM linestring_test; -- No perpendicular point can be constructed: SELECT SE_PerpendicularPoint(line, ST_PointFromText('point(15 15)', 0)) FROM linestring_test;