[pgrouting-users] assign_vertices_3d source code & docs

Charles Galpin cgalpin at lhsw.com
Wed Mar 23 07:43:19 EDT 2011


Hi Miroslav

This is an implementation I have been using which I made after a discussion with Stephen on this subject. It is essentially an implementation of his ideas and works fine for me, but ymmv.

Otherwise search the email archives as I believe he posted his here at some point as well.

hth
charles

On Mar 23, 2011, at 6:44 AM, Miroslav Novta wrote:

> Hello list,
> 
> I want to use the assign_vertices_3d() function developed by Stephen Woodbridge. I want to use it for iGO shp map format with "turn restrictions" too.
> 
> Is there source code and documentation available on any public repository I may access?

-- Function: assign_vertex_id3d(character varying, double precision, character varying, character varying, character varying, character varying)

-- DROP FUNCTION assign_vertex_id3d(character varying, double precision, character varying, character varying, character varying, character varying);

CREATE OR REPLACE FUNCTION assign_vertex_id3d(geom_table character varying, tolerance double precision, geo_cname character varying, gid_cname character varying, source_zlevel_cname character varying, target_zlevel_cname character varying)
  RETURNS character varying AS
$BODY$
DECLARE
    _r record;
    source_id int;
    target_id int;
    srid integer;
BEGIN

    BEGIN
    DROP TABLE vertices_tmp;
    EXCEPTION 
    WHEN UNDEFINED_TABLE THEN
    END;

    EXECUTE 'CREATE TABLE vertices_tmp (id serial)';

--    FOR _r IN EXECUTE 'SELECT srid FROM geometry_columns WHERE f_table_name='''|| quote_ident(geom_table)||''';' LOOP
--      srid := _r.srid;
--    END LOOP;

    srid := Find_SRID('public',quote_ident(geom_table),quote_ident(geo_cname));


    EXECUTE 'SELECT addGeometryColumn(''vertices_tmp'', ''the_geom'', '||srid||', ''POINT'', 3)';
    CREATE INDEX vertices_tmp_idx ON vertices_tmp USING GIST (the_geom);
                        
    FOR _r IN EXECUTE 'SELECT ' || quote_ident(gid_cname) || ' AS id,'
            || ' ST_MakePoint(ST_X(StartPoint('|| quote_ident(geo_cname) ||')), ST_Y(StartPoint('|| quote_ident(geo_cname) ||')), '|| quote_ident(source_zlevel_cname) ||') AS source,'
            || ' ST_MakePoint(ST_X(EndPoint('|| quote_ident(geo_cname) ||')), ST_Y(EndPoint('|| quote_ident(geo_cname) ||')), '|| quote_ident(target_zlevel_cname) ||') AS target'
            || ' FROM ' || quote_ident(geom_table) 
    LOOP
        
        source_id := point_to_id3d(setsrid(_r.source, srid), tolerance);
        target_id := point_to_id3d(setsrid(_r.target, srid), tolerance);
                                                                
        EXECUTE 'update ' || quote_ident(geom_table) || 
                ' SET source = ' || source_id || 
                ', target = ' || target_id || 
                ' WHERE ' || quote_ident(gid_cname) || ' =  ' || _r.id;
    END LOOP;

    RETURN 'OK';

END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE STRICT
  COST 100;
ALTER FUNCTION assign_vertex_id3d(character varying, double precision, character varying, character varying, character varying, character varying) OWNER TO postgres;


-- Function: point_to_id3d(geometry, double precision)

-- DROP FUNCTION point_to_id3d(geometry, double precision);

CREATE OR REPLACE FUNCTION point_to_id3d(p geometry, tolerance double precision)
  RETURNS bigint AS
$BODY$ 

DECLARE
    _r record; 
    _id bigint; 
    _srid integer;

BEGIN

    _srid := Find_SRID('public','vertices_tmp','the_geom');

    SELECT
        ST_Length3D(ST_MakeLine(the_geom,p)) AS d, id

    INTO _r FROM vertices_tmp WHERE

        the_geom && Expand(p, tolerance) AND ST_Length3D(ST_MakeLine(the_geom,p)) < tolerance

    ORDER BY d LIMIT 1; 

    IF FOUND THEN

        _id:= _r.id;

    ELSE

        INSERT INTO vertices_tmp(the_geom) VALUES (SetSRID(p,_srid)); _id:=lastval();

    END IF;

    RETURN _id;

END; $BODY$
  LANGUAGE 'plpgsql' VOLATILE STRICT
  COST 100;
ALTER FUNCTION point_to_id3d(geometry, double precision) OWNER TO postgres;




More information about the Pgrouting-users mailing list