<div dir="ltr">Hi Birgit, thank you so much!! your code put me on the right track. I'm still tweaking it a bit since your code assumes only 1 line is attached to the endpoint. However, the endpoint of one line could break into 2 new starpoints.<div>thanks,</div><div>jon</div></div><br><div class="gmail_quote"><div dir="ltr">On Tue, Sep 20, 2016 at 5:38 AM Birgit Laggner <<a href="mailto:birgit.laggner@thuenen.de">birgit.laggner@thuenen.de</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div bgcolor="#FFFFFF" text="#000000">
Hi Jonatan,<br>
<br>
based on the anonymous code block Leknín came up with, I tried to
adapt it to your problem:<br>
<br>
DO $$<br>
DECLARE c_line record; c_gid integer; c_geom geometry; line record;
gid integer; geom geometry; i integer; n integer;<br>
BEGIN<br>
<br>
EXECUTE 'SELECT count(*) FROM electric_line' INTO n;<br>
<br>
--initialize start<br>
EXECUTE 'SELECT gid, geom FROM electric_line WHERE gid = 3312' INTO
c_line;<br>
<br>
c_gid := c_line.gid;<br>
c_geom := c_line.geom;<br>
i := 1;<br>
<br>
-- loop through lines following the flow direction<br>
LOOP<br>
EXECUTE 'SELECT gid, geom FROM electric_line<br>
WHERE
ST_DWithin(ST_EndPoint($1,ST_StartPoint(geom),0.01) OR<br>
ST_DWithin(ST_EndPoint($1),ST_EndPoint(geom),0.01)' INTO line USING
c_geom;<br>
<br>
gid := line.gid;<br>
geom := line.geom;<br>
<br>
--compare end point parent line with start point child line and
reverse line if necessary<br>
IF NOT ST_DWithin(ST_EndPoint(c_geom),
ST_StartPoint(geom),0.01) THEN<br>
EXECUTE<br>
'UPDATE electric_line SET geom = ST_Reverse(geom)
WHERE gid = '||line.gid;<br>
END IF;<br>
<br>
--take child line as parent line for next loop<br>
c_gid := gid;<br>
c_geom := geom;<br>
i := i + 1;<br>
<br>
EXIT WHEN i = n;<br>
<br>
END LOOP;<br>
<br>
END $$;<br>
<br>
<br>
Basically, you would start with your starting point for the flow.
Then you search for the next matching line and check if the
direction is ok. Otherwise you reverse the line. Then you go into
your next search loop and so on. The loop should exit when all lines
have been through the loop. I couldn't test the code but hope you
get the idea at least.<br>
<br>
Regards,<br>
<br>
Birgit</div><div bgcolor="#FFFFFF" text="#000000"><br>
<br>
<br>
<pre cols="72">
</pre>
<div>Am 14.09.2016 um 17:13 schrieb Jonatan
Malaver:<br>
</div>
<blockquote type="cite">
<div dir="ltr">Hello again, I do not have parent line id. All I
have is a starting point from where the direction should
reference.</div>
<br>
<div class="gmail_quote">
<div dir="ltr">On Wed, Sep 14, 2016 at 9:09 AM Leknín Řepánek
<<a href="mailto:godzilalalala@gmail.com" target="_blank">godzilalalala@gmail.com</a>>
wrote:<br>
</div>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Wed, Sep
14, 2016 at 12:09:23PM +0000, Jonatan Malaver wrote:<br>
> the reason being is that I do a network analysis by
running the following<br>
> function:<br>
> WITH RECURSIVE flow(gid, geom) AS (<br>
> SELECT e.gid, e.geom FROM electric_line e,
transformers t WHERE ST_Distance<br>
> (t.geom,ST_StartPoint(e.geom)) <= 0.01 AND t.gid=$1<br>
> UNION ALL<br>
> SELECT n.gid, n.geom<br>
> FROM electric_line n, flow f<br>
> WHERE
ST_Distance(ST_EndPoint(f.geom),ST_StartPoint(n.geom)) <=
0.01<br>
> )<br>
> The problem I have is that some of the lines direction
are in reversed. I'm<br>
> trying to correct them with referenced to the first line.
Otherwise, I will end<br>
> up changing hundreds of lines manually.<br>
Manually? No. There are many of possible ways how do this by
query. For<br>
example if you have in every line id of "parent line" you can
use<br>
anonymous block of code by something like this.<br>
DO $$<br>
DECLARE line record;<br>
BEGIN<br>
FOR line in SELECT lines from lines ORDER BY id LOOP<br>
IF NOT ST_Equal(ST_startpoint(line.geom) , (SELECT<br>
ST_EndPoint(geom) FROM lines WHERE id =
line.parent_line_id))<br>
THEN<br>
UPDATE lines SET geom = ST_Reverse(geom) WHERE
id =<br>
<a href="http://line.id" rel="noreferrer" target="_blank">line.id</a>;<br>
<br>
END LOOP;<br>
<br>
END<br>
<br>
$$;<br>
<br>
<br>
><br>
> On Tue, Sep 13, 2016 at 11:12 AM James Keener <<a href="mailto:jim@jimkeener.com" target="_blank"><a href="mailto:jim@jimkeener.com" target="_blank">jim@jimkeener.com</a></a>> wrote:<br>
><br>
> Depends on what you mean by direction. If you want to
grab the start and<br>
> end points (st_startpoint and st_endpoint) and check
their x and y (st_x<br>
> and st_y) for some condition (both less at the end?)
Then update the record<br>
> with the value of st_reverse.<br>
><br>
> I guess my other question is why it matters.<br>
><br>
> Jim<br>
><br>
> On September 13, 2016 8:31:07 AM EDT, Jonatan Malaver
<<br>
> <a href="mailto:jon.malaver@shrewsburyma.gov" target="_blank">jon.malaver@shrewsburyma.gov</a>>
wrote:<br>
><br>
> Hello,<br>
><br>
> I'm trying to come up with a query that would
check the direction of<br>
> a line. If the end point is not the start point
of the next line to<br>
> update the line by reversing that line. Can
anyone give me pointers on<br>
> how to do it?<br>
><br>
> Thanks,<br>
> Jon<br>
><br>
><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="http://lists.osgeo.org/mailman/listinfo/postgis-users" rel="noreferrer" target="_blank">http://lists.osgeo.org/mailman/listinfo/postgis-users</a><br>
><br>
><br>
> --<br>
> Sent from my Android device with K-9 Mail. Please
excuse my brevity.<br>
><br>
> --<br>
><br>
> Thanks,<br>
><br>
><br>
> Jonatan Malaver<br>
><br>
> Assistant Engineer of Electrical and Cable Operations<br>
><br>
> Shrewsbury Electric & Cable Operations<br>
><br>
> 100 Maple Avenue<br>
><br>
> Shrewsbury, MA 01545<br>
><br>
> Office: (508) 841-8610<br>
><br>
> Fax: (508) 842-9267<br>
><br>
> <a href="mailto:jon.malaver@shrewsburyma.gov" target="_blank">jon.malaver@shrewsburyma.gov</a><br>
><br>
<br>
> _______________________________________________<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="http://lists.osgeo.org/mailman/listinfo/postgis-users" rel="noreferrer" target="_blank">http://lists.osgeo.org/mailman/listinfo/postgis-users</a><br>
<br>
_______________________________________________<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="http://lists.osgeo.org/mailman/listinfo/postgis-users" rel="noreferrer" target="_blank">http://lists.osgeo.org/mailman/listinfo/postgis-users</a></blockquote>
</div>
<br>
<fieldset></fieldset>
<br>
<pre>_______________________________________________
postgis-users mailing list
<a href="mailto:postgis-users@lists.osgeo.org" target="_blank">postgis-users@lists.osgeo.org</a>
<a href="http://lists.osgeo.org/mailman/listinfo/postgis-users" target="_blank">http://lists.osgeo.org/mailman/listinfo/postgis-users</a></pre>
</blockquote>
<br>
</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="http://lists.osgeo.org/mailman/listinfo/postgis-users" rel="noreferrer" target="_blank">http://lists.osgeo.org/mailman/listinfo/postgis-users</a></blockquote></div>