2015年9月17日木曜日

19 - pgRouting 10 - 10. OpenLayers 3 ベースのルート検索インターフェース(Workshop)

19-10 10. OpenLayers 3 ベースのルート検索インターフェース
19-10-1 10.1. OpenLayers 3 入門
この章には、OpenLayers 3 の概要が書かれています。

19-10-2 10.2. 最小限の地図の作成
私の場合は NetBeans で環境が整っているので、これで地図を作成します。
詳しい説明はホームページを参照してください。
1 NetBeans を起動します。









2 「新規ファイル」ボタンをクリック。

3 「新規ファイル」ダイアログで「カテゴリ」を「HTML5」ファイルタイプ」を「HTMLファイル」を選択して「次>」ボタンをクリック。






4 「new HTML ファイル」ダイアログで「ファイル名」を「19-10_ol3-1.html」と入力して「終了」ボタンをクリック。






「index.html」
<html>
 <head>
  <title>TODO supply a title</title>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
 </head>
 <body>
  <div>TODO write content</div>
  <div><a href="./13-3_ol3-1.html">13-3_ol3-1.html</a></div>
  <div><a href="./14-7_ol3-1.html">14-7_ol3-1.html</a></div>
  <div><a href="./15-3_ol3-1.html">15-3_ol3-1.html</a></div>
  <div><a href="./16-3_ol3-1.html">16-3_ol3-1.html</a></div>
  <div><a href="./16-4_ol3-1.html">16-4_ol3-1.html</a></div>
  <div><a href="./19-10_ol3-1.html">19-10_ol3-1.html</a></div>
 </body>
</html>

「19-10_ol3-1.html」
<!DOCTYPE html>
<html>
 <head>
  <title>ol3 pgRouting client</title>
  <meta charset="utf-8">
  <!-- <link href="ol3/ol.css" rel="stylesheet"> 
  デフォルトの OpenLayers CSS ファイルを読み込み -->
  <link rel="stylesheet" href="js/libs/v3.7.0/css/ol.css" type="text/css">
  <!-- 地図の DOM 要素にサイズを割り当てるため、 CSS ルールを記述 -->
  <style>
  #map {
    width: 100%;
    height: 400px;
  }
  </style>
 </head>
 <body>
  <!--地図のために div 要素を追加 -->
  <div id="map"></div>
  <!-- <script src="ol3/ol.js"></script> 
  OpenLayers 3 のライブラリコードを読み込み -->
  <script src="js/libs/v3.7.0/build/ol.js"></script>
  <script type="text/javascript">
   var map = new ol.Map({
    target: 'map',
    layers: [
     new ol.layer.Tile({
     /** ol.layer.Tile 
      * For layer sources that provide pre-rendered, tiled 
      * images in grids that are organized by zoom levels for 
      * specific resolutions. 
      * リレンダリング(事前描画)を提供するレイヤソースのための、
      * 特定の解像度でのズームレベルによって編成されているグリッ
      * ドのタイルイメージ。(ol3 API)
      */
      source: new ol.source.OSM()
      /** ol.source.OSM 
       * Layer source for the OpenStreetMap tile server.
       * OpenStreetMap タイルサーバのレイヤソース。(ol3 API)
       */
     })
    ],
    view: new ol.View({
     center: [-13657275.569447909, 5699392.057118396],
     zoom: 10
    }),
    controls: ol.control.defaults({
    /** controls
     * Controls initially added to the map. 
     * If not specified, ol.control.defaults() is used.
     * 初期設定で、マップに追加されたコントロール。
     * 明示されていなければ、ol.control.defaults() が使用され
     * ます。(ol3 API)
     */
    /** ol.control.defaults()
     * デフォルトでは、マップに含まコントロールのセット。
     * 特に設定しない限り、これは、以下の各コントロールの
     * インスタンスを含むコレクションを返します。(API Doc より)
     * ol.control.Zoom, ol.control.Rotate,
     * ol.control.Attribution
     */
     attributionOptions: {
      collapsible: false // 折りたたみ
     }
    })
   });
  </script>
 </body>
</html>

19-10-3 10.3. WMS GET パラメータ
以下のコードを地図の作成の後に追加。(この後のコードも順次後ろに追加)GeoServer に送信される WMS GET パラメータを保持。
---
   var params = {
    LAYERS: 'pgrouting:pgrouting',
    FORMAT: 'image/png'
   };

  </script>
 </body>
</html>

19-10-4 10.4. “出発地” と “目的地” の選択
地図上でのクリックにより、ユーザが出発地と目的地を追加。
// The "start" and "destination" features.
// 「出発地」と「目的地」フィーチャ。
var startPoint = new ol.Feature();
/** ol.Feature 
 * A vector object for geographic features with a 
 * geometry and other attribute properties, similar to 
 * the features vector file formats like GeoJSON.
 * GeoJSONのようなフィーチャベクタファイルフォーマットと同様
 * の、ジオメトリおよびその他の属性プロパティを持つ地理的
 * フィーチャのベクタオブジェクト。(ol3 API)
 */
var destPoint = new ol.Feature();
// The vector layer used to display the "start" and 
// "destination" features.
// 「出発地」と「目的地」のフィーチャを表示するために使用される
// ベクタレイヤ。
var vectorLayer = new ol.layer.Vector({
/** ol.layer.Vector
 * Vector data that is rendered client-side.
 * クライアント側で描画されたベクタデータ。(ol3 API)
 */
 source: new ol.source.Vector({
 /** ol.source.Vector
  * Provides a source of features for vector layers.
  * ベクタレイヤのフィーチャのソースを用意します。(ol3 API)
  */
  features: [startPoint, destPoint]
 })
});
map.addLayer(vectorLayer);


上の部分コードは、 2 つのベクタフィーチャを作成。1 つは “出発地” 、もう 1 つは “目的地”。
これらのフィーチャは、空 - ジオメトリを含まない - 状態。
下の部分のコードは、さらにベクタレイヤを作成し、 “出発地” と “目的地” のフィーチャを追加。さらに、 map の addLayer メソッドにより、地図にベクタレイヤを追加。

以下のコードを追加:
// A transform function to convert coordinates from 
// EPSG:3857 to EPSG:4326.
// EPSG:3857 から EPSG:4326 へ座標を変換するための transform 
// 関数。
var transform = ol.proj.getTransform('EPSG:3857', 'EPSG:4326');
/** ol.proj.getTransform(source, destination)
 * Given the projection-like objects, searches for a
 * transformation function to convert a coordinates 
 * array from the source projection to the destination 
 * projection.
 * projection 系オブジェクトを与えられると、変換関数のための
 * 検索は、ソース投影から宛先の投影にの座標の配列に変換します。
 * (ol3 API)
 */
