Re: [OSGeoJapan-discuss] PostGIS用の便利なファンクション
Hiroo Imaki
hiroo @ angeli.org
2010年 7月 23日 (金) 11:50:34 EDT
Hi Daniel-san,
Nice to talk to you over internet! Thanks for pointing out the posting. It
was a straight forward task for me to use ESRI products but I am always
trying to use PostGIS and other open source GIS product for my work. I love
to try Paul's recursive method. I think it should work for my task since the
"cost" for me is just a total length of selected segments. I even did not
know the WITH RECURSIVE function with PostgreSQL. I definitely will learn
about this and summarize in my site.
I just recently watched "Karate-kid" not the newest one but old one with my
kids. My five years old daughter sometimes imitates Mr. Miyagi and said
"Daniel-san!". It just so cute to hear. Sorry for my silly comment.
Thanks!
Hiroo
2010/7/23 Daniel Kastl <daniel.kastl @ georepublic.de>
> Imaki-san,
>
> Even if I'm very glad about every pgRouting user and happy to see nice
> tutorials in Japanese, I had to think about your water flow task when I read
> this blog post of Paul Ramsey:
>
> http://blog.cleverelephant.ca/2010/07/network-walking-in-postgis.html
>
> Paul's example looks very much like a simple river network, and my first
> thought was how could pgRouting eventually make use of this new feature of
> PostgreSQL 8.4.
>
> Well, maybe you want to try it with your river network.
> Not sure how to apply "costs" but maybe they are not important in your
> case. Would be interesting to see if this is possible with only PostgreSQL
> and PostGIS.
>
> Daniel
>
>
>
>
> --
> Georepublic UG & Georepublic Japan
> eMail: daniel.kastl @ georepublic.de
> Web: http://georepublic.de
>
>
> <http://blog.cleverelephant.ca/2010/07/network-walking-in-postgis.html>
>
> 2010/7/22 Hiroo Imaki <hiroo @ angeli.org>
>
>> リストの皆様、
>>
>>
>> 先日、pgRoutingを使ったダムから河口までの距離計算について質問した今木です。しばらくこの問題と格闘している間に、いくつか便利なファンクションを書いたので(といっても誰かの書いたものを取り込んだり、改善したりしたものですが)皆さんのお役に立てばと思いポストします。
>>
>> 一つ目は、複数の点(POINT)を線(LINESTRING)にスナップするファンクションです。これは、Paul
>> Ramseyのブログからメインのコードを拝借してファンクションにしたものです。使い方は、
>> SELECT * FROM points_snap2lines
>> ('SELECT gid AS id, the_geom AS geom FROM point_table',
>> 'SELECT gid AS id, the_geom AS geom FROM line_table',
>> 0.0001);
>>
>> のようにして、最後に地図の単位でスナップの許容度を入力します。このファンクションを実行するとポイント、ラインのそれぞれのIDとスナップ後のジオメトリーが帰ってきます。
>>
>> 2つ目は、複数の点を使って複数の線をクリップするファンクションです。これは、
>> http://postgis.refractions.net/pipermail/postgis-users/2007-September/017159.htmlの歩スティングにあったファンクションを書き換えたものです。このポスティングのままでは私のpostgresql8.3.3ではうまく動かなかったので、手直ししたのと、ST_DWithin()を使って多少、点が線からずれていてもクリップできるようにしたのと、基本的なループ上のエラーを直したものです。使い方は、
>> SELECT * FROM split_lines2('SELECT gid AS id, the_geom AS geom FROM
>> line_table',
>> 'SELECT the_geom AS geom FROM point_table',
>> 0.0001);
>> のようにして、 ST_DWithinの距離パラメターを最後に入力します。
>>
>> 私の環境(WindowsXP,
>> PostgreSQL8.3.3)ではうまく動きました。改良、バグなどありましたら連絡ください。使った感想などもお聞かせください。
>>
>> いまき
>>
>> CREATE OR REPLACE FUNCTION points_snap2lines (in pt_q text, in ln_q text,
>> in torelance float4, out p_id int, out l_id int, out p_geom geometry)
>> RETURNS SETOF RECORD AS
>> $$
>> DECLARE
>> snap_q text;
>> pointrec record;
>> BEGIN
>> EXECUTE 'CREATE TEMP TABLE line_tmp as '|| ln_q;
>> EXECUTE 'CREATE TEMP TABLE point_tmp as '|| pt_q;
>> snap_q :='
>> SELECT
>> pt_id,
>> ln_id,
>> ST_line_interpolate_point(
>> ln_geom,
>> ST_line_locate_point(ln_geom, pt_geom)
>> ) AS the_geom
>> FROM
>> (
>> SELECT DISTINCT ON (pt.id)
>> ln.the_geom AS ln_geom,
>> pt.the_geom AS pt_geom,
>> ln.id AS ln_id,
>> pt.id AS pt_id
>> FROM
>> point_tmp pt INNER JOIN
>> line_tmp ln
>> ON
>> ST_DWithin(pt.the_geom, ln.the_geom, '||cast(torelance as text) ||')
>> ORDER BY
>> pt.id,ST_Distance(ln.the_geom, pt.the_geom)
>> ) as foo' ;
>> FOR pointrec in EXECUTE snap_q LOOP
>> p_id := pointrec.pt_id;
>> l_id := pointrec.ln_id;
>> p_geom := pointrec.the_geom;
>> RETURN NEXT;
>> END LOOP;
>> DROP TABLE line_tmp;
>> DROP TABLE point_tmp;
>> RETURN;
>> END;
>> $$
>> LANGUAGE plpgsql;
>>
>>
>>
>> CREATE OR REPLACE FUNCTION split_lines2(in lineq text, in pointq text, in
>> torelance float4, out lineid int, out the_geom geometry)
>> RETURNS SETOF RECORD AS
>> $$
>> DECLARE
>> linerec record;
>> pointrec record;
>> linepos float;
>> start_ float;
>> end_ float;
>> loopqry text;
>> BEGIN
>> EXECUTE 'CREATE TEMP TABLE line_tmp as '|| lineq;
>> EXECUTE 'CREATE TEMP TABLE point_tmp as '|| pointq;
>> FOR linerec in EXECUTE 'SELECT * FROM line_tmp ORDER BY id' LOOP
>> start_ := 0;
>> end_ := 0;
>> loopqry := '
>> SELECT
>> *, ST_line_locate_point('''||cast(linerec.geom as text)||''',geom)
>> AS frac
>> FROM point_tmp
>> WHERE ST_DWithin(geom,'''||cast(linerec.geom as text)||''',
>> '||torelance||')
>> ORDER BY ST_line_locate_point('''||cast(linerec.geom as
>> text)||''',geom)';
>> FOR pointrec in EXECUTE loopqry LOOP
>> end_ := pointrec.frac;
>> lineid := linerec.id;
>> the_geom := ST_line_substring(linerec.geom, start_, end_);
>> start_ := end_;
>> RETURN NEXT;
>> END LOOP;
>> lineid := linerec.id;
>> the_geom:= ST_line_substring(linerec.geom, end_,1.0);
>> RETURN NEXT;
>> END LOOP;
>> DROP TABLE line_tmp;
>> DROP TABLE point_tmp;
>> RETURN;
>> END;
>> $$
>> LANGUAGE plpgsql;
>>
>>
>>
>> --
>> Hiroo Imaki
>> hiroo @ angeli.org
>> http://www.geopacific.org
>>
>> _______________________________________________
>> OSGeoJapan-discuss mailing list
>> OSGeoJapan-discuss @ lists.osgeo.org
>> http://lists.osgeo.org/mailman/listinfo/osgeojapan-discuss
>>
>>
>
> _______________________________________________
> OSGeoJapan-discuss mailing list
> OSGeoJapan-discuss @ lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/osgeojapan-discuss
>
>
--
Hiroo Imaki
hiroo @ angeli.org
http://www.geopacific.org
-------------- next part --------------
HTML¤ÎźÉÕ¥Õ¥¡¥¤¥ë¤¬½üµî¤µ¤ì¤Þ¤·¤¿.
URL: http://lists.osgeo.org/pipermail/osgeojapan-discuss/attachments/20100723/230654d1/attachment-0001.html
OSGeoJapan-discuss メーリングリストの案内