2015年9月17日木曜日

19 - pgRouting 8 - 8. pl/pgsql のラッパーを記述する(Workshop)

19-8 8. pl/pgsql のラッパーを記述する
19-8-1 8.1. ネットワークのジオメトリと共にルートを返す
経路のラインのジオメトリと共にルートを返すにはラッパー関数を記述する必要はありません。

ダイクストラ法による最短経路探索

user@deb8-vmw:~$ su - postgres
パスワード:
postgres@deb8-vmw:~$ psql pgrouting-workshop
psql (9.4.3)
"help" でヘルプを表示します.

pgrouting-workshop=# SELECT seq, id1 AS node, id2 AS edge, cost FROM pgr_dijkstra('
pgrouting-workshop'# SELECT gid AS id,
pgrouting-workshop'# source::integer,
pgrouting-workshop'# target::integer,
pgrouting-workshop'# length::double precision AS cost
pgrouting-workshop'# FROM ways',
pgrouting-workshop(# 30, 60, false, false);
 seq | node  |  edge  |        cost         
-----+-------+--------+---------------------
   0 |    30 |  53981 | 0.00179787381215754
   1 |    29 |  54683 | 0.00414306299059075
   2 |  2929 |  54682 | 0.00415625981313575
---
  84 | 52876 | 108239 |  0.0663451932790427
  85 | 51208 |  78537 |  0.0296600224657156
  86 |    60 |     -1 |                   0
(87 行)

(END):q


ジオメトリを含んだ結果

pgrouting-workshop=# SELECT seq, id1 AS node, id2 AS edge, cost, b.the_geom FROM pgr_dijkstra('
SELECT gid AS id,
source::integer,
target::integer,
length::double precision AS cost
FROM ways',
30, 60, false, false) a LEFT JOIN ways b ON (aid2 = b,gid);
 seq | node  |  edge  |        cost         |           the_geom
-----+-------+--------+---------------------+------------------------
   0 |    30 |  53981 | 0.00179787381215754 | 0102000020E6100000020000002D7F19E7
CAAD5EC0B34DE08C50B74640748A9F10CBAD5EC0D10A671250B74640
---
  86 |    60 |     -1 |                   0 | 
(87 行)

(END):q


19-8-2 8.2. 結果を可視化する
ターミナルのスクリーン上で行や列、数字を眺める代わりに、地図上にルートを可視化します。

CREATE TABLE <table name> AS SELECT ... を使って 結果をテーブルに保存して その結果を QGIS で見る方法(QGIS を Synaptic マネージャでインストールしておきます。)

pgrouting-workshop=# CREATE TABLE route AS SELECT seq, id1 AS node, id2 AS edge, cost, b.the_geom FROM pgr_dijkstra('
SELECT gid AS id,
source::integer,
target::integer,
length::double precision AS cost
FROM ways',
30, 60, false, false) a LEFT JOIN ways b ON (aid2 = b,gid);

QGIS で表示できませんでした。(次のように表示されました。)











この章(19-8 8. pl/pgsql のラッパーを記述する)が終わったら、pgrouting-workshop データベースの所有者を user にして、操作します。

19-8-3 8.3. 入力パラメータとジオメトリの出力を単純化
最短経路探索の Dijkstra 関数を呼ぶときに単純化 (そして標準の値をセット)した関数(ダイクストラ法のラッパー)です。
(内容はホームページを参照してください。)

19-8-4 8.4. 緯度/経度 のポイントの間のルートで順番にならんだジオメトリと方位を返す
入力パラメータとして 緯度/経度 のポイントを扱い、 QGIS または Mapserver や Geoserver のような WMS サービスで表示ができるルートを返す関数です。
(内容はホームページを参照してください。)

データベースにこのファンクションをインストールします:

psql -U user -d pgrouting-workshop -f ~/Desktop/pgrouting-workshop/data/fromAtoB.sql

user@deb8-vmw:~$ su - postgres
パスワード:
postgres@deb8-vmw:~$ cd /home/user/public_html/pgrouting-workshop/data/
postgres@deb8-vmw:/home/user/public_html/pgrouting-workshop/data$ ls
SHP          sampledata.osm         sampledata_routing.sql
fromAtoB.sql  sampledata_notopo.sql
postgres@deb8-vmw:/home/user/public_html/pgrouting-workshop/data$ psql -d pgrouting-workshop -f fromAtoB.sql
CREATE FUNCTION

19-8-5 QGIS で route テーブルを表示
もう一度、QGIS で route テーブルを表示してみます。
「19-8-2 8.2. 結果を可視化する」で
pgrouting-workshop データベースの所有者を user にして操作してみます。

user@deb8-vmw:~$ su - postgres
パスワード:
postgres@deb8-vmw:~$ psql pgrouting-workshop
psql (9.4.3)
"help" でヘルプを表示します.

pgrouting-workshop=# \d
                     リレーションの一覧
 スキーマ |           名前           |     型     |  所有者  
----------+--------------------------+------------+----------
 public   | classes                  | テーブル   | postgres
 public   | geography_columns        | ビュー     | postgres
 public   | geometry_columns         | ビュー     | postgres
 public   | nodes                    | テーブル   | postgres
 public   | raster_columns           | ビュー     | postgres
 public   | raster_overviews         | ビュー     | postgres
 public   | relation_ways            | テーブル   | postgres
 public   | relations                | テーブル   | postgres
 public   | route                    | テーブル   | postgres
 public   | spatial_ref_sys          | テーブル   | postgres
 public   | types                    | テーブル   | postgres
 public   | way_tag                  | テーブル   | postgres
 public   | ways                     | テーブル   | postgres
 public   | ways_vertices_pgr        | テーブル   | postgres
 public   | ways_vertices_pgr_id_seq | シーケンス | postgres
