# How to extend a straight line in postgis?

I have a postgis table of simple linestrings, each one is a straight line with just two points. I want to select every linestring, but extended from both sides by 1 meter. So i have lines, that are longer by 2 meters. How can this be done?

I seems very similar to post "postgis, extrapolate a line". If I avoid repetition of cited post, I think you just need to extrapolate beyond your extreme points. In a query you get something like this should work:

``````SELECT ST_MakeLine(ST_TRANSLATE(a, sin(az1) * len, cos(az1) *
len),ST_TRANSLATE(b,sin(az2) * len, cos(az2) * len))

FROM (
SELECT a, b, ST_Azimuth(a,b) AS az1, ST_Azimuth(b, a) AS az2, ST_Distance(a,b) + 1 AS len
FROM (
SELECT ST_StartPoint(the_geom) AS a, ST_EndPoint(the_geom) AS b
FROM ST_MakeLine(ST_MakePoint(1,2), ST_MakePoint(3,4)) AS the_geom
) AS sub
) AS sub2
``````

Be careful: this method swaps points `a` and `b` in the end.

Use

``````SELECT ST_MakeLine(ST_TRANSLATE(a, sin(az2) * len, cos(az2) *
len),ST_TRANSLATE(b,sin(az1) * len, cos(az1) * len))

FROM (
SELECT a, b, ST_Azimuth(a,b) AS az1, ST_Azimuth(b, a) AS az2, 1 AS len
FROM (
SELECT ST_StartPoint(the_geom) AS a, ST_EndPoint(the_geom) AS b
FROM ST_MakeLine(ST_MakePoint(1,2), ST_MakePoint(3,4)) AS the_geom
) AS sub
) AS sub2
``````

to have `a` and `b` not swapped.

• I don't think this is correct. The original answer did have the endpoints swapped, but the fix is to interchange the `ST_Translate` expressions. Aug 6, 2022 at 18:59
• Interchange the `ST_Translate` expressions works as well. In my proposed version I removed the `ST_Distance` from the `len` and switched `az1` and `az2`, that's why it works, or have I missed something? Aug 8, 2022 at 7:40
• Agreed, your version is equivalent, and simpler in some ways. Aug 9, 2022 at 2:38