Quantcast
Channel: Question and Answer » pgrouting
Viewing all articles
Browse latest Browse all 47

PgRouting function wrapper

$
0
0

I’m trying to adapt the pgr_fromAtoB function to pgr_fromAtoMult replacing pgr_dijkstra function to pgr_drivingdistance.Here is the code:

CREATE OR REPLACE FUNCTION pgr_fromAtoMult(IN tbl character varying, IN x double precision, IN y double precision, OUT seq integer, OUT gid integer, OUT name text, OUT heading double precision, OUT cost double precision, OUT geom geometry)

  RETURNS SETOF record AS
$BODY$
DECLARE
    sql     text;
    rec     record;
    source  integer;
    point   integer;
    dist    double precision;

BEGIN
        -- Find nearest node
        EXECUTE 'SELECT id::integer FROM layer_vertices_pgr
                        ORDER BY the_geom <-> ST_GeometryFromText(''POINT('
                        || x || ' ' || y || ')'',4326) LIMIT 1' INTO rec;
        source := rec.id;

        -- Changing pgr_dijkstra to pgr_drivingdistance query 
        seq := 0;
        sql := 'SELECT id, geom_way, osm_name, cost, source, target,
                                ST_Reverse(geom_way) AS flip_geom FROM 

' ||
                        'pgr_drivingdistance(''SELECT id as id, source::int, dist::double precision, '
                                        || 'time_4::float AS cost FROM '
                                        || quote_ident(tbl) || ''', '
                                        || source || ', ' || dist
                                        || ' , false, false), '
                                || quote_ident(tbl) || ' WHERE id2 = id ORDER BY seq';

        -- Remember start point
    point := source;

            -- Flip geometry (if required)
            IF ( point != rec.source ) THEN
                    rec.geom_way := rec.flip_geom;
                    point := rec.source;
            ELSE
                    point := rec.target;
            END IF;

            -- Calculate heading (simplified)
            EXECUTE 'SELECT degrees( ST_Azimuth(
                            ST_StartPoint(''' || rec.geom_way::text || '''),
                            ST_EndPoint(''' || rec.geom_way::text || ''') ) )'
                    INTO heading;

            -- Return record
            seq     := seq + 1;
            gid     := rec.id;
            name    := rec.osm_name;
            cost    := rec.cost;
            geom    := rec.geom_way;
            RETURN NEXT;

    RETURN;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE STRICT
  COST 100
  ROWS 1000;
ALTER FUNCTION pgr_fromAtoMult(character varying, double precision, double precision)
  OWNER TO postgres;

And here is the Error:

ERROR:  el registro «rec» no tiene un campo «source»
CONTEXT:  sentencia SQL: «SELECT ( point != rec.source )»
función PL/pgSQL pgr_fromAtoMult(character varying,double precision,double precision) en la línea 32 en IF
********** Error **********

ERROR: el registro «rec» no tiene un campo «source»
SQL state: 42703
Context: sentencia SQL: «SELECT ( point != rec.source )»

Viewing all articles
Browse latest Browse all 47

Latest Images

Trending Articles



Latest Images