// Register a map click listener.
// マップのクリックリスナを登録。
map.on('click', function(event) {
/** on(type, listener, opt_this)
 * Listen for a certain type of event.
 * あるタイプのイベントをリッスンします。(ol3 API)
 */
 if (startPoint.getGeometry() == null) {
 /** getGeometry()
  * Get the feature's default geometry. A feature may 
  * have any number of named geometries. The "default" 
  * geometry (the one that is rendered by default) is 
  * set when calling ol.Feature#setGeometry.
  * フィーチャのデフォルトのジオメトリを取得します。フィーチャ
  * は、任意の数の指定の図形を有することができます。 「デフォル
  * ト」のジオメトリ(デフォルトでレンダリングされるもの)が 
  * ol.Feature#setGeometry を呼び出すときに設定されます。
  * (ol3 API)
  */
  // First click.
  startPoint.setGeometry(new ol.geom.Point(event.coordinate));
  /** setGeometry(geometry)
   * Set the default geometry for the feature. This will 
   * update the property with the name returned by 
   * ol.Feature#getGeometryName.
   * フィーチャのデフォルトのジオメトリを設定します。これは
   * ol.Feature#getGeometryName によって返された名前で
   * プロパティを更新します。(ol3 API)
   */
  /** ol.geom.Point 
   * Point geometry.
   * 点のジオメトリ。(ol3 API)
   */
 } else if (destPoint.getGeometry() == null) {
  // Second click.
  destPoint.setGeometry(new ol.geom.Point(event.coordinate));
  // Transform the coordinates from the map projection 
  // (EPSG:3857) to the server projection (EPSG:4326).
  // マップ投影(EPSG:3857)からサーバ投影(EPSG:4326)へ座標を
  // 変換。 
  var startCoord = transform(startPoint.getGeometry().getCoordinates());
  /** transform(source, destination)
   * Transform each coordinate of the geometry from 
   * one coordinate reference system to another. The 
   * geometry is modified in place. For example, a 
   * line will be transformed to a line and a circle 
   * to a circle. If you do not want the geometry 
   * modified in place, first clone() it and then use 
   * this function on the clone.
   * ジオメトリの各座標をある座標参照系から別のものへ変換し
   * ます。ジオメトリは、所定の位置に修正されます。例えば、
   * ラインはライン、円は円に変換されます。ジオメトリを所定
   * の位置に修正したくない場合は、最初にそれを clone() し、
   * それからこの関数をクローンで使用します。(ol3 API)
   */
  /** getCoordinates()
   * Return the coordinate of the point.
   * 点の座標を返します。(ol3 API)
   */
  var destCoord = transform(destPoint.getGeometry().getCoordinates());
  var viewparams = [
   'x1:' + startCoord[0], 'y1:' + startCoord[1],
   'x2:' + destCoord[0], 'y2:' + destCoord[1]
  ];
  params.viewparams = viewparams.join(';');
  /** Array.join
   * 配列の全ての要素を繋いで文字列にします。
   * (MDN [https://developer.mozilla.org/ja/docs/Web/
   * JavaScript/Reference/Global_Objects/Array/join])
   */
  result = new ol.layer.Image({
  /** ol.layer.Image
   * Server-rendered images that are available for arbitrary 
   * extents and resolutions. 
    * 任意の範囲と解像度で利用可能な server-rendered イメージ。
   * (ol3 API)
   */
   source: new ol.source.ImageWMS({
   /** ol.source.ImageWMS
    * Source for WMS servers providing single, untiled 
    * images.
    * 単一、アンタイル(タイル状でない)イメージを提供する WMS 
    * のためのソース。(ol3 API)
    */
    url: 'http://localhost:8080/geoserver/pgrouting/wms',
    params: params
   })
  });
  map.addLayer(result);
 }
});


上記のコードは、地図の click イベントのためのリスナー関数を登録。OpenLayers 3 は地図上でのクリックイベントの検知の度に、この関数を呼び出す。

リスナー関数に渡されるイベントオブジェクトは、 クリックの地理的な位置を表す coordinate プロパティを含む。coordinate は “出発地” と “目的地” フィーチャの ポイント ジオメトリを作成するのに使用。

一度、出発地と目的地のポイントが(2度のクリックにより)確定すると、2つの座標値のペアは、地図の投影法(EPSG:3857)からサーバの投影法(EPSG:4326)に transform 関数を使用して変換。

viewparams プロパティは WMS GET パラメータオブジェクトに設定。このプロパティの値は特別な意味を持つ: GeoServer はこのレイヤのための SQL クエリを実行する前に、この値を代用。

例えば、もし:

SELECT * FROM ways WHERE maxspeed_forward BETWEEN %min% AND %max%

の場合、 viewparams は viewparams=min:20;max:120 となり、 PostGIS に送信される SQL クエリは:

SELECT * FROM ways WHERE maxspeed_forward BETWEEN 20 AND 120

となる。最後に、param オブジェクトが渡された、新しい OpenLayers WMS レイヤが作成されて、地図に追加。

19-10-5 10.5. 結果のクリア
以下のコードを HTML ページの地図の div の後に追加:
---
<div id="map"></div>
<!-- 追加 -->
<button id="clear">clear</button>
---

上記により、ルート検索ポイントをクリアし、新しいルート検索クエリを開始することを可能にするボタンが作成。

次に、以下のコードを JavaScript コードに追加:
var clearButton = document.getElementById('clear');
clearButton.addEventListener('click', function(event) {
/** EventTarget.addEventListener
 * addEventListener は、 1 つのイベントターゲットにイベント 
 * リスナーを1 つ登録します。イベントターゲットは、ドキュメント
 * 上の単一のノード、ドキュメント自身、ウィンドウ、あるいは、
 * XMLHttpRequest です。
 *(MDN[https://developer.mozilla.org/ja/docs/Web/API/
 * EventTarget.addEventListener])
 */
 // Reset the "start" and "destination" features.
 // “出発地” と “目的地” のフィーチャをリセット
 startPoint.setGeometry(null);
 destPoint.setGeometry(null);
 // Remove the result layer.
 // 結果レイヤを削除
 map.removeLayer(result);
});


このボタンがクリックされた際は、 addEventListener に渡されたこの関数が実行。この関数は “出発地” と “目的地” のフィーチャをリセットし、ルート検索結果レイヤを地図から削除。


ルート検索ができる範囲よりも広く表示されています。

19 - pgRouting 9 - 9. GeoServer による WMS サーバ(Workshop)

19-9 9. GeoServer による WMS サーバ
私の場合は、GeoServer の準備ができているのでホームページの手順で進めていきます。

19-9-1 9.1. 管理者ページへの接続
1 ブラウザのアドレスバーに http://localhost:8080/geoserver と入力して Enter キーを押し、ログインします。

19-9-2 9.2. レイヤの作成
1 左側の欄の「データ」の「ワークスペース」をクリックします。






2 「新規ワークスペース追加」をクリックします。






3 「新しいワークスペース」で次のように入力します。

Name: pgrouting
ネームスペースURI: http://pgrouting.org
19092a-deb8.png

4 「送信」ボタンをクリックします。




Store の追加
1 左側の欄の「データ」の「ストア」をクリックします。








2 「ストア新規追加」をクリックします。






3 「PostGIS」をクリックします。












4 ワークスペース の初期設定は変えずに、「ストア基本情報」の データソース名 と 解説 を入力します。

ワークスペース: pgrouting (変更なし)
データソース名: pgrouting
解説: pgrouting (説明、任意です)
有効化: チェックする(変更なし)






5 PostGIS データベースの「パラメーターの接続」を指定します。
host: localhost (変更なし)
port: 5432 (変更なし)
database: pgrouting-workshop
schema: public (変更なし)
user: user (ways テーブルに接続できるユーザ)
password: ●●●●●●● (user がテーブルに接続するときのパスワード)

設定値の残りの箇所については、そのまま

6 「保存」ボタンをクリックします。
追加されたレイヤ一覧が表示されます。






7 「SQL ビューを新規作成...」リンクをクリックします。



8 「SQL ビューの新規作成」の「名称を表示」と「SQL ステートメント」を次のように入力します。

名称を表示: pgrouting
SQL ステートメント:
SELECT ST_MakeLine(route.geom) FROM (
 SELECT geom FROM pgr_fromAtoB('ways', %x1%, %y1%, %x2%, %y2%
) ORDER BY seq) AS route


9 「SQLからパラメータを推測」をクリックすると、上記の SQL から抽出されたパラメータが表示されます。


各パラメータを以下のように設定します:

デフォルト値: 0
正規表現を検証: ^-?[\d.]+$


10 「属性」の「再読み込み」リンクをクリックすると、一つの属性が現れます (st_makeline と記載されています)
各パラメータを以下のように設定します:

種類: LineString
SRID: 4326


11 「保存」ボタンをクリックします。
12 「レイヤ編集」のページに遷移するので、次のように入力します。

「座標参照系(CRS)」を入力します。
元ファイルSRS: EPSG:4326(変更なし)
指定中のSRS: EPSG:3857 (「検索中」ボタンをクリックして「3857」を検索して表示された「3857 WGS 84 / Pseudo-Mercator」をクリック)

SRSのハンドリング: 投影法をネイティブから変換




「範囲矩形」を入力します。
ネイティブの範囲矩形: (「データを元に算出」をクリック -以下の値が入力されました)
最小X: -111,319.49079327357
最小Y: -111,325.14286638597
最大X: 0
最大Y: -0.0000000007081155
緯度経度範囲矩形: (「ネイティブの範囲を元に算出」をクリック -以下の値が入力されました)
最小X: -1
最小Y: -1.0000000000000142
最大X: 0
最大Y: 0


「保存」ボタンをクリックします。

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

19 - pgRouting 7 - 7. より高度なルート検索クエリ(Workshop)

19-7 7. より高度なルート検索クエリ
前章「19-6 6. osm2pgrouting インポートツール」でデータを準備していないので、「ノート:」にあるように、データベースダンプファイルを読み込みます。

user@deb8-vmw:~$ su - postgres
パスワード:
postgres@deb8-vmw:~$ dropdb pgrouting-workshop
postgres@deb8-vmw:~$ createdb pgrouting-workshop
postgres@deb8-vmw:~$ cd /home/user/public_html/pgrouting-workshop/data/
postgres@deb8-vmw:/home/user/public_html/pgrouting-workshop/data$ psql -d pgrouting-workshop -f sampledata_routing.sql
SET
SET
SET
SET
SET
SET
psql:sampledata_routing.sql:12: ERROR:  現在オープンしているデータベースを削除できません
psql:sampledata_routing.sql:17: ERROR:  ロケール名"en_US.UTF-8"は無効です
データベース "pgrouting-workshop" にユーザ"postgres"として接続しました。
SET
SET
SET
SET
SET
SET
psql:sampledata_routing.sql:33: ERROR:  スキーマ"public"はすでに存在します
COMMENT
CREATE EXTENSION
COMMENT
CREATE EXTENSION
COMMENT
CREATE EXTENSION
COMMENT
SET
SET
SET
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE SEQUENCE
ALTER SEQUENCE
ALTER TABLE
COPY 36
COPY 492902
COPY 53108
COPY 40
COPY 0
COPY 4
COPY 198192
COPY 92435
COPY 67076
 setval
--------
  67076
(1 行)

ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
CREATE INDEX
CREATE INDEX
CREATE INDEX
CREATE INDEX
CREATE INDEX
REVOKE
REVOKE
GRANT
GRANT

19-7-1 7.1. 重み付けされたコスト
pgrouting-workshop データベースを確認します。

postgres@deb8-vmw:/home/user/public_html/pgrouting-workshop/data$ cd
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   | 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
(14 行)

(stdin):q


次の SQL を実行して types と classes の内容を確認します。

pgrouting-workshop=# SELECT * FROM types ORDER BY id;
 id |   name    
----+-----------
  1 | highway
  2 | cycleway
  3 | tracktype
  4 | junction
(4 行)


pgrouting-workshop=# SELECT * FROM classes ORDER BY id;
 id  | type_id |       name        | cost | priority | default_maxspeed 
-----+---------+-------------------+------+----------+------------------
 100 |       1 | road              |      |        1 |               50
 101 |       1 | motorway          |      |        1 |               50
 102 |       1 | motorway_link     |      |        1 |               50
 103 |       1 | motorway_junction |      |        1 |               50
 104 |       1 | trunk             |      |        1 |               50
 105 |       1 | trunk_link        |      |        1 |               50
 106 |       1 | primary           |      |        1 |               50
 107 |       1 | primary_link      |      |        1 |               50
 108 |       1 | secondary         |      |        1 |               50
 109 |       1 | tertiary          |      |        1 |               50
 110 |       1 | residential       |      |        1 |               50
 111 |       1 | living_street     |      |        1 |               50
 112 |       1 | service           |      |        1 |               50
 113 |       1 | track             |      |        1 |               50
 114 |       1 | pedestrian        |      |        1 |               50
 115 |       1 | services          |      |        1 |               50
 116 |       1 | bus_guideway      |      |        1 |               50
 117 |       1 | path              |      |        1 |               50
 118 |       1 | cycleway          |      |        1 |               50
 119 |       1 | footway           |      |        1 |               50
 120 |       1 | bridleway         |      |        1 |               50
 121 |       1 | byway             |      |        1 |               50
 122 |       1 | steps             |      |        1 |               50
 123 |       1 | unclassified      |      |        1 |               50
 124 |       1 | secondary_link    |      |        1 |               50
 125 |       1 | tertiary_link     |      |        1 |               50
 201 |       2 | lane              |      |        1 |               50
 202 |       2 | track             |      |        1 |               50
 203 |       2 | opposite_lane     |      |        1 |               50
 204 |       2 | opposite          |      |        1 |               50
 301 |       3 | grade1            |      |        1 |               50
 302 |       3 | grade2            |      |        1 |               50
 303 |       3 | grade3            |      |        1 |               50
 304 |       3 | grade4            |      |        1 |               50
 305 |       3 | grade5            |      |        1 |               50
 401 |       4 | roundabout        |      |        1 |               50
(36 行)

(END):q


classes テーブルの cost の値を任意に与えます。

pgrouting-workshop=# UPDATE classes SET cost=1 ;
UPDATE 36
pgrouting-workshop=# UPDATE classes SET cost=2.0 WHERE name IN ('pedestrian','steps','footway');
UPDATE 3
pgrouting-workshop=# UPDATE classes SET cost=1.5 WHERE name IN ('cicleway','living_street','path');
UPDATE 2
pgrouting-workshop=# UPDATE classes SET cost=0.8 WHERE name IN ('secondary','tertiary');
UPDATE 2
pgrouting-workshop=# UPDATE classes SET cost=0.6 WHERE name IN ('primary','primary_link');
UPDATE 2
pgrouting-workshop=# UPDATE classes SET cost=0.4 WHERE name IN ('trunk','trunk_link');
UPDATE 2
pgrouting-workshop=# UPDATE classes SET cost=0.3 WHERE name IN ('motorway','motorway_junction','motorway_link');
UPDATE 3

