$B%j%9%H$N3'MM!"(B<div><br></div><div>$B@hF|!"(BpgRouting$B$r;H$C$?%@%`$+$i2O8}$^$G$N5wN%7W;;$K$D$$$F<ALd$7$?:#LZ$G$9!#$7$P$i$/$3$NLdBj$H3JF.$7$F$$$k4V$K!"$$$/$D$+JXMx$J%U%!%s%/%7%g%s$r=q$$$?$N$G!J$H$$$C$F$bC/$+$N=q$$$?$b$N$r<h$j9~$s$@$j!"2~A1$7$?$j$7$?$b$N$G$9$,!K3'$5$s$N$*Lr$KN)$F$P$H;W$$%]%9%H$7$^$9!#(B</div><div><br></div><div>$B0l$DL\$O!"J#?t$NE@!J(BPOINT)$B$r@~!J(BLINESTRING$B!K$K%9%J%C%W$9$k%U%!%s%/%7%g%s$G$9!#$3$l$O!"(BPaul Ramsey$B$N%V%m%0$+$i%a%$%s$N%3!<%I$rGR<Z$7$F%U%!%s%/%7%g%s$K$7$?$b$N$G$9!#;H$$J}$O!"(B</div>
<div><div>SELECT * FROM points_snap2lines</div><div>&nbsp;&nbsp; (&#39;SELECT gid AS id, the_geom AS geom FROM point_table&#39;,</div><div>&nbsp;&nbsp; &nbsp;&#39;SELECT gid AS id, the_geom AS geom FROM line_table&#39;,</div><div>&nbsp;&nbsp; &nbsp; 0.0001);</div>
<div>$B$N$h$&$K$7$F!":G8e$KCO?^$NC10L$G%9%J%C%W$N5vMFEY$rF~NO$7$^$9!#$3$N%U%!%s%/%7%g%s$r<B9T$9$k$H%]%$%s%H!"%i%$%s$N$=$l$>$l$N(BID$B$H%9%J%C%W8e$N%8%*%a%H%j!<$,5"$C$F$-$^$9!#(B</div><div><br></div><div>2$B$DL\$O!"J#?t$NE@$r;H$C$FJ#?t$N@~$r%/%j%C%W$9$k%U%!%s%/%7%g%s$G$9!#$3$l$O!"(B<a href="http://postgis.refractions.net/pipermail/postgis-users/2007-September/017159.html">http://postgis.refractions.net/pipermail/postgis-users/2007-September/017159.html</a>$B!!$NJb%9%F%#%s%0$K$"$C$?%U%!%s%/%7%g%s$r=q$-49$($?$b$N$G$9!#$3$N%]%9%F%#%s%0$N$^$^$G$O;d$N(Bpostgresql8.3.3$B$G$O$&$^$/F0$+$J$+$C$?$N$G!"<jD>$7$7$?$N$H!"(BST_DWithin()$B$r;H$C$FB?>/!"E@$,@~$+$i$:$l$F$$$F$b%/%j%C%W$G$-$k$h$&$K$7$?$N$H!"4pK\E*$J%k!<%W>e$N%(%i!<$rD>$7$?$b$N$G$9!#;H$$J}$O!"(B</div>
<div><div>SELECT * FROM split_lines2(&#39;SELECT gid AS id, the_geom AS geom FROM line_table&#39;,</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $B!!!!!!!!(B &#39;SELECT the_geom AS geom FROM point_table&#39;, 0.0001);</div></div><div>$B$N$h$&$K$7$F!"!!(BST_DWithin$B$N5wN%%Q%i%a%?!<$r:G8e$KF~NO$7$^$9!#(B</div>
<div><br></div><div>$B;d$N4D6-!J(BWindowsXP, PostgreSQL8.3.3)$B$G$O$&$^$/F0$-$^$7$?!#2~NI!"%P%0$J$I$"$j$^$7$?$iO"Mm$/$@$5$$!#;H$C$?46A[$J$I$b$*J9$+$;$/$@$5$$!#(B</div><div><br></div><div>$B$$$^$-(B</div><div><div><br></div><div>CREATE OR REPLACE FUNCTION points_snap2lines (in pt_q text, in ln_q text, in torelance float4,&nbsp;out p_id int, out l_id int, out p_geom geometry)</div>
<div>RETURNS SETOF RECORD AS</div><div>$$</div><div>DECLARE</div><div>&nbsp;&nbsp;snap_q text;</div><div>&nbsp;&nbsp;pointrec record;</div><div>BEGIN</div><div>&nbsp;EXECUTE &#39;CREATE TEMP TABLE line_tmp as &#39;|| ln_q;</div><div>&nbsp;EXECUTE &#39;CREATE TEMP TABLE point_tmp as &#39;|| pt_q;</div>
<div>snap_q :=&#39;</div><div>SELECT</div><div>&nbsp;&nbsp;pt_id,</div><div>&nbsp;&nbsp;ln_id,</div><div>&nbsp;&nbsp;ST_line_interpolate_point(</div><div>&nbsp;&nbsp; &nbsp;ln_geom,</div><div>&nbsp;&nbsp; &nbsp;ST_line_locate_point(ln_geom, pt_geom)</div><div>&nbsp;&nbsp;) AS the_geom</div>
<div>FROM</div><div>&nbsp;&nbsp;(</div><div>&nbsp;&nbsp; &nbsp;SELECT DISTINCT ON (<a href="http://pt.id">pt.id</a>)</div><div>&nbsp;&nbsp; &nbsp; &nbsp;ln.the_geom AS ln_geom,</div><div>&nbsp;&nbsp; &nbsp; &nbsp;pt.the_geom AS pt_geom,</div><div>&nbsp;&nbsp; &nbsp; &nbsp;<a href="http://ln.id">ln.id</a> AS ln_id,</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp;<a href="http://pt.id">pt.id</a> AS pt_id</div><div>&nbsp;&nbsp; &nbsp;FROM</div><div>&nbsp;&nbsp; &nbsp; &nbsp;point_tmp pt INNER JOIN</div><div>&nbsp;&nbsp; &nbsp; &nbsp;line_tmp ln</div><div>&nbsp;&nbsp; &nbsp;ON</div><div>&nbsp;&nbsp; &nbsp; &nbsp;ST_DWithin(pt.the_geom, ln.the_geom, &#39;||cast(torelance as text) ||&#39;)</div>
<div>&nbsp;&nbsp; &nbsp;ORDER BY</div><div>&nbsp;&nbsp; &nbsp; &nbsp;<a href="http://pt.id">pt.id</a>,ST_Distance(ln.the_geom, pt.the_geom)&nbsp;</div><div>&nbsp;&nbsp;) as foo&#39; ;</div><div>&nbsp;FOR pointrec in EXECUTE snap_q LOOP</div><div>&nbsp;&nbsp; p_id &nbsp; := pointrec.pt_id;</div>
<div>&nbsp;&nbsp; l_id &nbsp; := pointrec.ln_id;</div><div>&nbsp;&nbsp; p_geom := pointrec.the_geom;</div><div>&nbsp;&nbsp; RETURN NEXT;</div><div>&nbsp;END LOOP;</div><div>&nbsp;DROP TABLE line_tmp;</div><div>&nbsp;DROP TABLE point_tmp;</div><div>&nbsp;RETURN;</div><div>END;</div>
<div>$$</div><div>LANGUAGE plpgsql;</div><div><br></div></div><div><br></div><div><br></div><div><div>CREATE OR REPLACE FUNCTION split_lines2(in lineq text, in pointq text, in torelance float4,&nbsp;out lineid int, out the_geom geometry)</div>
<div>RETURNS SETOF RECORD AS</div><div>$$</div><div>DECLARE</div><div>&nbsp;&nbsp;linerec record;</div><div>&nbsp;&nbsp;pointrec record;</div><div>&nbsp;&nbsp;linepos float;</div><div>&nbsp;&nbsp;start_ float;</div><div>&nbsp;&nbsp;end_ float;</div><div>&nbsp;&nbsp;loopqry text;</div>
<div>BEGIN</div><div>&nbsp;&nbsp;EXECUTE &#39;CREATE TEMP TABLE line_tmp as &#39;|| lineq;</div><div>&nbsp;&nbsp;EXECUTE &#39;CREATE TEMP TABLE point_tmp as &#39;|| pointq;</div><div>&nbsp;&nbsp;FOR linerec in EXECUTE &#39;SELECT * FROM line_tmp ORDER BY id&#39; LOOP</div>
<div>&nbsp;&nbsp;start_ := 0;</div><div>&nbsp;&nbsp;end_ &nbsp; := 0;</div><div>&nbsp;&nbsp;loopqry := &#39;</div><div>&nbsp;&nbsp; &nbsp;SELECT</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;*, ST_line_locate_point(&#39;&#39;&#39;||cast(linerec.geom as text)||&#39;&#39;&#39;,geom) AS frac&nbsp;</div><div>
&nbsp;&nbsp; &nbsp;FROM point_tmp&nbsp;</div><div>&nbsp;&nbsp; &nbsp;WHERE ST_DWithin(geom,&#39;&#39;&#39;||cast(linerec.geom as text)||&#39;&#39;&#39;, &#39;||torelance||&#39;)</div><div>&nbsp;&nbsp; &nbsp;ORDER BY ST_line_locate_point(&#39;&#39;&#39;||cast(linerec.geom as text)||&#39;&#39;&#39;,geom)&#39;;</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp;FOR pointrec in EXECUTE loopqry LOOP</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end_ &nbsp; := pointrec.frac;</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;lineid := <a href="http://linerec.id">linerec.id</a>;</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;the_geom &nbsp; := ST_line_substring(linerec.geom, start_, end_);</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;start_ := end_;</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;RETURN NEXT;</div><div>&nbsp;&nbsp; &nbsp; &nbsp;END LOOP;</div><div>&nbsp;&nbsp; &nbsp; &nbsp;lineid := <a href="http://linerec.id">linerec.id</a>;</div><div>&nbsp;&nbsp; &nbsp; &nbsp;the_geom:= ST_line_substring(linerec.geom, end_,1.0);</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp;RETURN NEXT;</div><div>&nbsp;&nbsp;END LOOP;</div><div>&nbsp;&nbsp;DROP TABLE line_tmp;</div><div>&nbsp;&nbsp;DROP TABLE point_tmp;</div><div>&nbsp;&nbsp;RETURN;</div><div>END;</div><div>$$</div><div>LANGUAGE plpgsql;</div><div><br></div><div><br></div>
</div><br>-- <br>Hiroo Imaki<br><a href="mailto:hiroo@angeli.org">hiroo@angeli.org</a><br><a href="http://www.geopacific.org">http://www.geopacific.org</a><br>
</div>