[postgis-users] help with a query
Jonatan Malaver
jon.malaver at shrewsburyma.gov
Mon Sep 26 05:24:49 PDT 2016
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.
thanks,
jon
On Tue, Sep 20, 2016 at 5:38 AM Birgit Laggner <birgit.laggner at thuenen.de>
wrote:
> Hi Jonatan,
>
> based on the anonymous code block Leknín came up with, I tried to adapt it
> to your problem:
>
> DO $$
> DECLARE c_line record; c_gid integer; c_geom geometry; line record; gid
> integer; geom geometry; i integer; n integer;
> BEGIN
>
> EXECUTE 'SELECT count(*) FROM electric_line' INTO n;
>
> --initialize start
> EXECUTE 'SELECT gid, geom FROM electric_line WHERE gid = 3312' INTO c_line;
>
> c_gid := c_line.gid;
> c_geom := c_line.geom;
> i := 1;
>
> -- loop through lines following the flow direction
> LOOP
> EXECUTE 'SELECT gid, geom FROM electric_line
> WHERE ST_DWithin(ST_EndPoint($1,ST_StartPoint(geom),0.01) OR
> ST_DWithin(ST_EndPoint($1),ST_EndPoint(geom),0.01)'
> INTO line USING c_geom;
>
> gid := line.gid;
> geom := line.geom;
>
> --compare end point parent line with start point child line and
> reverse line if necessary
> IF NOT ST_DWithin(ST_EndPoint(c_geom), ST_StartPoint(geom),0.01)
> THEN
> EXECUTE
> 'UPDATE electric_line SET geom = ST_Reverse(geom) WHERE
> gid = '||line.gid;
> END IF;
>
> --take child line as parent line for next loop
> c_gid := gid;
> c_geom := geom;
> i := i + 1;
>
> EXIT WHEN i = n;
>
> END LOOP;
>
> END $$;
>
>
> 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.
>
> Regards,
>
> Birgit
>
>
>
> Am 14.09.2016 um 17:13 schrieb Jonatan Malaver:
>
> Hello again, I do not have parent line id. All I have is a starting point
> from where the direction should reference.
>
> On Wed, Sep 14, 2016 at 9:09 AM Leknín Řepánek <godzilalalala at gmail.com>
> wrote:
>
>> On Wed, Sep 14, 2016 at 12:09:23PM +0000, Jonatan Malaver wrote:
>> > the reason being is that I do a network analysis by running the
>> following
>> > function:
>> > WITH RECURSIVE flow(gid, geom) AS (
>> > SELECT e.gid, e.geom FROM electric_line e, transformers t WHERE
>> ST_Distance
>> > (t.geom,ST_StartPoint(e.geom)) <= 0.01 AND t.gid=$1
>> > UNION ALL
>> > SELECT n.gid, n.geom
>> > FROM electric_line n, flow f
>> > WHERE ST_Distance(ST_EndPoint(f.geom),ST_StartPoint(n.geom)) <= 0.01
>> > )
>> > The problem I have is that some of the lines direction are in reversed.
>> I'm
>> > trying to correct them with referenced to the first line. Otherwise, I
>> will end
>> > up changing hundreds of lines manually.
>> Manually? No. There are many of possible ways how do this by query. For
>> example if you have in every line id of "parent line" you can use
>> anonymous block of code by something like this.
>> DO $$
>> DECLARE line record;
>> BEGIN
>> FOR line in SELECT lines from lines ORDER BY id LOOP
>> IF NOT ST_Equal(ST_startpoint(line.geom) , (SELECT
>> ST_EndPoint(geom) FROM lines WHERE id = line.parent_line_id))
>> THEN
>> UPDATE lines SET geom = ST_Reverse(geom) WHERE id =
>> line.id;
>>
>> END LOOP;
>>
>> END
>>
>> $$;
>>
>>
>> >
>> > On Tue, Sep 13, 2016 at 11:12 AM James Keener <jim at jimkeener.com>
>> wrote:
>> >
>> > Depends on what you mean by direction. If you want to grab the
>> start and
>> > end points (st_startpoint and st_endpoint) and check their x and y
>> (st_x
>> > and st_y) for some condition (both less at the end?) Then update
>> the record
>> > with the value of st_reverse.
>> >
>> > I guess my other question is why it matters.
>> >
>> > Jim
>> >
>> > On September 13, 2016 8:31:07 AM EDT, Jonatan Malaver <
>> > jon.malaver at shrewsburyma.gov> wrote:
>> >
>> > Hello,
>> >
>> > I'm trying to come up with a query that would check the
>> direction of
>> > a line. If the end point is not the start point of the next
>> line to
>> > update the line by reversing that line. Can anyone give me
>> pointers on
>> > how to do it?
>> >
>> > Thanks,
>> > Jon
>> >
>> >
>> > postgis-users mailing list
>> > postgis-users at lists.osgeo.org
>> > http://lists.osgeo.org/mailman/listinfo/postgis-users
>> >
>> >
>> > --
>> > Sent from my Android device with K-9 Mail. Please excuse my brevity.
>> >
>> > --
>> >
>> > Thanks,
>> >
>> >
>> > Jonatan Malaver
>> >
>> > Assistant Engineer of Electrical and Cable Operations
>> >
>> > Shrewsbury Electric & Cable Operations
>> >
>> > 100 Maple Avenue
>> >
>> > Shrewsbury, MA 01545
>> >
>> > Office: (508) 841-8610
>> >
>> > Fax: (508) 842-9267
>> >
>> > jon.malaver at shrewsburyma.gov
>> >
>>
>> > _______________________________________________
>> > postgis-users mailing list
>> > postgis-users at lists.osgeo.org
>> > http://lists.osgeo.org/mailman/listinfo/postgis-users
>>
>> _______________________________________________
>> postgis-users mailing list
>> postgis-users at lists.osgeo.org
>> http://lists.osgeo.org/mailman/listinfo/postgis-users
>
>
>
> _______________________________________________
> postgis-users mailing listpostgis-users at lists.osgeo.orghttp://lists.osgeo.org/mailman/listinfo/postgis-users
>
>
> _______________________________________________
> postgis-users mailing list
> postgis-users at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/postgis-users
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/postgis-users/attachments/20160926/323f8e36/attachment.html>
More information about the postgis-users
mailing list