ways テーブルの class_id フィールドと最終的には types テーブルの id フィールドにインデックスを作成します。

pgrouting-workshop=# CREATE INDEX ways_class_idx ON ways (class_id);
CREATE INDEX
pgrouting-workshop=# CREATE INDEX classes_idx ON classes (id);
CREATE INDEX

19-7-2 7.2. 制限されたアクセス
この章には、任意の道路のアクセスを制限する方法が書かれています。

19 - pgRouting 6 - 6. osm2pgrouting インポートツール(Workshop)

19-6 6. osm2pgrouting インポートツール
osm2pgrouting インポートツールを使用しないので、この章はとばします。
「8. pl/pgsql のラッパーを記述する」で手順通りに操作して、結果を確認するには osm2pgrouting を使用してください。

19 - pgRouting 5 - 5. pgRouting のアルゴリズム(Workshop)

19-5 5. pgRouting のアルゴリズム
19-5-1 5.1. ダイクストラ法による最短経路探索
前提条件
reverse cost を使えるようにするには追加の cost 列を追加する必要があります。私達は reverse cost を length としてセットすることができます。

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

pgrouting-workshop=# ALTER TABLE ways ADD COLUMN reverse_cost double precision;
ALTER TABLE
pgrouting-workshop=# UPDATE ways SET reverse_cost = length;
UPDATE 92435

説明やパラメータについてはホームページを参照してください。

クエリの例

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 |  63270 |  0.0826068346706699
   1 | 34780 |  43876 |  0.0387878379553639
   2 | 34779 |  74414 |   0.116939114260876
---
 321 | 45425 |  64167 |  0.0191919170925815
 322 | 45389 |  64077 |  0.0212719045648489
 323 |    60 |     -1 |                   0
(324 行)

(END):q


結果がホームページと違っていました。

19-5-2 5.2. A* アルゴリズムによる最短経路探索
前提条件
A-Star はあなたのネットワークのテーブルに事前に latitude/longitude 列 (x1, y1 と x2, y2) を追加してそれらの値を計算しておく必要があります。

pgrouting-workshop=# ALTER TABLE ways ADD COLUMN x1 double precision;
ALTER TABLE
pgrouting-workshop=# ALTER TABLE ways ADD COLUMN y1 double precision;
ALTER TABLE
pgrouting-workshop=# ALTER TABLE ways ADD COLUMN x2 double precision;
ALTER TABLE
pgrouting-workshop=# ALTER TABLE ways ADD COLUMN y2 double precision;
ALTER TABLE
pgrouting-workshop=# UPDATE ways SET x1 = ST_x(ST_PointN(the_geom, 1));
UPDATE 92435
pgrouting-workshop=# UPDATE ways SET y1 = ST_x(ST_PointN(the_geom, 1));
UPDATE 92435
pgrouting-workshop=# UPDATE ways SET x2 = ST_x(ST_PointN(the_geom, ST_NumPoints(the_geom)));
UPDATE 92435
pgrouting-workshop=# UPDATE ways SET y2 = ST_y(ST_PointN(the_geom, ST_NumPoints(the_geom)));
UPDATE 92435

説明やパラメータについてはホームページを参照してください。

クエリの例

pgrouting-workshop=# SELECT seq, id1 AS node, id2 AS edge, cost FROM pgr_astar('
SELECT gid AS id,
source::integer,
target::integer,
length::double precision AS cost,
x1, y1, x2, y2 FROM ways',
30, 60, false, false);
 seq | node  |  edge  |        cost         
-----+-------+--------+---------------------
   0 |    30 |  63270 |  0.0826068346706699
   1 | 34780 |  43876 |  0.0387878379553639
   2 | 34779 |  74414 |   0.116939114260876
---
 307 | 45408 |  64119 |  0.0215188911800576
 308 |    61 |  64165 |  0.0907426692530298
 309 |    60 |     -1 |                   0
(310 行)

(END):q


19-5-3 5.3. kDijkstra による複数の最短経路探索
説明やパラメータについてはホームページを参照してください。

pgr_kdijkstraCost のクエリの例

pgrouting-workshop=# SELECT seq, id1 AS source, id2 AS edge, cost FROM pgr_kdijkstraCost('  
SELECT gid AS id,
source::integer,
target::integer,
length::double precision AS cost
FROM ways',
10, array[60,70,80], false, false);
 seq | source | edge |       cost       
-----+--------+------+------------------
   0 |     10 |   60 | 12.7760976802851
   1 |     10 |   70 | 10.7254161085963
   2 |     10 |   80 | 1.35366721454691
(3 行)


pgr_kdijkstraPath のクエリの例

pgrouting-workshop=# SELECT seq, id1 AS path, id2 AS edge, cost FROM pgr_kdijkstraPath('
SELECT gid AS id,
source::integer,
target::integer,
length::double precision AS cost
FROM ways',
10, array[60,70,80], false, false);
 seq | path | edge  |        cost         
-----+------+-------+---------------------
   0 |   60 |    10 |  0.0130619186690278
   1 |   60 |  9274 |  0.0394297727975931
   2 |   60 | 56902 |  0.0247002816010054
---
 292 |   80 | 49455 |   0.223475992065702
 293 |   80 |    81 |  0.0570772918753206
 294 |   80 |    80 |                   0
(295 行)

(END):q

19 - pgRouting 4 - 4. ネットワーク・トポロジーを作成する(Workshop)

19-4-1 4.1. ネットワークデータを読み込む
ワークショップのサンプルデータを pgrouting-workshop データベースにインポートします。
はじめに、データベースを作成します。
名前が pgrouting-workshop でないと sampledata_notopo.sql がインポートできません。
また、所有者(オーナ)がスーパーユーザ出ないとエラーが発生します。ユーザにスーパーユーザの権限があれば OK です。
今回は postgres で操作します。
sampledata_notopo.sql をインポートすると postgis と pgrouting の拡張機能が追加されるようです。

user@deb8-vmw:~/ダウンロード$ cd
user@deb8-vmw:~$ su - postgres
パスワード:
postgres@deb8-vmw:~$ createdb pgrouting-workshop
postgres@deb8-vmw:~$ exit
user@deb8-vmw:~$ cd public_html/pgrouting-workshop/
user@deb8-vmw:~/public_html/pgrouting-workshop$ ls
data.tar.gz  docs  web
user@deb8-vmw:~/public_html/pgrouting-workshop$ tar -xvzf data.tar.gz
data/SHP/sampledata.prj
data/SHP/sampledata.qpj
data/SHP/sampledata.shp
data/sampledata_notopo.sql
data/sampledata.osm
data/SHP/
data/SHP/sampledata.dbf
data/fromAtoB.sql
data/sampledata_routing.sql
data/SHP/sampledata.shx
data/
data/SHP/sampledata.cpg
user@deb8-vmw:~/public_html/pgrouting-workshop$ su - postgres
パスワード:
postgres@deb8-vmw:~$ cd /home/user/public_html/pgrouting-workshop/data/
postgres@deb8-vmw:/home/user/public_html/pgrouting-workshop/data$ psql -d pgrouting-workshop -f sampledata_notopo.sql
SET
SET
SET
SET
SET
SET
psql:sampledata_notopo.sql:12: ERROR:  現在オープンしているデータベースを削除できません
psql:sampledata_notopo.sql:17: ERROR:  ロケール名"en_US.UTF-8"は無効です
データベース "pgrouting-workshop" にユーザ"postgres"として接続しました。
SET
SET
SET
SET
SET
SET
psql:sampledata_notopo.sql:33: ERROR:  スキーマ"public"はすでに存在します
COMMENT
CREATE EXTENSION
COMMENT
CREATE EXTENSION
COMMENT
CREATE EXTENSION
COMMENT
SET
SET
SET
CREATE TABLE
COPY 0
COPY 92435
CREATE INDEX
CREATE INDEX
REVOKE
REVOKE
GRANT
GRANT
postgres@deb8-vmw:/home/user/public_html/pgrouting-workshop/data$ cd