(15 行)

pgrouting-workshop=# ALTER TABLE classes OWNER TO user;
ALTER TABLE
pgrouting-workshop=# ALTER VIEW geography_columns OWNER TO user;
ALTER VIEW
pgrouting-workshop=# ALTER VIEW geometry_columns OWNER TO user;
ALTER VIEW
pgrouting-workshop=# ALTER TABLE nodes OWNER TO user;
ALTER TABLE
pgrouting-workshop=# ALTER VIEW raster_columns OWNER TO user;
ALTER VIEW
pgrouting-workshop=# ALTER VIEW raster_overviews OWNER TO user;
ALTER VIEW
pgrouting-workshop=# ALTER TABLE relation_ways OWNER TO user;
ALTER TABLE
pgrouting-workshop=# ALTER TABLE relations OWNER TO user;
ALTER TABLE
pgrouting-workshop=# ALTER TABLE route OWNER TO user;
ALTER TABLE
pgrouting-workshop=# ALTER TABLE spatial_ref_sys OWNER TO user;
ALTER TABLE
pgrouting-workshop=# ALTER TABLE types OWNER TO user;
ALTER TABLE
pgrouting-workshop=# ALTER TABLE way_tag OWNER TO user;
ALTER TABLE
pgrouting-workshop=# ALTER TABLE ways OWNER TO user;
ALTER TABLE
pgrouting-workshop=# ALTER TABLE ways_vertices_pgr OWNER TO user;
ALTER TABLE
pgrouting-workshop=# ALTER SEQUENCE ways_vertices_pgr_id_seq OWNER TO user;
ALTER SEQUENCE

pgrouting-workshop=# \d
                    リレーションの一覧
 スキーマ |           名前           |     型     | 所有者 
----------+--------------------------+------------+--------
 public   | classes                  | テーブル   | user
 public   | geography_columns        | ビュー     | user
 public   | geometry_columns         | ビュー     | user
 public   | nodes                    | テーブル   | user
 public   | raster_columns           | ビュー     | user
 public   | raster_overviews         | ビュー     | user
 public   | relation_ways            | テーブル   | user
 public   | relations                | テーブル   | user
 public   | route                    | テーブル   | user
 public   | spatial_ref_sys          | テーブル   | user
 public   | types                    | テーブル   | user
 public   | way_tag                  | テーブル   | user
 public   | ways                     | テーブル   | user
 public   | ways_vertices_pgr        | テーブル   | user
 public   | ways_vertices_pgr_id_seq | シーケンス | user
(15 行)

(stdin):q


1 QGIS を起動します。


2 「ブラウザ」の「PostGIS」を右クリックして、「新しい接続」ます。










3 「新規 PostGIS 接続を作成」で次のように入力します。
名称: pgrouting(任意)
サービス: (空 そのまま)
ホスト: localhost
ポート: 5432(そのまま)
データベース: pgrouting-workshop
SSL モード: 禁止(そのまま)
ユーザ名: user(postgres の user)
パスワード: (postgres の user のパスワード)



4 「接続テスト」ボタンをクリックします。成功すれば次のように表示されるので、「OK」ボタンをクリックします。



「新規 PostGIS 接続を作成」ダイアログの「OK」ボタンをクリックします。

5 「ブラウザ」ペインの「PostGIS -> pgrouting -> public -> route」をクリックして展開し、「route」をダブルクリックします。






● PostGIS レイヤを追加して QGIS の SQL where clause を使う方法:
1 「レイヤ」ペインの「route」を右クリックし、「削除」をクリックします。


2 「レイヤとグループの削除」ダイアログで「OK」ボタンをクリックします。





3 「ブラウザ」の「ways」をダブルクリックし、表示します。







4 「レイヤ」ペインの「ways」を右クリックし、「プロパティ」をクリックします。











5 「レイヤプロパティ - ways|一般情報」ダイアログで、一番下にある「クエリビルダ」ボタンをクリックします。








6 「クエリビルダ」ダイアログの「プロバイダ特有フィルタ式」に次のクエリを入力して「テスト」ボタンをクリックします。

"gid" IN ( SELECT id2 AS gid FROM pgr_dijkstra('
 SELECT gid AS id,
  source::integer,
  target::integer,
  length::double precision AS cost
 FROM ways',
30, 60, false, false) a LEFT JOIN ways b ON (a.id2 = b.gid)
)



7 「クエリ結果」が表示されたら「OK」ボタンをクリックします。






「クエリビルダ」ダイアログの「OK」ボタンをクリックします。
「レイヤプロパティ - ways|一般情報」ダイアログの「OK」ボタンをクリックします。




8 「ブラウザ」ペインの「ways」をダブルクリックし、表示します。背景レイヤにするため、「レイヤ」ペインの直前に追加した「ways」をドラッグして下に移動します。「route」が目立たないときは、この「ways」を右クリックし、「プロパティ」をクリックして「レイヤプロパティ - ways|スタイル」ダイアログで、「色」を変更してください。
1

0 件のコメント: