vendredi 30 janvier 2015

PgRouting function wrapper


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 )»




Aucun commentaire:

Enregistrer un commentaire