作成されたテーブルを見てみます。

postgres@deb8-vmw:~$ psql pgrouting-workshop
psql (9.4.3)
"help" でヘルプを表示します.

pgrouting-workshop=# \d
                 リレーションの一覧
 スキーマ |       名前        |    型    |  所有者  
----------+-------------------+----------+----------
 public   | geography_columns | ビュー   | postgres
 public   | geometry_columns  | ビュー   | postgres
 public   | raster_columns    | ビュー   | postgres
 public   | raster_overviews  | ビュー   | postgres
 public   | spatial_ref_sys   | テーブル | postgres
 public   | ways              | テーブル | postgres
(6 行)


道路ネットワークデータが含まれているテーブル ways の属性を見てみます。

pgrouting-workshop=# \d ways
             テーブル "public.ways"
    列    |            型             |  修飾語  
----------+---------------------------+----------
 gid      | integer                   | 
 class_id | integer                   | not null
 length   | double precision          | 
 name     | text                      | 
 osm_id   | bigint                    | 
 the_geom | geometry(LineString,4326) | 
インデックス:
    "ways_gid_idx" UNIQUE, btree (gid)
    "geom_idx" gist (the_geom)


19-4-2 4.2. トポロジーを計算する
データが正確なネットワーク・トポロジーを提供できるように、pgr_createTopology 関数を実行します。
最初に source と target の列を追加し、次に pgr_createTopology 関数を実行します。

pgrouting-workshop=# ALTER TABLE ways ADD COLUMN "source" integer;
ALTER TABLE
pgrouting-workshop=# ALTER TABLE ways ADD COLUMN "target" integer;
ALTER TABLE
pgrouting-workshop=# SELECT pgr_createTopology('ways', 0.00001, 'the_geom', 'gid');
NOTICE:  PROCESSING:
NOTICE:  pgr_createTopology('ways',1e-05,'the_geom','gid','source','target','true')
NOTICE:  Performing checks, pelase wait .....
NOTICE:  Creating Topology, Please wait...
NOTICE:  1000 edges processed
---
NOTICE:  92000 edges processed
NOTICE:  -------------> TOPOLOGY CREATED FOR  92435 edges
NOTICE:  Rows with NULL geometry or NULL id: 0
NOTICE:  Vertices table for table public.ways is: public.ways_vertices_pgr
NOTICE:  ----------------------------------------------
 pgr_createtopology
--------------------
 OK
(1 行)

19-4-3 4.3. インデックスを追加
ネットワークのテーブルが、source、target 列にインデックスを持つことを確認します。
次のコマンドを実行して、インデックスを追加します。私の場合は、次のように表示されました。

pgrouting-workshop=# CREATE INDEX ways_source_idx ON ways("source");
ERROR:  リレーション"ways_source_idx"はすでに存在します
pgrouting-workshop=# CREATE INDEX ways_target_idx ON ways("target");
ERROR:  リレーション"ways_target_idx"はすでに存在します

データベースは次のようになります。

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


テーブル ways の属性は、

pgrouting-workshop=# \d ways
             テーブル "public.ways"
    列    |            型             |  修飾語  
----------+---------------------------+----------
 gid      | integer                   | 
 class_id | integer                   | not null
 length   | double precision          | 
 name     | text                      | 
 osm_id   | bigint                    | 
 the_geom | geometry(LineString,4326) | 
 source   | integer                   | 
 target   | integer                   | 
インデックス:
    "ways_gid_idx" UNIQUE, btree (gid)
    "geom_idx" gist (the_geom)
    "ways_source_idx" btree (source)
    "ways_target_idx" btree (target)


詳細な説明は、ホームページを参照してください。

19 - pgRouting 3 - 3. インストール及び必要なもの(Workshop)

19-3 3. インストール及び必要なもの
ワークショップに必要なもの

linux オペレーションシステム
エディタ(Gedit)
Geoserver
インターネット接続

は、準備出来ています。

19-3-1 3.1. pgRouting
1 postgresql-9.4-pgrouting
Synaptic パッケージマネージャで

postgresql-9.4-pgrouting 2.0.0-3

をインストールします。

2 workshop package

OSGeo-Live Workshop installation
http://trac.osgeo.org/osgeo/wiki/Live_GIS_Workshop_Install

の「FOSS4G-EU (Como)」の「Software」の「Download workshop package」をクリックして、「pgrouting-workshop_2.0.6-ppa1_all.deb」をダウンロードします。

スーパーユーザで次のコマンドを実行してインストールします。

dpkg -i pgrouting-workshop_2.0.6-ppa1_all.deb

user@deb8-vmw:~$ cd ダウンロード
user@deb8-vmw:~/ダウンロード$ ls
---
pgrouting-workshop_2.0.6-ppa1_all.deb
---
user@deb8-vmw:~/ダウンロード$ su
パスワード:
root@deb8-vmw:/home/user/ダウンロード# dpkg -i pgrouting-workshop_2.0.6-ppa1_all.deb

19-3-2 3.2. ワークショップ
ワークショップのパッケージの確認をします。

root@deb8-vmw:/home/user/ダウンロード# ls /usr/share/pgrouting/workshop/
data.tar.gz  docs  web

ユーザのホームディレクトリにファイルをコピーして、ユーザの webserver のフォルダにシンボリックリンクを貼ります。

root@deb8-vmw:/home/user/ダウンロード# exit
exit
user@deb8-vmw:~/ダウンロード$ cd
user@deb8-vmw:~$ cp -R /usr/share/pgrouting/workshop/ pgrouting-workshop
user@deb8-vmw:~$ ln -s pgrouting-workshop public_html/pgrouting-workshop

Web のディレクトリ: http://localhost/~user/pgrouting-workshop/web/
オンラインマニュアル: http://localhost/~user/pgrouting-workshop/docs/html

ですが、表示できませんでした。

user@deb8-vmw:~$ ls public_html/pgrouting-workshop/
ls: public_html/pgrouting-workshop/ にアクセスできません: シンボリックリンクの階層が多すぎます

ということなので、pgrouting-workshop フォルダを public_html に移動しました。

user@deb8-vmw:~$ cd public_html/
user@deb8-vmw:~/public_html$ rm pgrouting-workshop
user@deb8-vmw:~/public_html$ mv ../pgrouting-workshop/ ./
user@deb8-vmw:~/public_html$ ls
---
pgrouting-workshop
---


19-3-3 3.3. データベースに pgRouting の機能を追加する
pgRouting の機能を拡張として簡単にインストールできます。(すでに 19-3-1 3.1 pgRouting でインストールしました。)
データベースを作成するには、次のようにコマンドを実行します。(今回は手順を確認するだけで、作成しなくても OK です。)

user@deb8-vmw:~$ su - postgres
パスワード:
postgres@deb8-vmw:~$ createdb routing
postgres@deb8-vmw:~$ psql -d routing -c "CREATE EXTENSION postgis;"
CREATE EXTENSION
postgres@deb8-vmw:~$ psql -d routing -c "CREATE EXTENSION pgrouting;"
CREATE EXTENSION


19-3-4 3.4. データ
osm2pgrouting を使用しませんが、「8. pl/pgsql のラッパーを記述する」で手順通りに操作して、結果を確認するには osm2pgrouting を使用してください。

19 - pgRouting 2 - 2. 使用するFOSS4Gツールについて(Workshop)

19-2 2. 使用するFOSS4Gツールについて
「2. 使用するFOSS4Gツールについて」には、このワークショップで使用する FOSS4G ツールについて記載されています。
「2.1. pgRouting」には、提供される機能について記載されています。
「2.2. OpenStreetMap」には、ワークショップで使用する地図 OpenStreetMap について説明があります。
「2.3. osm2pgrouting」osm2pgrouting は OpenStreetMap データを pgRouting データベースにインポートするのを容易にするコマンドラインツールですが、PostGIS にシャイプファイルのデータをインポートする方法(shp2pgsql)もできます。

Shapefiles-OpenStreetMap Wiki
http://wiki.openstreetmap.org/wiki/Shapefiles

に、シェイプファイルのデータの取得方法が記載されています。
「2.4. OpenLayers 3」には、簡単な OpenLayers 3 の説明があります。

19 - pgRouting 1 - 1. 序章(Workshop)

19-0 pgRouting について
pgRouting のホームページ

pgRouting Project - Open Source Librsry
http://pgrouting.org/

に、次のようにあります。


pgRouting Project

pgRouting extends the PostGIS / PostgreSQL geospatial database to provide geospatial routing functionality.
pgRoutingは、地理空間ルーティング機能を提供するために PostGIS/ PostgreSQL の地理空間データベースを拡張します。

Advantages of the database routing approach are:
データベースルーティングアプローチの利点は以下のとおりです。

● Data and attributes can be modified by many clients, like QGIS and uDig through JDBC, ODBC, or directly using Pl/pgSQL. The clients can either be PCs or mobile devices.
データと属性は、JDBC、ODBC 経由で、または直接 PL/pgSQL を使用することで、 QGIS と uDig のような多くのクライアントによって変更されます。クライアントは、PC やモバイルデバイスのいずれかとすることができます。

● Data changes can be reflected instantaneously through the routing engine. There is no need for precalculation.
データの変更は、ルーティングエンジンを経由して瞬時に反映させることができます。事前計算を必要としません。

● The “cost” parameter can be dynamically calculated through SQL and its value can come from multiple fields or tables.
「コスト(cost)」パラメータは、SQLを経由して動的に計算することができ、その値は、複数のフィールドやテーブルから入手することができます。


ライセンスは、「pgRouting is Open Source」に次のようにあります。


pgRouting is available under the GPLv2 license and is supported by a growing community of individuals, businesses and organizations.
pgRouting は GPLv2 ライセンスの下で利用可能で、個人、企業や組織の成長するコミュニティによってサポートされています。


19-1 1. 序章
pgRouting ワークショップマニュアル - Workshop-FOSS4G routing with pgRouting
http://workshop.pgrouting.org/ja/index.html

に従ってワークショップを作業していきます。
英語版は次の場所にあります。

pgRouting Workshop Manual - Workshop-FOSS4G routing with pgRouting
http://workshop.pgrouting.org/

1. 序章
「1.序章」の「要約」にこのワークショップの進め方にについて記載されていますので、よく読んでおきました。

2 - ol3.9ex 130b - Z-index layer ordering example 2

「layer-z-index.js(2130-ol3ex.js)」は、マップを表示するための JavaScript ファイルです。

「2130-ol3ex.js」
var stroke = new ol.style.Stroke({color: 'black', width: 1});
/** ol.style.Stroke 
 * Set stroke style for vector features. 
 * Note that the defaults given are the Canvas defaults, 
 * which will be used if option is not defined. 
 * The get functions return whatever was entered 
 * in the options;  they will not return the default.
 * ベクタフィーチャのためのストロークスタイルの設定。
 * デフォルトは、オプションが定義されていない場合に使用され
 * る Canvas のデフォルトを与えられることに注意してください。
 * GET 関数は、オプションで入力されたものはすべて返します。
 * それらはデフォルトを返しません。
 * (ol3 API[説明は Stable Only のチェックを外すと表示])
 */
var styles = {
 'square': [new ol.style.Style({
 /** ol.style.Style 
  * Base class for vector feature rendering styles.
  * ベクタフィーチャがスタイルを描画するための基本クラス。
  * (ol3 API[説明は Stable Only のチェックを外すと表示])
  */
  image: new ol.style.RegularShape({
  /** ol.style.RegularShape
   * Set regular shape style for vector features. The 
   * resulting shape will be a regular polygon when 
   * radius is provided, or a star when radius1 and 
   * radius2 are provided.
   * ベクタフィーチャの規則的な形状のスタイルを設定します。生じた
   * 形状は、radius が提供されたとき正多角形になり、または、
   * radius1 と radius2 が提供されたとき星形になります。
   * (ol3 API[説明は Stable Only のチェックを外すと表示])
   */
   fill: new ol.style.Fill({color: 'blue'}),
   /** ol.style.Fill 
    * Set fill style for vector features.
    * ベクタフィーチャの塗りつぶしスタイルを設定。
    * (ol3 API[説明は Stable Only のチェックを外すと表示])
    */
   stroke: stroke,
   points: 4,
   radius: 80,
   angle: Math.PI / 4
   /** Math.PI()
    * 円周率。約 3.14159 です。
    * (MDN[https://developer.mozilla.org/ja/docs/Web
    * /JavaScript/Reference/Global_Objects/Math/PI])
    */
  })
 })],
 'triangle': [new ol.style.Style({
  image: new ol.style.RegularShape({
   fill: new ol.style.Fill({color: 'red'}),
   stroke: stroke,
   points: 3,
   radius: 80,
   rotation: Math.PI / 4,
   angle: 0
  })
 })],
 'star': [new ol.style.Style({
  image: new ol.style.RegularShape({
   fill: new ol.style.Fill({color: 'green'}),
   stroke: stroke,
   points: 5,
   radius: 80,
   radius2: 4,
   angle: 0
  })
 })]
};
function createLayer(coordinates, styles, zIndex) {
 var feature = new ol.Feature(new ol.geom.Point(coordinates));
/** ol.Feature
 * A vector object for geographic features with a geometry 
 * and other attribute properties, similar to the features 
 * in vector file formats like GeoJSON.
 * GeoJSONのようなベクトルファイル形式のフィーチャに類似した、
 * ジオメトリとその他の属性プロパティを持つ地物フィーチャのため
 * のベクトルオブジェクト。(ol3 API)
 */
/** ol.geom.Point
 * Point geometry.(ol3 API)
 */
 feature.setStyle(styles);
 var source = new ol.source.Vector({
 /** ol.source.Vector
  * Provides a source of features for vector layers.
  * ベクタレイヤのフィーチャのソースを用意します。(ol3 API)
  */
  features: [feature]
 });
 var vectorLayer = new ol.layer.Vector({
 /** ol.layer.Vector
  * Vector data that is rendered client-side.
  * クライアント側で描画されたベクタデータ。(ol3 API)
  */
  source: source
 });
 vectorLayer.setZIndex(zIndex);
 /** setZIndex(zindex) 
  * Set Z-index of the layer, which is used to order layers 
  * before rendering. The default Z-index is 0.
  * 描画の前にレイヤを並べるために使用される、レイヤの Z-index を
  * 設定します。デフォルトの Z-index は、0 です。
  * (ol3 API[説明は Stable Only のチェックを外すと表示])
  */ 
 return vectorLayer;
}

