# How to add vertices to existing linestrings?

If I have

``````Linestring(1 2, 1 5, 1 9)
``````

and a

``````Point(1 3)
``````

Is there any function that can merge linestring and point preserving the order so output would be:

``````Linestring(1 2, 1 3, 1 5, 1 9)
``````
• So you'll just be adding vertices to existing lines?
– R.K.
Nov 8, 2012 at 14:22
• yes, add vertice to existing linestring, resulting in a linestring. Nov 8, 2012 at 15:18
• Why do you need to do it btw?
– R.K.
Nov 8, 2012 at 15:22

If the LineString is simply to be subdivided at a position closest to the given Point, you could do what you want with this (splits LineString at closest Point to given Point and remerges the two segements afterwards)

``````SELECT ST_AsText(
ST_LineMerge(
ST_Union(
ST_Line_Substring(line, 0, ST_Line_Locate_Point(line, point)),
ST_Line_Substring(line, ST_Line_Locate_Point(line, point), 1)
)))
FROM  ST_GeomFromText('Linestring(1 2, 1 5, 1 9)') as line,
ST_GeomFromText('Point(1 3)') as point;
``````

However, if your Point is not supposed to be projected on the LineString, this will not work.

Do this using `ST_Snap`:

``````SELECT ST_AsText( ST_Snap(
'Linestring(1 2, 1 5, 1 9)',
'Point(1 3)',
0.1
));
``````
``````          st_astext
-----------------------------
LINESTRING(1 2,1 3,1 5,1 9)
``````
• Works like a charm, also for MultiPoints and MultiLinestrings. Mar 27, 2021 at 6:25
• Thank you for the tip. I ended up using ST_Snap with ST_LineInterpolatePoints: `ST_Snap(border, ST_LineInterpolatePoints(border, LEAST(20/ST_Length(border),1), true),0.001) border`. This way I can add regularly spaced new points on a line.
– loop
Feb 1, 2022 at 16:14

PostGIS has ST_AddPoint that should allow you to do this though you'd have to specify where to add the point.

ST_AddPoint — Adds a point to a LineString before point (0-based index).

Examples:

``````--guarantee all linestrings in a table are closed
--by adding the start point of each linestring to the end of the line string
--only for those that are not closed
UPDATE sometable