Re: [OSGeoJapan-discuss] ダムから河口への距離
Yoichi Kayama
yoichi.kayama @ gmail.com
2010年 7月 16日 (金) 11:52:23 EDT
今木さん
嘉山です
pgRoutingはジオメトリの型がLINESTRING またはMULTI LINESTRING のPostGISのテーブルが
操作の対象になります。
たとえば道路で検索する場合は交差点と交差点の間の区間が1レコードになっているようなPostGISのテーブル
が必要です。
ご要望の機能ですが、河川のつながりがLINESTRINGまたはMULTILINESTRINGのデータテーブルで
あらわすことができれば可能です。
合流点と合流点の間のLINESTRINGをレコード単位とするようなテーブルで各LINESTRINGの端点が接続する
LINESTRINGの端点座標とつながっているといいです。ダムの地点ではLINESTRINGを分断して、ダムの
上流と下流のLINESTRINGは別レコードにします。河口は再下流のLINESTRINGレコードの片側の端点と
なります。
pgRoutingでは、このようなLINESTRINGのテーブルに対して前処理でノード番号やコストのカラムを追加して
各LINESTRINGの接続関係やそこを通る場合のコストの値を定義する必要があります。
そのような前処理を行った後は以下のようなSQLで経路探索を行えます
テーブル名を kasen とします
SELECT * FROM shortest_path ('SELECT gid AS id, source::int4,
target::int4, length::double precision AS cost,FROM kasen', 3, 7, false, false);
shortest_path() というのが pgRouting の関数です。
これはノード3からノード7までの最短経路を求めるという処理になります。
ここで結果は経路各区間の始点、終点のノード番号 と コストの列が帰ってきます。
コストが距離になっていれば、このコストの合計が総延長になりますし、そうでない場合は
ノード番号でレコードを特定してジオメトリから長さを取り出せば延長を算出することはできます。
ですから上記のSQLの例では数値3のところにダムの位置のノード番号、数値7のところに
河口のノード番号が記入されていると指定ダムから河口までの経路検索になります。
ですから手順としては
1.pgRouting のインストール
2.LINESTRING または MULTILINESTRING をジオメトリとして持つテーブルとして
河川のデータを用意する。
3.上記テーブルのトポロジとコストの設定をする。
各レコードにノード番号、コストのカラムを追加、値を設定する(処理のためのSQLがあると思います)
4.必要があれば各種インデックスを設定する。
5.経路探索を行いたい始点と終点のノード番号を調べて、pgRoutingの関数を使ったSQLを
実行すると経路のノード番号とコストのリストが検索結果として取得できる
というのがpgRouting で経路検索を行う場合のおおまかな手順です。
2010年7月16日0:25 Hiroo Imaki <hiroo @ angeli.org>:
> 皆様、
> 先日、自分のプロジェクトでアメリカの主要なダムから河口までの距離を求めてそれぞれのダムのポイントに属性値として距離を挿入するという作業が必要になりました。ESRI的に言えばネットワークアナリストでネットワーク上の2点間の距離を求めるということになると思うのですが、PostGIS的にはどうしたらこの答えが求められるでしょうか?データとしてはいかのものがあります。
> ダムデータ。ポイント
> 河川データ。ラインストリング
> 河口データ。ポイント
> PgRoutingを使うことを考えているのですが、まだ使ったことがないのでまず、
> 1)私の求めようとしている答えが求まるのか
> 2)それにはどのようなステップを踏んだらいいのか
> を教えていただけたらうれしいです。よろしくお願いします。
>
OSGeoJapan-discuss メーリングリストの案内