var layer0 = createLayer([40, 40], styles['star'], 0);
var layer1 = createLayer([0, 0], styles['square'], 1);
var layer2 = createLayer([0, 40], styles['triangle'], 0);

var layers = [];
layers.push(layer1);
/** push(elem)
 * Insert the provided element at the end of the 
 * collection.
 * コレクションの最後に供給されたエレメントに挿入します。
 * Name: elem, Type: T, Description: Element
 * (ol3 API)
 */
layers.push(layer2);

var map = new ol.Map({
 layers: layers,
 target: 'map',
 view: new ol.View({
  center: [0, 0],
  zoom: 18
 })
});
layer0.setMap(map);
/** setMap(map)
 * Sets the layer to be rendered on a map. The map will 
 * not manage this layer in its layers collection, layer 
 * filters in ol.Map#forEachLayerAtPixel will not filter 
 * the layer, and it will be rendered on top. This is 
 * useful for temporary layers. To remove an unmanaged 
 * layer from the map, use #setMap(null).
 * To add the layer to a map and have it managed by 
 * the map, use ol.Map#addLayer instead.
 * 地図上に描画するためにレイヤを設定します。マップは、このレ
 * イヤをレイヤコレクションで管理しません。そして、
 * ol.Map#forEachLayerAtPixel のレイヤフィルタは、レイヤ
 * にフィルタを適用しません。そして、それは一番上にレンダリン
 * グされます。これは一時的なレイヤのために有用です。マップか
 * ら管理されていないレイヤを除去するには、#setMap(null)を
 * 使用します。
 * マップにレイヤを追加し、それをマップによって管理させるため
 * には、代わりに ol.Map#addLayer を使用してください。
 * (ol3 API[説明は Stable Only のチェックを外すと表示])
 */
function bindInputs(id, layer) {
 var idxInput = $('#idx' + id);
 idxInput.on('input change', function() {
 /** .on()
  * Attach an event handler function for one or more events 
  * to the selected elements.
  * イベントハンドラ関数を選択した要素(エレメント)に1つまたは
  * それ以上のイベントで取り付けます。
  * (jQuery[http://api.jquery.com/on/])
  */
  layer.setZIndex(parseInt(this.value, 10) || 0);
  /** parseInt(string, radix)
   * str: 文字列, radix: 基数(進法)
   * 文字列の引数をパースし、指定された基数の整数を返します。
   * (MDN[https://developer.mozilla.org/ja/docs/Web/
   * JavaScript/Reference/Global_Objects/parseInt])
   */
 });
 idxInput.val(String(layer.getZIndex()));
  /** .val()
   * Get the current value of the first element in the set 
   * of matched elements or set the value of every matched 
   * element.
   * マッチした要素のセットの最初の要素(エレメント)の現在の値を
   * 取得したり、すべての一致した要素の値を設定します。
   * (jQuery[http://api.jquery.com/val/])
   */
}
bindInputs(1, layer1);
bindInputs(2, layer2);

2 - ol3.9ex 130a - Z-index layer ordering example 1

「Z-index layer ordering example (layer-z-index.html)」を参考に地図を表示してみます。
説明に次のようにあります。

There are are two managed layers (square and triangle) and one unmanaged layer (star).
The Z-index determines the rendering order; with {square: 1, triangle: 0, star: unmanaged} indices, the rendering order is triangle, square and star on top.
2つの管理レイヤ(正方形と三角形)と1つの管理外レイヤ(星)があります。
Zインデックスは、描画順を決定します。 {正方形:1、三角形:0、星:管理外}インデックスで、描画順は、三角形、正方形、トップに星です。

HTML ファイルの作成
a Eclipse のメニューの「ファイル」->「ファイルを開く」をクリックします。





b 「ファイルを開く」ウィンドウで、「user」->「mapsite」->「ol3proj」->「v3.9.0」->「examples」->「layer-z-index.html」をクリックして選択し、「OK」ボタンをクリックします。
同じように「layer-z-index.js」を開きます。





c メニューの「ファイル」->「新規」 -> 「ファイル」をクリックします。



d 「ファイル」ウィンドウで「ol3proj」をクリックして選択し、「ファイル名」を「2130-ol3ex.html」と入力し、「次へ」ボタンをクリックします。








e 「File Template」ウィンドウで「HTML 5 Template」をクリックして選択し、「OK」ボタンをクリックします。











f 「layer-z-index.html」の内容をコピーして「2130-ol3ex.html」に貼り付け、修正します。
g 同じように、新規に「2130-ol3ex.js」ファイルを作成し、「File Template」ウィンドウで「JavaScript Template」をクリックして選択し、「完了」ボタンをクリックして、「layer-z-index.js」の内容をコピーして貼り付け、修正します。「layer-z-index-require.js」も「2130-ol3ex-require.js」に貼り付けます。

