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 <godzilalal...@gmail.com <mailto:godzilalal...@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 <http://line.id>;

    END LOOP;

    END

    $$;


    >
    > On Tue, Sep 13, 2016 at 11:12 AM James Keener <j...@jimkeener.com
    <mailto:j...@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.mala...@shrewsburyma.gov
    <mailto:jon.mala...@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@lists.osgeo.org <mailto:postgis-users@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.mala...@shrewsburyma.gov <mailto:jon.mala...@shrewsburyma.gov>
    >

    > _______________________________________________
    > postgis-users mailing list
    > postgis-users@lists.osgeo.org <mailto:postgis-users@lists.osgeo.org>
    > http://lists.osgeo.org/mailman/listinfo/postgis-users

    _______________________________________________
    postgis-users mailing list
    postgis-users@lists.osgeo.org <mailto:postgis-users@lists.osgeo.org>
    http://lists.osgeo.org/mailman/listinfo/postgis-users



_______________________________________________
postgis-users mailing list
postgis-users@lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/postgis-users

_______________________________________________
postgis-users mailing list
postgis-users@lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/postgis-users

Reply via email to