I'm trying to prepare a dijkstra wrapper for Geoserver. I got a code from my professor and have to modify it so that it uses the dijkstra algorithm with the reverse cost argument. Can anyone please tell me what I'm doing wrong?
I get this error: Support for id,source,target columns only of type: integer. Support for Cost: double precision. Here's the code:
CREATE OR REPLACE FUNCTION pgr_fromatob( IN sche character varying, IN tbl character varying, IN x1 double precision, IN y1 double precision, IN x2 double precision, IN y2 double precision, OUT seq integer, OUT gid integer, --OUT name text, OUT heading double precision, OUT cost double precision, --nie wiem jak podac cost i reverse_cost do record OUT cost_reverse double precision, OUT geom geometry) RETURNS SETOF record AS $BODY$ DECLARE sql text; rec record; source integer; target integer; point integer; BEGIN -- Find nearest node EXECUTE 'SELECT id::integer FROM osm_rowerowe_500_points_y ORDER BY geom <-> ST_GeometryFromText(''POINT(' || x1 || ' ' || y1 || ')'',2180) LIMIT 1' INTO rec; source := rec.id; EXECUTE 'SELECT id::integer FROM osm_rowerowe_500_points_y ORDER BY geom <-> ST_GeometryFromText(''POINT(' || x2 || ' ' || y2 || ')'',2180) LIMIT 1' INTO rec; target := rec.id; -- Shortest path query (TODO: limit extent by BBOX) seq := 0; sql := 'SELECT id, geom, czas, czas_reverse, source, target, ST_Reverse(geom) AS flip_geom FROM ' || 'pgr_dijkstra(''SELECT id as id, source::int, target::int, ' || 'czas::float AS cost, czas_reverse::float as reverse_cost FROM ' || quote_ident(sche) ||'.' || quote_ident(tbl) || ''', ' || source || ', ' || target || ' , false, true), '|| quote_ident(sche) ||'.'|| quote_ident(tbl) || ' WHERE id2 = id ORDER BY seq'; -- Remember start point point := source; FOR rec IN EXECUTE sql LOOP -- Flip geometry (if required) IF ( point != rec.source ) THEN rec.geom := rec.flip_geom; point := rec.source; ELSE point := rec.target; END IF; -- Calculate heading (simplified) EXECUTE 'SELECT degrees( ST_Azimuth( ST_StartPoint(''' || rec.geom::text || '''), ST_EndPoint(''' || rec.geom::text || ''') ) )' INTO heading; -- Return record seq := seq + 1; gid := rec.id; --name := rec.typ_d; cost := rec.czas; cost_reverse := rec.czas_reverse; geom := rec.geom; RETURN NEXT; END LOOP; RETURN; END; $BODY$ LANGUAGE plpgsql VOLATILE