「2130-ol3ex.html」
<!doctype html>
<html lang="en">
 <head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="chrome=1">
  <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
  <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css" type="text/css">
  <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap-combined.min.css" type="text/css">
  <!--
  <link rel="stylesheet" href="../css/ol.css" type="text/css">
  <link rel="stylesheet" href="./resources/layout.css" type="text/css">

  <link rel="stylesheet" href="./resources/prism/prism.css" type="text/css">
  <script src="./resources/zeroclipboard/ZeroClipboard.min.js"></script>
  「resources」の位置が変わりました。
  -->
  <!-- ディレクトリ修正 -->
  <link rel="stylesheet" href="v3.9.0/css/ol.css" type="text/css">
  <link rel="stylesheet" href="v3.9.0/examples/resources/layout.css" type="text/css">

  <link rel="stylesheet" href="v3.9.0/examples/resources/prism/prism.css" type="text/css">
  <script src="v3.9.0/examples/resources/zeroclipboard/ZeroClipboard.min.js"></script>
  <title>Z-index layer ordering example</title>
 </head>
 <body>
  <!-- 
  bootstrap-combined.min.css, ol.css, layout.css,
  CSSファイルで設定されたセレクタを使用。
  -->
  <header class="navbar" role="navigation">
   <div class="container" id="navbar-inner-container">
    <!--
    <a class="navbar-brand" href="./"><img src="./resources/logo-70x70.png"> OpenLayers 3 Examples</a>
    -->
    <!-- ディレクトリ修正 -->
    <a class="navbar-brand" href="v3.9.0/examples/"><img src="v3.9.0/examples/resources/logo-70x70.png"> OpenLayers 3 Examples</a>
   </div>
  </header>
  <div class="container-fluid">
   <div class="row-fluid">
    <div class="span12">
     <div id="map" class="map"></div>
    </div>
   </div>
   <div>
    There are are two managed layers (square and triangle)
    and one unmanaged layer (star).</br>
    The Z-index determines the rendering order; with 
    {square: 1, triangle: 0, star: unmanaged} indices, 
    the rendering order is triangle, square and star on 
    top.
   </div>
   <div>
    <label for="idx1">
     <input type="number" id="idx1"></input>
     Square layer Z-index
    </label></br>
    <label for="idx2">
     <input type="number" id="idx2"></input>
     Triangle layer Z-index
    </label>
   </div>
   <div class="row-fluid">
    <div class="span12">
     <h4 id="title">Z-index layer ordering example</h4>
     <p id="shortdesc">Example of ordering layers using 
      Z-index. </p>
     <div id="docs"></div>
     <div id="tags">layer, ordering, z-index</div>
     <div id="api-links">Related API documentation: 
      <ul class="inline">
       <li>
        <!--<a href="../apidoc/ol.Feature.html" title="API documentation for ol.Feature">ol.Feature>/a> -->
        <a href="v3.9.0/apidoc/ol.Feature.html" title="API documentation for ol.Feature">ol.Feature</a>
       </li>,
       <li>
        <!--<a href="../apidoc/ol.Map.html" title="API documentation for ol.Map">ol.Map>/a> -->
        <a href="v3.9.0/apidoc/ol.Map.html" title="API documentation for ol.Map">ol.Map</a>
       </li>,
       <li>
        <!-- <a href="../apidoc/ol.View.html" title="API documentation for ol.View">ol.View>/a> -->
        <a href="v3.9.0/apidoc/ol.View.html" title="API documentation for ol.View">ol.View</a>
       </li>,
       <li>
        <!-- <a href="../apidoc/ol.geom.Point.html" title="API documentation for ol.geom.Point">ol.geom.Point>/a> -->
        <a href="v3.9.0/apidoc/ol.geom.Point.html" title="API documentation for ol.geom.Point">ol.geom.Point</a>
       </li>,
       <li>
        <!-- <a href="../apidoc/ol.layer.Vector.html" title="API documentation for ol.layer.Vector">ol.layer.Vector>/a> -->
        <a href="v3.9.0/apidoc/ol.layer.Vector.html" title="API documentation for ol.layer.Vector">ol.layer.Vector</a>
       </li>,
       <li>
        <!-- <a href="../apidoc/ol.source.Vector.html" title="API documentation for ol.source.Vector">ol.source.Vector>/a> -->
        <a href="v3.9.0/apidoc/ol.source.Vector.html" title="API documentation for ol.source.Vector">ol.source.Vector</a>
       </li>,
       <li>
        <!-- <a href="../apidoc/ol.style.Fill.html" title="API documentation for ol.style.Fill">ol.style.Fill>/a> -->
        <a href="v3.9.0/apidoc/ol.style.Fill.html" title="API documentation for ol.style.Fill">ol.style.Fill</a>
       </li>,
       <li>
        <!-- <a href="../apidoc/ol.style.RegularShape.html" title="API documentation for ol.style.RegularShape">ol.style.RegularShape>/a> -->
        <a href="v3.9.0/apidoc/ol.style.RegularShape.html" title="API documentation for ol.style.RegularShape">ol.style.RegularShape</a>
       </li>,
       <li>
        <!-- <a href="../apidoc/ol.style.Stroke.html" title="API documentation for ol.style.Stroke">ol.style.Stroke>/a> -->
        <a href="v3.9.0/apidoc/ol.style.Stroke.html" title="API documentation for ol.style.Stroke">ol.style.Stroke</a>
       </li>,
       <li>
        <!-- <a href="../apidoc/ol.style.Style.html" title="API documentation for ol.style.Style">ol.style.Style>/a> -->
        <a href="v3.9.0/apidoc/ol.style.Style.html" title="API documentation for ol.style.Style">ol.style.Style</a>
       </li>
      </ui>
     </div>
   </div>
  </div>
  <div class="row-fluid">
    <div id="source-controls">
     <a id="copy-button">
      <i class="fa fa-clipboard"></i> Copy
     </a>
     <a id="jsfiddle-button">
      <i class="fa fa-jsfiddle"></i> Edit
     </a>
    </div>
    <form method="POST" id="jsfiddle-form" target="_blank" action="http://jsfiddle.net/api/post/jquery/1.11.0/">
    <textarea class="hidden" name="js">
// --- 省略 ---
&lt;/html&gt;</code></pre>
   </div>
  </div>
  <script src="http://code.jquery.com/jquery-1.11.2.min.js"></script>
  <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
  <!--
  <script src="./resources/common.js"></script>
  <script src="./resources/prism/prism.min.js"></script>
  -->
  <!-- ディレクトリ修正
   CommonJS と
   prism.js
 -->
  <script src="v3.9.0/examples/resources/common.js"></script>
  <script src="v3.9.0/examples/resources/prism/prism.min.js"></script>
  <!-- 
  <script src="loader.js?id=layer-z-index"></script>
  -->
  <!-- ファイル修正 -->  <!-- ディレクトリ修正 -->
  <script src="loader.js?id=2130-ol3ex"></script>
  </body>
</html>


COMMONJS は

COMMONJS
http://webpack.github.io/docs/commonjs.html

に、次のようにあります。

The CommonJS group defined a module format to solve JavaScript scope issues by making sure each module is executed in its own namespace.
This is achieved by forcing modules to explicitly export those variables it wants to expose to the “universe”, and also by defining those other modules required to properly work.
To achieve this CommonJS give you two tools:
the require() function, which allows to import a given module into the current scope.
the module object, which allows to export something from the current scope.

CommonJSグループは、それ自身の名前空間内で実行されている各モジュールを確認することによって、JavaScriptのスコープ問題を解決するためのモジュールフォーマットを定義しました。
これは、それが「universe(?)」に公開したい変数を明示的にエクスポートするモジュールを強制することによって、同じように、正常に動作するのに必要な他のモジュールを定義することによって、達成されます。
この CommonJS を達成するために2つのツールを与えます:
require()関数、指定したモジュールを現在のスコープにインポートすることができます。
モジュールオブジェクト、現在のスコープからエクスポートすることができます。


Prism は、

Prism
http://prismjs.com/

に、次のようにあります。

Prism is a lightweight, extensible syntax highlighter, built with modern web standards in mind. It’s a spin-off from Dabblet and is tested there daily by thousands.
Prismは、最新のWeb標準に構築されたことを考慮し軽量で拡張可能なシンタックスハイライトです。それは Dabblet からスピンオフで、何千人も日々そこで試験されています。


ZeroClipboard は

ZeroClipboard v2.x
http://zeroclipboard.org/

に、次のようにあります。

The ZeroClipboard library provides an easy way to copy text to the clipboard using an invisible Adobe Flash movie and a JavaScript interface.
ZeroClipboard ライブラリは、見えない Adobe Flash ムービーとJavaScript のインターフェイスを使用してテキストをクリップボードにコピーする簡単な方法を提供します。

Debian 8 では動作しませんでした。ボタンを右クリックしたときに flash のコンテキストメニューが表示されると動作しています。