Sunday, 25 December 2016

extrapolation - Extrapolating a line in PostGIS


I'm trying to extrapolate from a line segment to find a point on the line but a 3rd of the way 'back', i.e. trying to find point new, given points A and B below:



enter image description here


Given a line, I can interpolate it to get a position at any particular percentage along it:


=# select st_line_interpolate_point(
st_makeline('0101000020E6100000300DC347C49418C03EE8D9ACFAA44A40',
'0101000020E6100000FB743C66A03218C0CDCCCCCCCC7C4A40'),
0.333);
0101000020E6100000ED45B41D537718C069C6A2E9EC984A40

I tried entering a negative number to find a point along the line in the opposite direction, but that fails as the interpolation argument has to be in the range [0, 1]


I thought about first scaling the line, but that doesn't use the centre of the line as the origin, so is useless for my purposes.




Answer



Another way I have solved a similar problem previously is to break it down into the following steps.


-- get the points A and B given a line L
A := ST_STARTPOINT(L);
B := ST_ENDPOINT(L);

-- get the bearing from point B --> A
azimuth := ST_AZIMUTH(B,A);

-- get the length of the line A --> B

length := ST_DISTANCE(A,B);
newlength := length + (length * (1/3)); -- increase the line length by 1/3

-- create a new point 1/3 as far away from A as B is from A
newpoint := ST_TRANSLATE(A, sin(azimuth) * newlength, cos(azimuth) * newlength);

EDIT: fixed the assignment of newlength so that it is 1 1/3 the length, rather than 1/3 and switched A & B around to match diagram.


No comments:

Post a Comment

arcpy - Changing output name when exporting data driven pages to JPG?

Is there a way to save the output JPG, changing the output file name to the page name, instead of page number? I mean changing the script fo...