<div dir="ltr"><div>Hi Charles,<br></div><div><br></div><div>Thank you for code.</div><div><br></div><div>Regards,</div><div>Miroslav</div><br><div class="gmail_quote">2011/3/23 Charles Galpin <span dir="ltr">&lt;<a href="mailto:cgalpin@lhsw.com">cgalpin@lhsw.com</a>&gt;</span><br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Hi Miroslav<br>
<br>
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.<br>
<br>
Otherwise search the email archives as I believe he posted his here at some point as well.<br>
<br>
hth<br>
charles<br>
<div class="im"><br>
On Mar 23, 2011, at 6:44 AM, Miroslav Novta wrote:<br>
<br>
&gt; Hello list,<br>
&gt;<br>
&gt; I want to use the assign_vertices_3d() function developed by Stephen Woodbridge. I want to use it for iGO shp map format with &quot;turn restrictions&quot; too.<br>
&gt;<br>
&gt; Is there source code and documentation available on any public repository I may access?<br>
<br>
</div>-- Function: assign_vertex_id3d(character varying, double precision, character varying, character varying, character varying, character varying)<br>
<br>
-- DROP FUNCTION assign_vertex_id3d(character varying, double precision, character varying, character varying, character varying, character varying);<br>
<br>
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)<br>


  RETURNS character varying AS<br>
$BODY$<br>
DECLARE<br>
    _r record;<br>
    source_id int;<br>
    target_id int;<br>
    srid integer;<br>
BEGIN<br>
<br>
    BEGIN<br>
    DROP TABLE vertices_tmp;<br>
    EXCEPTION<br>
    WHEN UNDEFINED_TABLE THEN<br>
    END;<br>
<br>
    EXECUTE &#39;CREATE TABLE vertices_tmp (id serial)&#39;;<br>
<br>
--    FOR _r IN EXECUTE &#39;SELECT srid FROM geometry_columns WHERE f_table_name=&#39;&#39;&#39;|| quote_ident(geom_table)||&#39;&#39;&#39;;&#39; LOOP<br>
--      srid := _r.srid;<br>
--    END LOOP;<br>
<br>
    srid := Find_SRID(&#39;public&#39;,quote_ident(geom_table),quote_ident(geo_cname));<br>
<br>
<br>
    EXECUTE &#39;SELECT addGeometryColumn(&#39;&#39;vertices_tmp&#39;&#39;, &#39;&#39;the_geom&#39;&#39;, &#39;||srid||&#39;, &#39;&#39;POINT&#39;&#39;, 3)&#39;;<br>
    CREATE INDEX vertices_tmp_idx ON vertices_tmp USING GIST (the_geom);<br>
<br>
    FOR _r IN EXECUTE &#39;SELECT &#39; || quote_ident(gid_cname) || &#39; AS id,&#39;<br>
            || &#39; ST_MakePoint(ST_X(StartPoint(&#39;|| quote_ident(geo_cname) ||&#39;)), ST_Y(StartPoint(&#39;|| quote_ident(geo_cname) ||&#39;)), &#39;|| quote_ident(source_zlevel_cname) ||&#39;) AS source,&#39;<br>
            || &#39; ST_MakePoint(ST_X(EndPoint(&#39;|| quote_ident(geo_cname) ||&#39;)), ST_Y(EndPoint(&#39;|| quote_ident(geo_cname) ||&#39;)), &#39;|| quote_ident(target_zlevel_cname) ||&#39;) AS target&#39;<br>
            || &#39; FROM &#39; || quote_ident(geom_table)<br>
    LOOP<br>
<br>
        source_id := point_to_id3d(setsrid(_r.source, srid), tolerance);<br>
        target_id := point_to_id3d(setsrid(_r.target, srid), tolerance);<br>
<br>
        EXECUTE &#39;update &#39; || quote_ident(geom_table) ||<br>
                &#39; SET source = &#39; || source_id ||<br>
                &#39;, target = &#39; || target_id ||<br>
                &#39; WHERE &#39; || quote_ident(gid_cname) || &#39; =  &#39; || _<a href="http://r.id" target="_blank">r.id</a>;<br>
    END LOOP;<br>
<br>
    RETURN &#39;OK&#39;;<br>
<br>
END;<br>
$BODY$<br>
  LANGUAGE &#39;plpgsql&#39; VOLATILE STRICT<br>
  COST 100;<br>
ALTER FUNCTION assign_vertex_id3d(character varying, double precision, character varying, character varying, character varying, character varying) OWNER TO postgres;<br>
<br>
<br>
-- Function: point_to_id3d(geometry, double precision)<br>
<br>
-- DROP FUNCTION point_to_id3d(geometry, double precision);<br>
<br>
CREATE OR REPLACE FUNCTION point_to_id3d(p geometry, tolerance double precision)<br>
  RETURNS bigint AS<br>
$BODY$<br>
<br>
DECLARE<br>
    _r record;<br>
    _id bigint;<br>
    _srid integer;<br>
<br>
BEGIN<br>
<br>
    _srid := Find_SRID(&#39;public&#39;,&#39;vertices_tmp&#39;,&#39;the_geom&#39;);<br>
<br>
    SELECT<br>
        ST_Length3D(ST_MakeLine(the_geom,p)) AS d, id<br>
<br>
    INTO _r FROM vertices_tmp WHERE<br>
<br>
        the_geom &amp;&amp; Expand(p, tolerance) AND ST_Length3D(ST_MakeLine(the_geom,p)) &lt; tolerance<br>
<br>
    ORDER BY d LIMIT 1;<br>
<br>
    IF FOUND THEN<br>
<br>
        _id:= _<a href="http://r.id" target="_blank">r.id</a>;<br>
<br>
    ELSE<br>
<br>
        INSERT INTO vertices_tmp(the_geom) VALUES (SetSRID(p,_srid)); _id:=lastval();<br>
<br>
    END IF;<br>
<br>
    RETURN _id;<br>
<br>
END; $BODY$<br>
  LANGUAGE &#39;plpgsql&#39; VOLATILE STRICT<br>
  COST 100;<br>
ALTER FUNCTION point_to_id3d(geometry, double precision) OWNER TO postgres;<br>
<br>
<br>
_______________________________________________<br>
Pgrouting-users mailing list<br>
<a href="mailto:Pgrouting-users@lists.osgeo.org">Pgrouting-users@lists.osgeo.org</a><br>
<a href="http://lists.osgeo.org/mailman/listinfo/pgrouting-users" target="_blank">http://lists.osgeo.org/mailman/listinfo/pgrouting-users</a><br>
</blockquote></div><br><br clear="all"><br>-- <br>Miroslav Novta<br>
</div>