<div dir="ltr">And here's a SQL function to do it:<div><br></div><div>CREATE OR REPLACE FUNCTION ST_LineLocateN( line geometry, pt geometry )<br>RETURNS integer<br>AS $$<br>    SELECT i FROM (<br>    SELECT i, ST_Distance(<br>        ST_MakeLine( ST_PointN( line, s.i ), ST_PointN( line, s.i+1 ) ),<br>        pt) AS dist<br>      FROM generate_series(1, ST_NumPoints( line )-1) AS s(i)<br>      ORDER BY dist<br>    ) AS t LIMIT 1;<br>$$<br>LANGUAGE sql STABLE STRICT;<br></div><div><br></div><div>Example:</div><div>SELECT ST_LineLocateN( 'LINESTRING (0 0, 10 10, 20 20, 30 30)'::geometry, <br>  'POINT(15 15.1)'::geometry);</div><div>==> 2</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Aug 4, 2020 at 3:56 PM Martin Davis <<a href="mailto:mtnclimb@gmail.com">mtnclimb@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Here's. SQL to do this:<div><br></div><div>WITH data(id, geom) AS (VALUES<br>    ( 1, 'LINESTRING (0 0, 10 10, 20 20, 30 30)'::geometry )<br>)<br>SELECT i FROM (<br>SELECT i, ST_Distance(<br>   ST_MakeLine( ST_PointN( data.geom, s.i ), ST_PointN( data.geom, s.i+1 ) ),<br>   'POINT(15 15.1)'::geometry ) AS dist<br>   FROM data JOIN LATERAL (<br>        SELECT i FROM generate_series(1, ST_NumPoints( data.geom )-1) AS gs(i)<br>     ) AS s(i) ON true<br>   ORDER BY dist<br>) AS t LIMIT 1;<br></div><div><br></div><div>It would be simpler to wrap this up in a function.</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Aug 4, 2020 at 1:43 PM Bruce Rindahl <<a href="mailto:bruce.rindahl@gmail.com" target="_blank">bruce.rindahl@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">I found this post from a few years back by Paul Ramsey:<br><a href="http://blog.cleverelephant.ca/2015/02/breaking-linestring-into-segments.html" target="_blank">http://blog.cleverelephant.ca/2015/02/breaking-linestring-into-segments.html</a> <div>One of the examples gives a collection of each segment of the line along with what you can use as an index.  Could you then query for the closest geometry from that collection and get the index number? <br></div><div>Sorry, I can't test right now as my pgadmin is not working.</div></div>
_______________________________________________<br>
postgis-users mailing list<br>
<a href="mailto:postgis-users@lists.osgeo.org" target="_blank">postgis-users@lists.osgeo.org</a><br>
<a href="https://lists.osgeo.org/mailman/listinfo/postgis-users" rel="noreferrer" target="_blank">https://lists.osgeo.org/mailman/listinfo/postgis-users</a></blockquote></div>
</blockquote></div>