2011年4月27日水曜日

16 pgRouting in Debian6 10 - ルーティングをブラウザで表示6

9.5. What’s next ?

を説明していきます。
訳しながらみていきたいと思います。

*****
拡張の可能性:

* 始点/終点ポイントを取得するジオコーディングサービスの使用
* way ポイントのサポート
* 始点と終点ポイントのための素晴らしいアイコン
* ドライブ方向(ロードマップ):我々はすでにセグメントの長さを持っている
*****

9.6. Full source code

実際にルーティングを表示したマップのコードです。

routing_geoext_page.html.gz



長いルートの表示には時間がかかりました。
広域表示のときは、高速道路や幹線道路を経由するように cost の値を調整する必要があります。

16 pgRouting in Debian6 10 - ルーティングをブラウザで表示5

9.4. Trigger the web service call
ウェッブサービス呼び出しトリガー

で、コードを説明しています。
訳しながらみていきたいと思います。

*****
次のときにWebサービスを呼び出す必要があります:

* 2つのポイントが描かれている
* ポイントの一つが移動している
* ルーティング方式が変更されている

新しいフィーチャが追加されたときに、ベクトルレイヤは(featureadded と呼ばれる)イベントを発生します。すなわち、このイベントを待ち受け、pgrouting 関数(この関数はすぐに表示されます)を呼び出すことができます。:

draw_layer.events.on({
featureadded: function() {
pgrouting(store, draw_layer, method.getValue());
}
});

注意
イベントに関するいくつかの説明を続ける前に:OpenLayers のイベント(ExtJSや他のフレームワークの同じ apply)は、何かが起こったときに呼び出される関数を許可するシステムです。例えば、レイヤがマップに追加されるときや、マウスがフィーチャと重なるときです。複数の関数は、同じイベントに接続することができます。

ポイントの移動のとき発生するイベントがない、幸いに、点が移動したときに呼びだすための DragFeature コントロールに関数を与えることができます。:

drag_points.onComplete = function() {
pgrouting(store, draw_layer, method.getValue());
};

method combo のために、(ユーザが値を変更したときイベントが発生する)選択引数によって待ち受けオプションをコンストラクタに追加することができます:

var method = new Ext.form.ComboBox({
renderTo: "method",
triggerAction: "all",
editable: false,
forceSelection: true,
store: [
["SPD", "Shortest Path Dijkstra"],
["SPA", "Shortest Path A*"],
["SPS", "Shortest Path Shooting*"]
],
listeners: {
select: function() {
pgrouting(store, draw_layer, method.getValue());
}
});

pgrouting 関数を提供するとき:

// global projection objects (uses the proj4js lib)
var epsg_4326 = new OpenLayers.Projection("EPSG:4326"),
epsg_900913 = new OpenLayers.Projection("EPSG:900913");

function pgrouting(store, layer, method) {
if (layer.features.length == 2) {
// erase the previous route
store.removeAll();

// transform the two geometries from EPSG:900913 to EPSG:4326
var startpoint = layer.features[0].geometry.clone();
startpoint.transform(epsg_900913, epsg_4326);
var finalpoint = layer.features[1].geometry.clone();
finalpoint.transform(epsg_900913, epsg_4326);

// load to route
store.load({
params: {
startpoint: startpoint.x + " " + startpoint.y,
finalpoint: finalpoint.x + " " + finalpoint.y,
method: method
}
});
}
}

pgrouting 関数は、ストアの引数を介してWebサービスを呼び出します。

最初に、2つのポイントが引数で渡された場合、関数がチェックします。その次に、store.removeAll()はレイヤ(ストアとベクトルレイヤが結びついていることを思い出してください)​​から前の結果を消去するために呼び出されます。 2つの点の座標が次に OpenLayers.Projection インスタンスを使用して投影されます。

最後に、store.load()は pgrouting.php 引数を表す params で呼び出されます(それらがHTTP GET 呼び出しへ渡されます)。
*****
続く ...

16 pgRouting in Debian6 10 - ルーティングをブラウザで表示4

9.3. Call and receive data from web service
ウェッブサービスからデータを呼び出し受け取る

で、コードを説明しています。
訳しながらみていきたいと思います。

*****
ウェッブサービスからルートを取得する基本的なワークフローは、

1.点の座標を EPSG:900913 から EPSG:4326 へ変換する
(今回の東京都のマップの場合は、 EPSG:2456 から EPSG:4326 へ変換)
2.ウェッブサービスを正確な引数(メソッド名と2つの点の座標)で呼び出す
3.ウェッブサービスの応答を解析する: GeoJSON を OpenLayers.Feature.Vector へ変換する
4.すべての座標を EPSG:4326 から EPSG:900913 へ変換する
(今回の東京都のマップの場合は、 EPSG:4326 から EPSG:2456 へ変換)
5.この結果をベクトルレイヤへ追加する

最初の項目は、新しいものです。すなわち、地図は EPSG:900913(東京都のマップは EPSG:2456) 投影(OSM レイヤを使用するため)を使用して、Webサービスは EPSG:4326 座標を期待しています。そのため、データを送信する前に再投影する必要があります。これは大したことではありません。それには、Proj4js の JavaScript ライブラリを使用するだけです。

(2番目の項目は、次の章で説明されている Web サービスを呼び出します。)

pgrouting.php のルーティング Web サービスは、GeoJSON へ FeatureCollection オブジェクトを返します。FeatureCollection は、単にフィーチャの配列です。すなわち、各ルートセグメントに対して1つのフィーチャです。 OpenLayers と GeoExtは、この形式を処理するために必要なすべてのものを持っているので、これは非常に便利です。作業を効率的にするため、GeoExt.data.FeatureStore を使用します:

var store = new GeoExt.data.FeatureStore({
layer: route_layer,
fields: [
{name: "length"}
],
proxy: new GeoExt.data.ProtocolProxy({
protocol: new OpenLayers.Protocol.HTTP({
url: './php/pgrouting.php',
format: new OpenLayers.Format.GeoJSON({
internalProjection: epsg_900913,
externalProjection: epsg_4326
})
})
})
});

ストアは、単に情報を記憶するためのコンテナです:データを送り出し、取り出すことができます。

すべてのオプションを説明します:

layer:引数はベクトルレイヤです。すなわち、レイヤを指定することにより、FeatureStore は自動的にこのレイヤに受信されたデータを描画します。これは、上記のリストの最後の項目(ベクトルレイヤにこの結果を追加)に必要なものです。

fields:ジオメトリと一緒に返されるすべての属性を示します。すなわち、ここに設定することで pgrouting.php はセグメントの長さを返します。この情報は、このワークショップで使用されていないことに注意してください。

proxy:プロキシの項目はデータが取得される場所を指定します。すなわち、今回は HTTP サーバからの場合、になっています。プロキシ型は GeoExt.data.ProtocolProxy です。すなわち、このクラスは ExtJS の世界(ストア)と OpenLayers の世界(プロトコルオブジェクト)を接続します。

protocol:この OpenLayers コンポーネントは、URL(PHPスクリプト)にHTTP 要求を作成し、応答(フォーマットオプション)を解析することができます。 internalProjection と externalProjection オプションを追加することにより、形式によって座標の再投影が実行されます。

私たちは今、Webサービスによって返されたデータを処理するために必要なすべてのものを持っています。次の章では、サービスを呼び出すタイミングと方法を説明します:
*****
続く ...

16 pgRouting in Debian6 10 - ルーティングをブラウザで表示3

9.2. Select the start and final destination

で、コードを説明しています。
訳しながらみていきたいと思います。

*****
ユーザーが始点および終点宛を描画し移動できるようにします。これは、Googleマップや他のものと引けを取らない動作です。ユーザーが検索ボックス(アドレス検索)を介して、またはマップをクリックして、ポイントを選択します。システムはサーバーを検索し、地図上に経路を表示します。ユーザーは後で始点または終点ポイントを移動し、ルートを更新することができます。

このワークショップでは、地図を介した入力(ポイントやドラッグ&ドロップの描画)を実装しますが、地図製作や他のジオコーディングサービスのような Web サービスを使用することによって、検索ボックスの機能を実装することが可能です。

これを行うには、ポイントを描画するためのツール(OpenLayers.Control.DrawFeatures コントロールを使用します)とポイントを移動するためのツール(OpenLayers.Control.DragFeatures はこの作業に最適です)が必要になります。この名前は、これらのコントロールが OpenLayers から来ているを示しています。

これらの2つのコントロールは、ポイントを描画して操作する場所が必要になります。同様に、OpenLayers.Layer.Vector.Layers が必要になります。 OpenLayersでは、ベクトルレイヤは、フィーチャ(形状と属性)がプログラム的に描画することができる場所(対照的に、OSM レイヤはラスタレイヤです。)です。
(注釈:今回の東京都の地図では、OSM レイヤは WMS レイヤです。)

ベクトルレイヤが機能が低い(?)ので、Webサービスから返された経路を描画する2番目の方法を使用します。レイヤの初期化は:

// create the layer where the route will be drawn
var route_layer = new OpenLayers.Layer.Vector("route", {
styleMap: new OpenLayers.StyleMap(new OpenLayers.Style({
strokeColor: "#ff9933",
strokeWidth: 3
}))
});

"route" は、レイヤ名で、任意の文字列を使用することができます。 styleMap は、レイヤーに任意の線の色と幅(ピクセル単位)の少しの視覚スタイルを提供します。

2番目のレイヤの初期化は簡単で

// create the layer where the start and final points will be drawn 
// 始点と終点を描くレイヤの作成
var points_layer = new OpenLayers.Layer.Vector("points");

OpenLayers.Map object に2つのレイヤを追加:

// add the layers to the map
map.addLayers([points_layer, route_layer]);

ポイントを描画するコントロールを見てみましょう:このコンポーネントは特殊な動作をするので、OpenLayers.Control.DrawFeatures コントロールに基づいて新しいクラスを作成するのはより簡単です。この新しいコントロールは、(DrawPoints という名前)で分けられた JavaScript のファイル(web/DrawPoints.js)に保存されます:

DrawPoints = OpenLayers.Class(OpenLayers.Control.DrawFeature, {

// this control is active by default
autoActivate: true,

initialize: function(layer, options) {
// only point can be drawn
var handler = OpenLayers.Handler.Point;
OpenLayers.Control.DrawFeature.prototype.initialize.apply(
this, [layer, handler, options]
);
},

drawFeature: function(geometry) {
OpenLayers.Control.DrawFeature.prototype.drawFeature.apply(
this, arguments
);
if (this.layer.features.length == 1) {
// we just draw the startpoint
// note: if we want to apply a special style to the
// start point we should do this here
} else if (this.layer.features.length == 2) {
// we just draw the finalpoint
// note: if we want to apply a special style to the
// final point we should do this here

// we have all what we need; we can deactivate ourself.
this.deactivate();
}
}
});

初期化関数(クラスコンストラクタです)では、このコントロールがポイントを描くことができるように設定します(ハンドラ変数は OpenLayers.Handler.Point)。

特別な動作は drawFeature 関数で実装されています:始点と終点だけが必要なので、vector layer にあるフィーチャがいくつか数えることによって、2つのポイントが描かれたときコントロールは自動的に非アクティブになります。コントロールの非アクティブ化は、this.deactivate() です。

コントロールはつぎのように作成します:

// create the control to draw the points (see the DrawPoints.js file)
var draw_points = new DrawPoints(points_layer);

points_layer はより早く作成されるベクトルレイヤです。

DragFeature コントロールは:

// create the control to move the points
var drag_points = new OpenLayers.Control.DragFeature(points_layer, {
autoActivate: true
});

もう一度、points_layer はベクトルレイヤで、autoActivate: true は、OpenLayers にこのコントロールを自動的にアクティブ化したいことをつげます。

// add the controls to the map
map.addControls([draw_points, drag_points]);

マップにコントロールを追加します。
*****
続く ...

16 pgRouting in Debian6 10 - ルーティングをブラウザで表示2

9.1. Routing method selection

で、コードを説明しています。
訳しながらみていきたいと思います。

*****
ルーティング方法を選択するために、Ext.form.ComboBox を使用します:これは、通常の html の select と同じように動作しますが、より簡単に制御することができます。

GeoExt.MapPanel と同じように、コントロールを配置するために、html 要素が必要です。(ID としての 'method' を使用して)body タグの間に新しい div を作成します:

<body>
<div id="gxmap"></div>
<div id="method"></div>
</body>

次に、それ自身の combo を作成します。

var method = new Ext.form.ComboBox({
renderTo: "method",
triggerAction: "all",
editable: false,
forceSelection: true,
store: [
["SPD", "Shortest Path Dijkstra"],
["SPA", "Shortest Path A*"],
["SPS", "Shortest Path Shooting*"]
]
});

ストアのオプションには、ルーティングメソッドにすべての可能な値を設定します。形式は、オプションが [key、name] フォームのオプションの配列です。key は、サーバー(この例では PHP スクリプト)と combo に表示された値に送信されます。

renderTo は、combo がレンダリングされる必要がある場所を指定し、ここで新しい div を使用します。

そして最後に、デフォルト値が選択されます:

method.setValue("SPD");

この部分は ExtJS コンポーネントを使用し: OpenLayers や GeoExtコードはここにいりません。
*****
続く ...

16 pgRouting in Debian6 10 - ルーティングをブラウザで表示1

9. GeoExt Browser Client
http://workshop.pgrouting.org/chapters/geoext_client.html

を参考に Web ブラウザでルーティングを表示してみます。
Synaptic パッケージマネージャで php5-pgaql をインストールしておきます。
Eclipse でマップ製作のためのプロジェクトを作成します。

1 Eclipse を起動し、Aptana Web パースペクティブで、ファイル->新規->新規プロジェクトをクリックします。
2 「プロジェクト」ウィンドウの「プロジェクト名」に「routingproj」と入力し「次へ」ボタンをクリックします。
3 「Project Template」で「完了」ボタンをクリックします。

Eclipse に OpenLayers、Ext、GeoExt、Proj4js ライブラリをインポートします。

OpenLayers 2.10
OpenLayers
http://openlayers.org/

Ext JS 3.3.0
Ext Japan
http://www.extjs.co.jp/

GeoExt 1.0
GeoExt
http://www.geoext.org/

Proj4js 1.0.1
Proj4js Wiki/Trac
http://trac.osgeo.org/proj4js/


解凍したフォルダを ファイル -> インポート をクリックします。
インポートの「選択」ウィンドウで 一般 -> ファイルシステム を選択して「次へ」ボタンをクリックします。
「ファイルシステム」ウィンドウで「次のディレクトリから」に解凍したフォルダに一つ上のディレクトリを指定し、「ダウンロード」を展開して各フォルダにチェックをつけ、「宛て先フォルダ」が「routingproj」なの絵お確認し「完了」ボタンをクリックします。

Aptana unified Builder が表示されて動作が進まないときは、プロジェクト -> 自動ビルド のチェックを外して Eclipse を再起動してください。

シンプル GeoExt サンプルを東京都用にかえてみます。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

<title>A Basic GeoExt Page</title>
<script src="ext/libraries/lib/ext/adapter/ext/ext-base.js" type="text/javascript"></script>
<script src="ext/libraries/lib/ext/ext-all.js" type="text/javascript"></script>
<link rel="stylesheet" type="text/css" href="ext/libraries/lib/ext/resources/css/ext-all.css" />
<script src="OpenLayers-2.10/lib/OpenLayers.js" type="text/javascript"></script>
<script src="GeoExt/lib/GeoExt.js" type="text/javascript"></script>
<link rel="stylesheet" type="text/css" href="GeoExt/resources/css/geoext-all-debug.css" />
<!-- Proj4js ライブラリ -->
<script type="text/javascript" src="proj4js/lib/proj4js/lib/proj4js-compressed.js"></script>
<script type="text/javascript" src="proj4js/lib/proj4js/lib/projCode/tmerc.js"></script>
<script type="text/javascript" src="proj4js/lib/proj4js/lib/defs/EPSG2456.js"></script>
<script type="text/javascript" src="proj4js/lib/proj4js/lib/defs/EPSG900913.js"></script>

<script type="text/javascript">
Ext.onReady(function() {
// 東京都用マップ設定
var map = new OpenLayers.Map('map', {
controls: [
new OpenLayers.Control.PanZoom(),
new OpenLayers.Control.LayerSwitcher(),
new OpenLayers.Control.MousePosition(),
new OpenLayers.Control.ScaleLine()
],
projection: new OpenLayers.Projection("EPSG:2456"),
maxResolution: 'auto',
maxExtent: new OpenLayers.Bounds(-279000,1054000,-185000,1104000),
units: 'meters',
displayProjection: new OpenLayers.Projection("EPSG:4326")
});
var panel = new GeoExt.MapPanel({
renderTo: 'gxmap',
/*
map: {
layers: [new OpenLayers.Layer.OSM("Simple OSM Map")]
},
center: [245300, 5070600],
zoom: 11,
*/
map: map,
layers: [new OpenLayers.Layer.WMS( "Tokyo Height WMS",
"http://192.168.1.141/cgi-bin/mapserv?",
// "http://localhost/cgi-bin/mapserv?",
{
map: '/home/user/mapfile/nippon_bmi_tokyo_pgis2.map',
layers: 'tokyo_tokosen',
format: 'image/png'
}),
new OpenLayers.Layer.WMS( "Tokyo Kukaku Sen WMS",
"http://192.168.1.141/cgi-bin/mapserv?",
// "http://localhost/cgi-bin/mapserv?",
{
map: '/home/user/mapfile/nippon_bmi_tokyo_pgis2.map',
layers: 'tokyo_kukaku',
transparent: true,
format: 'image/png'
}),
new OpenLayers.Layer.WMS( "OpenStreetMap WMS",
"http://192.168.1.141:8080/geoserver/wms?",
{
layers: 'japan_highway',
transparent: true,
format: 'image/png'
},{
projection: new OpenLayers.Projection("EPSG:900913")
})
],
height: 400,
width: 600,
title: 'A Simple GeoExt Map'
});
});
</script>
</head>
<body>
<div id="gxmap"></div>
</body>
</html>

最初、web ブラウザで表示できませんでした。
調べてみるとEclipsw にインストールした JavaScript ライブラリのパーミッションが mod で 600 になっていたので 755 にしました。

user@deb6-vmw:~/mapsite/routingproj$ ls -l
合計 56
drw------- 7 user user 4096 2011-04-05 11:23 GeoExt
drw------- 13 user user 4096 2011-04-05 11:23 OpenLayers-2.10
-rw-r--r-- 1 user user 2916 2011-04-09 22:31 basic_geoext_page.html
drw------- 10 user user 4096 2011-04-10 10:46 ext-3.3.0
-rw-r--r-- 1 user user 356 2011-04-04 14:33 index.html
drw------- 8 user user 4096 2011-04-05 11:23 proj4js

user@deb6-vmw:~/mapsite/routingproj$ chmod -R 755 GeoExt
user@deb6-vmw:~/mapsite/routingproj$ chmod -R 755 OpenLayers-2.10
user@deb6-vmw:~/mapsite/routingproj$ chmod -R 755 ext-3.3.0
user@deb6-vmw:~/mapsite/routingproj$ chmod -R 755 proj4js

user@deb6-vmw:~/mapsite/routingproj$ ls -l
合計 56
drwxr-xr-x 7 user user 4096 2011-04-05 11:23 GeoExt
drwxr-xr-x 13 user user 4096 2011-04-05 11:23 OpenLayers-2.10
-rw-r--r-- 1 user user 2916 2011-04-09 22:31 basic_geoext_page.html
drwxr-xr-x 10 user user 4096 2011-04-10 10:46 ext-3.3.0
-rw-r--r-- 1 user user 4226 2011-04-10 11:44 geoext01_basic-ex.html
-rw-r--r-- 1 user user 356 2011-04-04 14:33 index.html
drwxr-xr-x 8 user user 4096 2011-04-05 11:23 proj4js

内容を試しに訳してコードをみます。
*****
ヘッダには、アプリケーションに必要なすべての JavaScript と CSS のが含まれています。また、ページがが読み込まれる(Ext.onReady)ときに実行される関数を定義しています。
この関数は、バルセロナ(作成しているのは東京)が中心の OpenStreetMap のレイヤで GeoExt.MapPanel を作成します。このコードには、OpenLayers.Map が(今回はあります)明示的に作成されていません。GeoExt.MapPanel が、hood の下にこれを行うには:それはマップのオプション、center と zoom を設定し、それに応じてマップのインスタンスを作成します。

ユーザーが方向を取得できるようにするには、次のものを提供する必要があります:

* ルーティングアルゴリズム(Shortest path Dijkstra, A* or Shooting*)を選択する方法、
* 始点と終点を選択する方法です。

注意

この章では、コードスニペットを示すだけで、ページの完全なソースコードは、あなたのデスクトップにある pgrouting-workshop/web/routing-final.html で見つけることができます。完全なリストは、この章の最後に記載しています。
*****
続く ...

2011年4月25日月曜日

16 pgRouting in Debian6 9 - PHP を使ったサーバサイドスクリプト

8. Server side script with PHP
http://workshop.pgrouting.org/chapters/php_server.html

を参考に PHP を使ってルーティングの結果を Web クライアントに送るコードを作成します。
内容を訳してみます。

*****
次の工程が必要です。

* 開始点と終了点の座標の取得。
* 始点/終点ポイントに最も近いエッジを検索。
* このエッジの開始または終了の頂点(Dijkstra/A-Starの場合)またはルートの始点と終点のそれぞれ完全なエッジ(シューティングスター)のいずれかの取得。
* 最短経路データベースクエリの作成。
* クエリの結果をXMLへ、または、よりよい GeoJSON へ変換し Web クライアントに送り返す。

いくつかの PHP テンプレートで始めます。それから、このファイルを Apache でアクセス可能なディレクトリに配置します:
*****

上記に従って、Eclipse を起動して workspase を mapsite ディレクトリにし、 新規に routingproj プロジェクトを作成します。

1 Eclipse を起動し、Aptana Web パースペクティブで、ファイル->新規->新規プロジェクトをクリックします。
2 「プロジェクト」ウィンドウの「プロジェクト名」に「routingproj」と入力し「次へ」ボタンをクリックします。
3 「Project Template」で「完了」ボタンをクリックします。


PHP コードの作成を支援するため PDT をインストールします。

Eclipseのメインメニューより、「Help → Software Updates → Find and Install」から「使用可能なソフトウェア」ウィンドウの「作業対象」で「Helios - http://download.eclipse.org/releases/helios」を選択します。
「名前」に表示された「PHP 開発ツール (PDT) SDK フィーチャー 2.2.1.v20101001-2300-53184QAN4JBQgLYPWMLcXn6Na9Od」にチェックをつけ「次へ」ボタンをクリックします。
「インストール詳細」ウィンドウで「次へ」ボタンをクリックします。
「ライセンスのビュー」ウィンドウで、「使用条件に同意します」をチェックし「完了」ボタンをクリックします。


次の内容の pgrouting.php ファイルを routingproj/php フォルダに作成します。
(注釈:このコードは、データベースの接続と始点及び終点のデータを取り戻しています。)

<?php

// Database connection settings
define("PG_DB" , "routing");
define("PG_HOST", "localhost");
define("PG_USER", "postgres");
define("PG_PORT", "5432");
define("TABLE", "ways");

// Retrieve start point
$start = split(' ',$_REQUEST['startpoint']);
$startPoint = array($start[0], $start[1]);

// Retrieve end point
$end = split(' ',$_REQUEST['finalpoint']);
$endPoint = array($end[0], $end[1]);

?>


8.1. Closest edge の内容を訳してみます。

*****
通常、クライアントから取得される始点と終点は、エッジの始点または終点の頂点ではありません。Shooting Star アルゴリズムは、"エッジベース"なので、最も近い頂点に比べて最も近いエッジを探す方が便利です。 "頂点ベースの"アルゴリズム(Dijkstra、A-Star)では、選択されたエッジの任意の始点またはの終点を選択することができます。
*****

<?php

// Find the nearest edge
$startEdge = findNearestEdge($startPoint);
$endEdge = findNearestEdge($endPoint);

// FUNCTION findNearestEdge
function findNearestEdge($lonlat) {

// Connect to database
$con = pg_connect("dbname=".PG_DB." host=".PG_HOST." user=".PG_USER);

$sql = "SELECT gid, source, target, the_geom,
distance(the_geom, GeometryFromText(
'POINT(".$lonlat[0]." ".$lonlat[1].")', 4326)) AS dist
FROM ".TABLE."
WHERE the_geom && setsrid(
'BOX3D(".($lonlat[0]-0.1)."
".($lonlat[1]-0.1).",
".($lonlat[0]+0.1)."
".($lonlat[1]+0.1)."
)'::box3d, 4326)
ORDER BY dist LIMIT 1";

$query = pg_query($con,$sql);

$edge['gid'] = pg_fetch_result($query, 0, 0);
$edge['source'] = pg_fetch_result($query, 0, 1);
$edge['target'] = pg_fetch_result($query, 0, 2);
$edge['the_geom'] = pg_fetch_result($query, 0, 3);

// Close database connection
pg_close($con);

return $edge;
}

?>

8.2. Routing query
(注釈:ルーティングクエリーの実行)

<?php

// Select the routing algorithm
switch($_REQUEST['method']) {

case 'SPD' : // Shortest Path Dijkstra

$sql = "SELECT rt.gid, ST_AsGeoJSON(rt.the_geom) AS geojson,
length(rt.the_geom) AS length, ".TABLE.".gid FROM ".TABLE.", (
SELECT gid, the_geom FROM dijkstra_sp_delta(
'".TABLE."',
".$startEdge['source'].",
".$endEdge['target'].",
0.1
)
) as rt WHERE ".TABLE.".gid=rt.gid;";
break;

case 'SPA' : // Shortest Path A*

$sql = "SELECT rt.gid, ST_AsGeoJSON(rt.the_geom) AS geojson,
length(rt.the_geom) AS length, ".TABLE.".gid FROM ".TABLE.", (
SELECT gid, the_geom FROM astar_sp_delta(
'".TABLE."',
".$startEdge['source'].",
".$endEdge['target'].",
0.1
)
) as rt WHERE ".TABLE.".gid=rt.gid;";
break;

case 'SPS' : // Shortest Path Shooting*

$sql = "SELECT rt.gid, ST_AsGeoJSON(rt.the_geom) AS geojson,
length(rt.the_geom) AS length, ".TABLE.".gid FROM ".TABLE.", (
SELECT gid, the_geom FROM shootingstar_sp(
'".TABLE."',
".$startEdge['gid'].",
".$endEdge['gid'].",
0.1, 'length', true, true
)
) as rt WHERE ".TABLE.".gid=rt.gid;";
break;

} // close switch

// Connect to database
$dbcon = pg_connect("dbname=".PG_DB." host=".PG_HOST." user=".PG_USER);

// Perform database query
$query = pg_query($dbcon,$sql);

?>

8.3. GeoJSON output の内容を訳してみます。

*****
OpenLayers は、直接 GeoJSON 形式を使用して線を描画することができます。なので、このスクリプトは、GeoJSON FeatureCollection オブジェクトを返します。:
*****

<?php

// Return route as GeoJSON
$geojson = array(
'type' => 'FeatureCollection',
'features' => array()
);

// Add edges to GeoJSON array
while($edge=pg_fetch_assoc($query)) {

$feature = array(
'type' => 'Feature',
'geometry' => json_decode($edge['geojson'], true),
'crs' => array(
'type' => 'EPSG',
'properties' => array('code' => '4326')
),
'properties' => array(
'id' => $edge['id'],
'length' => $edge['length']
)
);

// Add feature array to feature collection array
array_push($geojson['features'], $feature);
}


// Close database connection
pg_close($dbcon);

// Return routing result
header('Content-type: application/json',true);
echo json_encode($geojson);

?>

16 pgRouting in Debian6 8 - 高度なルーティングクエリ

7. Advanced Routing Queries 高度なルーティングクエリ
http://workshop.pgrouting.org/chapters/advanced.html

を試しに訳してみます。
インストールしたデータでみていきます。

前の章で説明した最短経路のクエリは通常は次のようになります。

routing2=# SELECT * FROM shortest_path_shooting_star('
SELECT gid as id, source, target, length as cost,
x1, y1, x2, y2,
rule,
to_cost,
reverse_cost FROM ways',10, 1, true, true);

これは、最短経路と呼ばれ、エッジの長さがその cost という意味です。
しかし、cost が長さである必要はありません。
cost は、時間、坂、表面、道路の種類など何にもなります。
また、複数のパラメータの組み合わせにもなります。

7.1. Weighted costs

実際のネットワークでは、異なる制限や様々な道路の種類などの設定があります。言い換えれば、私たちは最短距離を取得する必要はありませんが、格安パス-最小限のコストが欲しいときもあります。コストとしてかかるものに制限はありません。

osm2pgrouting ツールを使用して OSM 形式のデータを変換すると、道路の種類と道路クラスの2つの追加テーブルを取得します:

Note
We switch now to the database we previously generated with osm2pgrouting. From within PostgreSQL shell this is possible with the \c routing command.

前回 osm2pgrouting で生成したデータベースにすぐ切り替えます。 PostgreSQL シェル内から、これは \c ルーティングコマンドで可能です。

Run: SELECT * FROM types;

id | name
-----+------------
2 | cycleway
1 | highway
4 | junction
3 | tracktype

Run: SELECT * FROM classes;

id | type_id | name | cost
-----+---------+------------------+--------
201 | 2 | lane |
204 | 2 | opposite |
203 | 2 | opposite_lane |
202 | 2 | track |
120 | 1 | bridleway |
116 | 1 | bus_guideway |
121 | 1 | byway |
118 | 1 | cicleway |
119 | 1 | footway |
111 | 1 | living_street |
101 | 1 | motorway |
103 | 1 | motorway_junction|
102 | 1 | motorway_link |
117 | 1 | path |
114 | 1 | pedestrian |
106 | 1 | primary |
107 | 1 | primary_link |
110 | 1 | residential |
100 | 1 | road |
108 | 1 | secondary |
112 | 1 | service |
115 | 1 | services |
122 | 1 | steps |
109 | 1 | tertiary |
113 | 1 | track |
104 | 1 | trunk |
105 | 1 | trunk_link |
100 | 1 | unclassified |
401 | 4 | roundabout |
301 | 3 | grade1 |
302 | 3 | grade2 |
303 | 3 | grade3 |
304 | 3 | grade4 |
305 | 3 | grade5 |
(END):q

road クラスは class_id フィールドによって ways テーブルにリンクされています。
データのインポート後の cost 属性がまだ設定されていません。
その値は、UPDATE クエリを使用して変更することができます。
この例では、クラステーブルのコスト値は、任意に割り当てられるので、実行します:
(実際につぎのように実行します。)

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

パフォーマンスを向上させるため、特にネットワークのデータが大きい場合は、 ways テーブルの class_id フィールドと最終的に types テーブルの id フィールドにインデックスを作成することをお勧めします。

routing2=# CREATE INDEX ways_class_idx ON ways (class_id);
CREATE INDEX
routing2=# CREATE INDEX classes_idx ON classes (id);
CREATE INDEX

これら2つのテーブルの背後にある考え方は、各リンク(通常は長さ)の cost で乗算する係数を指定することです:

routing2=# SELECT * FROM shortest_path_shooting_star(
'SELECT gid as id, class_id, source, target, length*c.cost as cost,
x1, y1, x2, y2, rule, to_cost, reverse_cost*c.cost as reverse_cost
FROM ways w, classes c
WHERE class_id=c.id', 10, 1, true, true);

vertex_id | edge_id | cost
-----------+---------+--------------------
8 | 10 | 0.21436682583899
16 | 28 | 0.0616578808755829
18 | 29 | 0.0503517776608
20 | 30 | 0.0322363573642631
22 | 31 | 0.0152758932742916
24 | 383280 | 0.0193755609874666
294 | 207 | 0.14332341972053
76 | 76 | 0.0843040186165352
63 | 67 | 0.157592613117751
65 | 78 | 0.0681030174865841
56 | 62 | 0.118968821186703
57 | 591 | 0.069506289950689
964 | 12984 | 0.0607971743633479
20274 | 380597 | 0.0829580759736785
302 | 214 | 0.0948843293578448
27 | 36 | 0.190297596187546
28 | 1 | 0.680805240753506
(17 行)

~
(stdin):q

(6.3. Shooting-Star の 6.3.1. Core の結果と違うので経路が変更されたようです。reverse_cost を使用していないからかもしれませんが。)

7.2. Restricted access¶

もう一つの可能性は、特定の属性で道路リンクに非常に高いコストを設定するか、または、特定の道路リンクをまったく選択していないことにより、特定の種類の道路へのアクセスを制限することです:

UPDATE classes SET cost=100000 WHERE name LIKE 'motorway%';

サブクエリを通してあなたが好きなようにあなたのコストを"ミックス"することができます。これはすぐにルーティング要求の結果を変更します。コストの変化は、次の最短経路の検索に影響を与え、あなたのネットワークを再構築する必要はありません。

もちろん、特定の道路のクラスは同様のクエリのWHERE句で除外することができます。例えば、"living_street"クラスを除外する場合:

SELECT * FROM shortest_path_shooting_star(
'SELECT gid as id, class_id, source, target, length*c.cost as cost,
x1, y1, x2, y2, rule, to_cost, reverse_cost*c.cost as reverse_cost
FROM ways w, classes c
WHERE class_id=c.id AND class_id != 111', 10, 1, true, true);

vertex_id | edge_id | cost
-----------+---------+--------------------
8 | 10 | 0.21436682583899
16 | 28 | 0.0616578808755829
18 | 29 | 0.0503517776608
20 | 30 | 0.0322363573642631
22 | 31 | 0.0152758932742916
24 | 383280 | 0.0193755609874666
294 | 207 | 0.14332341972053
76 | 76 | 0.0843040186165352
63 | 67 | 0.157592613117751
65 | 78 | 0.0681030174865841
56 | 62 | 0.118968821186703
57 | 591 | 0.069506289950689
964 | 12984 | 0.0607971743633479
20250 | 380597 | 0.0829580759736785
302 | 214 | 0.0948843293578448
27 | 36 | 0.190297596187546
28 | 1 | 0.680805240753506
(17 行)

~
(stdin):q
(結果が変わらないのでこのルートでは living_street がないようです。)

もちろん、pgRouting は、あなたに PostgreSQL/PostGIS で可能なすべての種類のSQLを許可します。

16 pgRouting in Debian6 7 - ルートの検索3 Shooting-Star

6.3. Shooting-Star
Shooting-Star アルゴリズムは、最新の pgRouting 最短経路アルゴリズムです。
その特徴は、リンクからリンクへルートを決めることで、Dijikstra や A-Star アルゴリズムのように vertex から vertex ではありません。
これは、例えばリンク間の関係を定義することを可能にし、「パラレルリンク」のようなほかの vertex が基本となるアルゴリズムの問題を解決し、同じ source と target で、違う costs を持ってます。

Prerequisites は、既に設定済みです。

Shooting-Star algorithm introduces two new attributes
Shooting-Star の新しい2つの属性の紹介

rule:
カンマで区切られたエッジ ID の文字列で、制限を転回するルールが記述されています。(もしこれらのエッジに沿うなら、to_cost カラムに置かれている cost によって現在のエッジに通すことができます。)

to-_cost:
制限された通路の cost。(交通信号の場合のエッジ cost による転回制限または同等の場合は、とても高い。

6.3.1. Core
Shooting Star クエリーの例:

routing2=# SELECT * FROM shortest_path_shooting_star('
SELECT gid as id, source::integer, target::integer, length::double precision as cost, x1, y1, x2, y2, rule, to_cost FROM ways',10, 1, false, false);

vertex_id | edge_id | cost
-----------+---------+--------------------
8 | 10 | 0.267958532298737
16 | 28 | 0.0770723510944786
18 | 29 | 0.062939722076
20 | 30 | 0.0402954467053289
22 | 31 | 0.0190948665928645
24 | 109 | 0.116227259387871
136 | 110 | 0.174299630853856
1 | 111 | 0.0382842275772729
139 | 112 | 0.286175933407192
141 | 113 | 0.0520291616070434
145 | 565 | 0.289789710373784
900 | 380609 | 0.76797799806671
187 | 380608 | 0.735939901886778
303 | 215 | 0.226197723036394
27 | 36 | 0.634325320625154
28 | 1 | 2.26935080251169
(16 行)

~
(stdin):q


6.3.2. Wrapper
Wrapper 関数は、遷移や境界線 box 制限などで core 関数を拡張します。

routing2=# SELECT gid, AsText(the_geom) AS the_geom FROM shootingstar_sp('ways', 10, 1, 0.1, 'length',true, true);

gid | the_geom
--------+----------------------------------------------------------------------------------------
10 | MULTILINESTRING((139.7576138 35.6405785,139.757642 35.6429882))
28 | MULTILINESTRING((139.757642 35.6429882,139.7567891 35.6429914))
29 | MULTILINESTRING((139.7567891 35.6429914,139.7560926 35.642988))
30 | MULTILINESTRING((139.7560926 35.642988,139.7556467 35.6429917))
31 | MULTILINESTRING((139.7556467 35.6429917,139.7554354 35.6429934))
109 | MULTILINESTRING((139.7554354 35.6429934,139.7549489 35.6420258))
110 | MULTILINESTRING((139.7549489 35.6420258,139.7542037 35.64058))
111 | MULTILINESTRING((139.7542037 35.64058,139.7540437 35.6402612))
112 | MULTILINESTRING((139.7540437 35.6402612,139.7535339 35.6392546,139.7528491 35.6378777))
113 | MULTILINESTRING((139.7528491 35.6378777,139.7526395 35.6374419))
(stdin):q

16 pgRouting in Debian6 6 - ルートの検索2 A-Star

6.2. A-Star
A-Star アルゴリズムはもう一つの良く知られたルーティングアルゴリズムです。
それぞれのネットワークリンクの search と trget へ位置情報を追加します。
検索 target により近いよりよいリンクの最短経路を検索することができます。

Prerequisites は、既に設定済みです。

Function with parameters

最短経路 A-Star 関数は、Dijkstar 関数ととても似ていて、target 検索に近いリンクです。
この検索の計算方法は、組み込まれているので、組み込み関数に変えたいときは pgRouting をコンパイルしなおす必要があります。


6.2.1. Core

routing2=# SELECT * FROM shortest_path_astar('
SELECT gid as id, source::integer,
target::integer,
length::double precision as cost,
x1, y1, x2, y2 FROM ways',
10, 1, false, false);

vertex_id | edge_id | cost
-----------+---------+--------------------
10 | 8 | 0.346119164295792
9 | 23 | 0.0146912365339526
11 | 22 | 0.075644096442472
22 | 21 | 0.0618382434046277
21 | 20 | 0.0915961112943772
20 | 19 | 0.0790971710844567
19 | 111 | 0.0382842275772729
96 | 112 | 0.286175933407192
97 | 113 | 0.0520291616070434
100 | 565 | 0.289789710373784
490 | 380609 | 0.76797799806671
123 | 380608 | 0.735939901886778
186 | 215 | 0.226197723036394
30 | 36 | 0.634325320625154
1 | -1 | 0
(15 行)

~
(stdin):q


Wrapper function WITH bounding box

Wrapper 関数は、遷移や境界線 box 制限などで core 関数を拡張します。

routing2=# SELECT gid, AsText(the_geom) AS the_geom FROM astar_sp_delta('ways', 10, 1, 0.1);

gid | the_geom
--------+----------------------------------------------------------------------------------------------------------------
8 | MULTILINESTRING((139.7577762 35.6405846,139.7602379 35.6429693))
23 | MULTILINESTRING((139.7576138 35.6405785,139.7577762 35.6405846))
22 | MULTILINESTRING((139.7567768 35.6405692,139.7576138 35.6405785))
21 | MULTILINESTRING((139.7560925 35.6405677,139.7567768 35.6405692))
20 | MULTILINESTRING((139.7550789 35.6405698,139.7560925 35.6405677))
19 | MULTILINESTRING((139.7542037 35.64058,139.7543194 35.6405713,139.7550789 35.6405698))
111 | MULTILINESTRING((139.7542037 35.64058,139.7540437 35.6402612))
112 | MULTILINESTRING((139.7540437 35.6402612,139.7535339 35.6392546,139.7528491 35.6378777))
113 | MULTILINESTRING((139.7528491 35.6378777,139.7526395 35.6374419))
565 | MULTILINESTRING((139.7526395 35.6374419,139.75219 35.6368954,139.7517603 35.6360734,139.7513313 35.6350625))
380609 | MULTILINESTRING((139.7545699 35.6414479,139.7542355 35.6407687,139.7528655 35.6380556,139.7518411 35.6360552,139.7513313 35.6350625))
(stdin):q

Note
●現在、box 境界線なしの A-Star のための wrapper 関数はありません。従って、box 境界線は、パフォーマンスを向上するためにとても有効です。
box 境界線が必要ないなら、Dijkstra でいつも十分です。
● OSM データの投影法は度数なので、例えば、0.1度足した始点と終点 vertex を含む box 境界線を設定します。

16 pgRouting in Debian6 5 - ルートの検索1 Dijkstra

2 ルートの検索(最短距離の計算)

6. Shortest Path Search¶
http://workshop.pgrouting.org/chapters/shortest_path.html

を参考にルート検索をします。
3つのルート検索アルゴリズムと必要な属性について説明しています。
OpenStreetMap のデータを osm2pgrouting ツールで追加したなら、3つのルート検索関数を実行できます。

6.1. Dijkstra を参考にルート検索をしてみます。
Dijkstra は pgRouting 二最初に実装されたアルゴリズムで、source ID、target ID と cost 属性が必要です。
直接グラフと直接でないグラフを識別できます。
ネットワークが reverse cost またはそうでないかを明記できます。

事前準備として、reverce cost を使用するために、追加 cost カラムを追加する必要があります。

routing2=# ALTER TABLE ways ADD COLUMN reverse_cost double precision;
routing2=# UPDATE ways SET reverse_cost = length;
UPDATE 759212


それぞれのアルゴリズムは、core 関数であり、wrapper 関数の基本です。
6.1.1. Core を参考にコマンドを実行してみます。

routing2=# SELECT * FROM shortest_path('
routing2'# SELECT gid as id,
routing2'# source::integer,
routing2'# target::integer,
routing2'# length::double precision as cost FROM ways',
routing2(# 10, 1, false, false);

vertex_id | edge_id | cost
-----------+---------+--------------------
10 | 8 | 0.346119164295792
9 | 23 | 0.0146912365339526
11 | 22 | 0.075644096442472
22 | 21 | 0.0618382434046277
21 | 20 | 0.0915961112943772
20 | 19 | 0.0790971710844567
19 | 111 | 0.0382842275772729
96 | 112 | 0.286175933407192
97 | 113 | 0.0520291616070434
100 | 565 | 0.289789710373784
490 | 380609 | 0.76797799806671
123 | 380608 | 0.735939901886778
186 | 215 | 0.226197723036394
30 | 36 | 0.634325320625154
1 | -1 | 0
(15 行)

~~
(stdin):q


6.1.2. Wrapper を参考にコマンドを実行してみます。

Wrapper WITHOUT bounding box (box 境界線のない Wrapper)

Wrapper 関数は、遷移や box 境界線制限などで core 関数を拡張します。
Wrapper は、結果のフォーマットと順序を変えることができます。
Wrapper は、デフォルトの関数パラメータを設定し pgRouting の使い方をより簡単にします。

routing2=# SELECT gid, AsText(the_geom) AS the_geom FROM dijkstra_sp('ways', 10, 1);

gid | the_geom
--------+----------------------------------------------------------------------------------------------------------------------
8 | MULTILINESTRING((139.7577762 35.6405846,139.7602379 35.6429693))
23 | MULTILINESTRING((139.7576138 35.6405785,139.7577762 35.6405846))
22 | MULTILINESTRING((139.7567768 35.6405692,139.7576138 35.6405785))
21 | MULTILINESTRING((139.7560925 35.6405677,139.7567768 35.6405692))
20 | MULTILINESTRING((139.7550789 35.6405698,139.7560925 35.6405677))
19 | MULTILINESTRING((139.7542037 35.64058,139.7543194 35.6405713,139.7550789 35.6405698))
111 | MULTILINESTRING((139.7542037 35.64058,139.7540437 35.6402612))
112 | MULTILINESTRING((139.7540437 35.6402612,139.7535339 35.6392546,139.7528491 35.6378777))
113 | MULTILINESTRING((139.7528491 35.6378777,139.7526395 35.6374419))
565 | MULTILINESTRING((139.7526395 35.6374419,139.75219 35.6368954,139.7517603 35.6360734,139.7513313 35.6350625))
380609 | MULTILINESTRING((139.7545699 35.6414479,139.7542355 35.6407687,139.75286 55 35.6380556,139.7518411 35.6360552,139.7513313 35.6350625))
380608 | MULTILINESTRING((139.7576194 35.6475849,139.7568929 35.6461283,139.755837 35.6439893,139.7545699 35.6414479))
215 | MULTILINESTRING((139.7585756 35.6494649,139.7576194 35.6475849))
36 | MULTILINESTRING((139.7585756 35.6494649,139.7576702 35.6475689,139.7573095 35.6468001,139.7572599 35.6465017,139.7572966 35.646252,139.7573598 35.6460477,139.7577062 35.6453051,139.7577759 35.6451083,139.7578078 35.6449769,139.757837 35.6448058,139.7578311 35.6446378,139.7578 35.6437952))
(14 行)

(END):q


Wrapper WITH bounding box (box 境界線がある Wrapper)

box 境界線を追加することによって検索範囲を限定できます。
これは特に大きなネットワークに対してパフォーマンスを向上させます。

routing2=# SELECT gid, AsText(the_geom) AS the_geom FROM dijkstra_sp_delta('ways', 10, 1, 0.1);

gid | the_geom
--------+-------------------------------------------------------------------------------------------------------------------
8 | MULTILINESTRING((139.7577762 35.6405846,139.7602379 35.6429693))
23 | MULTILINESTRING((139.7576138 35.6405785,139.7577762 35.6405846))
22 | MULTILINESTRING((139.7567768 35.6405692,139.7576138 35.6405785))
21 | MULTILINESTRING((139.7560925 35.6405677,139.7567768 35.6405692))
20 | MULTILINESTRING((139.7550789 35.6405698,139.7560925 35.6405677))
19 | MULTILINESTRING((139.7542037 35.64058,139.7543194 35.6405713,139.7550789 35.6405698))
111 | MULTILINESTRING((139.7542037 35.64058,139.7540437 35.6402612))
112 | MULTILINESTRING((139.7540437 35.6402612,139.7535339 35.6392546,139.7528491 35.6378777))
113 | MULTILINESTRING((139.7528491 35.6378777,139.7526395 35.6374419))
565 | MULTILINESTRING((139.7526395 35.6374419,139.75219 35.6368954,139.7517603 35.6360734,139.7513313 35.6350625))
380609 | MULTILINESTRING((139.7545699 35.6414479,139.7542355 35.6407687,139.7528655 35.6380556,139.7518411 35.6360552,139.7513313 35.6350625))
380608 | MULTILINESTRING((139.7576194 35.6475849,139.7568929 35.6461283,139.755837 35.6439893,139.7545699 35.6414479))
36 | MULTILINESTRING((139.7585756 35.6494649,139.7576702 35.6475689,139.7573095 35.6468001,139.7572599 35.6465017,139.7572966 35.646252,139.7573598 35.6460477,139.7577062 35.6453051,139.7577759 35.6451083,139.7578078 35.6449769,139.757837 35.6448058,139.7578311 35.6446378,139.7578 35.6437952))
(14 行)

(END):q

OSM データの投影法は度数なので、例えば、0.1度足した始点と終点 vertex を含む box 境界線を設定します。

16 pgRouting in Debian6 4 - japan.osm の登録

pgRouting Workshop Manual
http://workshop.pgrouting.org/

を参考に OpenStreetMap でテストします。


0 japan.osm.highway データ
pgRouting には、osm データが必要です。

CloudMade Downloads Japan サイト
http://downloads.cloudmade.com/asia/japan#downloads_breadcrumbs

japan.osm.highway.bz2 をダウンロードして解凍します。

user@deb6-vmw:~/ダウンロード$ bunzip2 japan.osm.highway.bz2

<?xml version='1.0' encoding='UTF-8'?>
<osm version="0.6" generator="Osmosis 0.36">
<node id="26155122" version="2" timestamp="2008-02-27T22:48:02Z" uid="19799" user="daveemtb" changeset="219539" lat="26.1716092" lon="127.9096729">
<tag k="created_by" v="JOSM"/>
</node>
<node id="26155133" version="2" timestamp="2008-02-27T22:48:02Z" uid="19799" user="daveemtb" changeset="219539" lat="26.1679759" lon="127.9060651">
---
<way id="32742015" version="1" timestamp="2009-04-02T04:56:03Z" uid="24685" user="tosihisa" changeset="54083">
<nd ref="368385006"/>
<nd ref="368385008"/>
<tag k="created_by" v="Merkaartor 0.12"/>
<tag k="highway" v="trunk"/>
<tag k="name" v="国道1号線(Route 1)"/>
<tag k="oneway" v="yes"/>
<tag k="ref" v="1"/>
<tag k="tunnel" v="yes"/>
</way>
---
<relation id="1437868" version="1" timestamp="2011-02-20T16:06:16Z" uid="129607" user="Mage Whopper" changeset="7344209">
<member type="way" ref="100653311" role="inner"/>
<member type="way" ref="100653309" role="outer"/>
<tag k="type" v="multipolygon"/>
</relation>
</osm>

1 japan.osm.highway を osm2pgrouting でデータベースに追加します。

1-1 GitHub pgRouting / osm2pgrouting サイト
https://github.com/pgRouting/osm2pgrouting

から osm2pgrouting をダウンロードします。

osm2pgrouting を解凍します。

user@deb6-vmw:~/ダウンロード$ tar xvzf pgRouting-osm2pgrouting-e1757cb.tar.gz

1-2 pgRouting-osm2pgrouting-e1757cb ディレクトリに移動します。

user@deb6-vmw:~/ダウンロード$ cd pgRouting-osm2pgrouting-e1757cb/
user@deb6-vmw:~/ダウンロード/pgRouting-osm2pgrouting-e1757cb$ ls
AUTHORS.txt COPYING Makefile README mapconfig.xml src
user@deb6-vmw:~/ダウンロード/pgRouting-osm2pgrouting-e1757cb$ vim README

README をみると次のものをインストールしておきます。

1. postgresl
2. postgis
3. pgrouting
4. boost
5. expat

expat を Synaptic パッケージマネージャでインストールします。

make コマンドを実行します。

user@deb6-vmw:~/ダウンロード/pgRouting-osm2pgrouting-e1757cb$ make
g++ -c src/Export2DB.cpp src/math_functions.cpp src/Node.cpp src/Tag.cpp src/OSMDocumentParserCallback.cpp src/Way.cpp src/OSMDocument.cpp src/Type.cpp src/Class.cpp src/Configuration.cpp src/ConfigurationParserCallback.cpp src/Relation.cpp -I./ -Isrc -I/usr/include/pgsql -I/usr/include/postgresql -ggdb3
g++ -c src/XMLParser.cpp -I./ -Isrc -I/usr/include/pgsql -I/usr/include/postgresql -ggdb3
g++ -o osm2pgrouting src/osm2pgrouting.cpp *.o -I./ -Isrc -I/usr/include/pgsql -I/usr/include/postgresql -lexpat -ggdb3 -lpq
rm *.o
user@deb6-vmw:~/ダウンロード/pgRouting-osm2pgrouting-e1757cb$ ls
AUTHORS.txt COPYING Makefile README mapconfig.xml osm2pgrouting src

1-3 routing データベースに osm データを追加します。

4. osm2pgrouting Import Tool
http://workshop.pgrouting.org/chapters/osm2pgrouting.html#run-osm2pgrouting

の 4.2. Run osm2pgrouting を参考にします。
ダウンロードしたファイル名を次のように変更します。

user@deb6-vmw:~/ダウンロード$ mv japan.osm.highway japan_highway.osm
user@deb6-vmw:~/ダウンロード$ ls
---
japan_highway.osm
---

osm2pgrouting を一般ユーザで make したので、次のようにコマンドを実行しました。
データ量が多かったので一度失敗しましたが、仮想ハードディスクの空き容量とメモリの容量を十分にとって再度実行しました。

postgres@deb6-vmw:~$ cd /home/user/ダウンロード/pgRouting-osm2pgrouting-e1757cb/
postgres@deb6-vmw:/home/user/ダウンロード/pgRouting-osm2pgrouting-e1757cb$ ./osm2pgrouting -file ../japan_highway.osm -conf mapconfig.xml -dbname routing2 -clean

routing データベースの内容をみてみます。

postgres@deb6-vmw:/home/user/ダウンロード/pgRouting-osm2pgrouting-e1757cb$ cd
postgres@deb6-vmw:~$ psql routing2
psql (8.4.7)
"help" でヘルプを表示します.

routing=# \d

リレーションの一覧
スキーマ | 名前 | 型 | 所有者
----------+---------------------+------------+----------
public | classes | テーブル | postgres
public | geography_columns | ビュー | postgres
public | geometry_columns | テーブル | postgres
public | nodes | テーブル | postgres
public | relation_ways | テーブル | postgres
public | relations | テーブル | postgres
public | spatial_ref_sys | テーブル | postgres
public | types | テーブル | postgres
public | vertices_tmp | テーブル | postgres
public | vertices_tmp_id_seq | シーケンス | postgres
public | way_tag | テーブル | postgres
public | ways | テーブル | postgres
(12 行)

~
(stdin):q

ways の内容をみてみます。

routing2=# \d ways

テーブル "public.ways"
カラム | 型 | 修飾語
--------------+------------------+----------
gid | integer |
class_id | integer | not null
length | double precision |
name | character(200) |
x1 | double precision |
y1 | double precision |
x2 | double precision |
y2 | double precision |
reverse_cost | double precision |
rule | text |
to_cost | double precision |
osm_id | integer |
the_geom | geometry |
source | integer |
target | integer |
インデックス:
"ways_gid_idx" UNIQUE, btree (gid)
"geom_idx" gist (the_geom)
"source_idx" btree (source)
"target_idx" btree (target)
CHECK 制約:
"enforce_dims_the_geom" CHECK (st_ndims(the_geom) = 2)
"enforce_geotype_the_geom" CHECK (geometrytype(the_geom) = 'MULTILINESTRING'::text OR the_geom IS NULL)
"enforce_srid_the_geom" CHECK (st_srid(the_geom) = 4326)

(END):q

2011年4月24日日曜日

16 pgRouting in Debian6 3 - データベースの作成

Step 3: Create a routing database and load PostGIS and pgRouting functions
に従って routing データベースを作成します。

1. Create a routing database and load PostGIS
次のコマンドでデータベースを作成します。

user@deb6-vmw:~/pgrouting-1.05$ su - postgres
パスワード:
postgres@deb6-vmw:~$ createdb -T template_postgis routing

2. Add pgRouting core functions (required)
次のコマンドで pgRouting core 関数を追加します。

postgres@deb6-vmw:~$ psql -f /usr/share/postlbs/routing_core.sql routing
CREATE TYPE
CREATE TYPE
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
postgres@deb6-vmw:~$ psql -f /usr/share/postlbs/routing_core_wrappers.sql routing
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE TYPE
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
postgres@deb6-vmw:~$ psql -f /usr/share/postlbs/routing_topology.sql routing
CREATE FUNCTION
CREATE FUNCTION

3. Add pgRouting extra functions (optional)
次のコマンドで pgRouting extra 関数を追加します。

# With TSP
postgres@deb6-vmw:~$ psql -f /usr/share/postlbs/routing_tsp.sql routing
postgres@deb6-vmw:~$ psql -f /usr/share/postlbs/routing_tsp_wrappers.sql routing

# With Driving Distance
postgres@deb6-vmw:~$ psql -f /usr/share/postlbs/routing_dd.sql routing
postgres@deb6-vmw:~$ psql -f /usr/share/postlbs/routing_dd_wrappers.sql routing

続く ...

16 pgRouting in Debian6 2 - インストール

Step 2: Compiling the pgRouting library を参考に pgRouting をインストールします。

1. Get pgRouting source リンクをクリックしてダウンロードします。
Source Packages の pgrouting-1.05.tar.gz をダウンロードしました。

2. Change to pgRouting directory
解凍して pgRouting ディレクトリに移動します。

user@deb6-vmw:~ダウンロード/gaul-devel-0.1850-0# exit
user@deb6-vmw:~ダウンロード/gaul-devel-0.1850-0$ cd ../
user@deb6-vmw:~ダウンロード$ ls
---
pgrouting-1.05.tar.gz
---
user@deb6-vmw:~ダウンロード$ tar xvzf pgrouting-1.05.tar.gz
user@deb6-vmw:~ダウンロード$ cd pgrouting-1.05

3. Compile and install pgRouting の For pgRouting extras (optional) にしたがってコンパイルとインストールをしました。
(cmake がインストールされていなかったので Synaptic パッケージマネージャでインストールしました。)

user@deb6-vmw:~ダウンロード/pgrouting-1.05$ cmake -DWITH_TSP=ON -DWITH_DD=ON .

次のようなエラーが表示されました。

CMake Warning (dev) at CMakeLists.txt:12 (add_subdirectory):
The source directory

/home/user/ダウンロード/pgrouting-1.05/cmake

does not contain a CMakeLists.txt file.

CMake does not support this case but it used to work accidentally and is
being allowed for compatibility.

Policy CMP0014 is not set: Input directories must have CMakeLists.txt. Run
"cmake --help-policy CMP0014" for policy details. Use the cmake_policy
command to set the policy and suppress this warning.
This warning is for project developers. Use -Wno-dev to suppress it.


-- PostgreSQL not found.
FATALERROR Please check your PostgreSQL installation.
Boost headers were found here: /usr/include
Output directory for libraries is set to sh: pg_config: not found
Installation directory for libraries is set to sh: pg_config: not found and for SQL files is set to /usr/share/postlbs
Installation directory for libraries is set to sh: pg_config: not found
CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
POSTGRESQL_INCLUDE_DIR (ADVANCED)


■ CMake Warning (dev) at CMakeLists.txt:12 (add_subdirectory): は、

user@deb6-vmw:~ダウンロード/pgrouting-1.05$ cmake --help-policy CMP0014
cmake version 2.8.2
CMP0014
Input directories must have CMakeLists.txt.

CMake versions before 2.8 silently ignored missing CMakeLists.txt
files in directories referenced by add_subdirectory() or subdirs(),
treating them as if present but empty. In CMake 2.8.0 and above this
policy determines whether or not the case is an error. The OLD
behavior for this policy is to silently ignore the problem. The NEW
behavior for this policy is to report an error.

This policy was introduced in CMake version 2.8.0. CMake version
2.8.2 warns when the policy is not set and uses OLD behavior. Use the
cmake_policy command to set it to OLD or NEW explicitly.

とあり、CMakeLists.txt がない場合に表示される警告です。バージョンが 2.8 以前ではこの警告は無視されます。
実際には、pgrouting-1.05/CMakeLists.txt がありますが、エラーが表示されるようです。
このままにしておきます。


■ -- PostgreSQL not found. に対応して
postgresql-server-dev-8.4 をインストールしました。
再度、cmake を実行しました。

-- Found PostgreSQL: /usr/include/postgresql/8.4/server, /usr/lib/libpq.so
Boost headers were found here: /usr/include
Output directory for libraries is set to /usr/lib/postgresql/8.4/lib
Installation directory for libraries is set to /usr/lib/postgresql/8.4/lib and for SQL files is set to /usr/share/postlbs
Installation directory for libraries is set to /usr/lib/postgresql/8.4/lib
-- Configuring done
-- Generating done
-- Build files have been written to: /home/user/pgrouting-1.05

成功しました。
次に、make を実行します。

user@deb6-vmw:~/pgrouting-1.05$ make
Scanning dependencies of target routing_tsp
[ 8%] Building C object extra/tsp/src/CMakeFiles/routing_tsp.dir/tsp.o
[ 16%] Building CXX object extra/tsp/src/CMakeFiles/routing_tsp.dir/tsp_solver.o
Linking CXX shared library ../../../lib/librouting_tsp.so
[ 16%] Built target routing_tsp
Scanning dependencies of target routing_dd
[ 25%] Building C object extra/driving_distance/src/CMakeFiles/routing_dd.dir/alpha.o
[ 33%] Building CXX object extra/driving_distance/src/CMakeFiles/routing_dd.dir/alpha_drivedist.o
[ 41%] Building CXX object extra/driving_distance/src/CMakeFiles/routing_dd.dir/boost_drivedist.o
In file included from /usr/include/c++/4.4/backward/hash_set:60,
from /usr/include/boost/pending/container_traits.hpp:23,
from /usr/include/boost/graph/detail/adjacency_list.hpp:31,
from /usr/include/boost/graph/adjacency_list.hpp:324,
from /home/user/pgrouting-1.05/extra/driving_distance/src/boost_drivedist.cpp:25:
/usr/include/c++/4.4/backward/backward_warning.h:28:2: warning: #warning This file includes at least one deprecated or antiquated header which may be removed without further notice at a future date. Please use a non-deprecated interface with equivalent functionality instead. For a listing of replacement headers and interfaces, consult the file backward_warning.h. To disable this warning use -Wno-deprecated.
[ 50%] Building C object extra/driving_distance/src/CMakeFiles/routing_dd.dir/drivedist.o
Linking CXX shared library ../../../lib/librouting_dd.so
[ 50%] Built target routing_dd
Scanning dependencies of target routing
[ 58%] Building C object core/src/CMakeFiles/routing.dir/dijkstra.o
[ 66%] Building C object core/src/CMakeFiles/routing.dir/astar.o
[ 75%] Building C object core/src/CMakeFiles/routing.dir/shooting_star.o
[ 83%] Building CXX object core/src/CMakeFiles/routing.dir/boost_wrapper.o
In file included from /usr/include/c++/4.4/backward/hash_set:60,
from /usr/include/boost/pending/container_traits.hpp:23,
from /usr/include/boost/graph/detail/adjacency_list.hpp:31,
from /usr/include/boost/graph/adjacency_list.hpp:324,
from /home/user/pgrouting-1.05/core/src/boost_wrapper.cpp:25:
/usr/include/c++/4.4/backward/backward_warning.h:28:2: warning: #warning This file includes at least one deprecated or antiquated header which may be removed without further notice at a future date. Please use a non-deprecated interface with equivalent functionality instead. For a listing of replacement headers and interfaces, consult the file backward_warning.h. To disable this warning use -Wno-deprecated.
[ 91%] Building CXX object core/src/CMakeFiles/routing.dir/astar_boost_wrapper.o
In file included from /usr/include/c++/4.4/backward/hash_set:60,
from /usr/include/boost/pending/container_traits.hpp:23,
from /usr/include/boost/graph/detail/adjacency_list.hpp:31,
from /usr/include/boost/graph/adjacency_list.hpp:324,
from /home/user/pgrouting-1.05/core/src/astar_boost_wrapper.cpp:25:
/usr/include/c++/4.4/backward/backward_warning.h:28:2: warning: #warning This file includes at least one deprecated or antiquated header which may be removed without further notice at a future date. Please use a non-deprecated interface with equivalent functionality instead. For a listing of replacement headers and interfaces, consult the file backward_warning.h. To disable this warning use -Wno-deprecated.
[100%] Building CXX object core/src/CMakeFiles/routing.dir/shooting_star_boost_wrapper.o
In file included from /usr/include/c++/4.4/backward/hash_set:60,
from /usr/include/boost/pending/container_traits.hpp:23,
from /usr/include/boost/graph/detail/adjacency_list.hpp:31,
from /usr/include/boost/graph/adjacency_list.hpp:324,
from /home/user/pgrouting-1.05/core/src/shooting_star_boost_wrapper.cpp:25:
/usr/include/c++/4.4/backward/backward_warning.h:28:2: warning: #warning This file includes at least one deprecated or antiquated header which may be removed without further notice at a future date. Please use a non-deprecated interface with equivalent functionality instead. For a listing of replacement headers and interfaces, consult the file backward_warning.h. To disable this warning use -Wno-deprecated.
/home/user/pgrouting-1.05/core/src/shooting_star_boost_wrapper.cpp:26:41: error: boost/vector_property_map.hpp: そのようなファイルやディレクトリはありません
In file included from /home/user/pgrouting-1.05/core/src/shooting_star_search.hpp:22,
from /home/user/pgrouting-1.05/core/src/shooting_star_boost_wrapper.cpp:27:
/home/user/pgrouting-1.05/core/src/shooting_star_relax.hpp:18:34: error: boost/property_map.hpp: そのようなファイルやディレクトリはありません
In file included from /home/user/pgrouting-1.05/core/src/edge_visitors.hpp:9,
from /home/user/pgrouting-1.05/core/src/shooting_star_search.hpp:28,
from /home/user/pgrouting-1.05/core/src/shooting_star_boost_wrapper.cpp:27:
/usr/include/boost/graph/detail/is_same.hpp:17:4: warning: #warning "This header is deprecated. Please use: boost/type_traits/is_same.hpp"
make[2]: *** [core/src/CMakeFiles/routing.dir/shooting_star_boost_wrapper.o] エラー 1
make[1]: *** [core/src/CMakeFiles/routing.dir/all] エラー 2
make: *** [all] エラー 2

■/home/user/pgrouting-1.05/core/src/shooting_star_boost_wrapper.cpp:26:41: error: boost/vector_property_map.hpp: そのようなファイルやディレクトリはありません

の対処は、次のように、実際のファイルの場所に pgrouting-1.05/core/src/shooting_star_boost_wrapper.cpp の内容修正をしました。

---
/* #include <boost/vector_property_map.hpp> */
#include <boost/property_map/vector_property_map.hpp>
---

■/home/user/pgrouting-1.05/core/src/shooting_star_relax.hpp:18:34: error: boost/property_map.hpp: そのようなファイルやディレクトリはありません

の対処は、次のように、実際のファイルの場所に pgrouting-1.05/core/src/shooting_star_relax.hpp の内容修正をしました。

---
/* #include <boost/property_map.hpp> */
#include <boost/property_map/property_map.hpp>
---

■/home/user/pgrouting-1.05/core/src/edge_visitors.hpp:6:34: error: boost/property_map.hpp: そのようなファイルやディレクトリはありません

の対処は、次のように、実際のファイルの場所に pgrouting-1.05/core/src/edge_visitors.hpp の修正をしました。

---
/* #include <boost/property_map.hpp> */
#include <boost/property_map/property_map.hpp>
---

再度、make を実行しました。

user@deb6-vmw:~/pgrouting-1.05$ make
[ 58%] Built target routing_tsp
[ 58%] Built target routing_dd
[ 58%] Building CXX object core/src/CMakeFiles/routing.dir/shooting_star_boost_wrapper.o
In file included from /usr/include/c++/4.4/backward/hash_set:60,
from /usr/include/boost/pending/container_traits.hpp:23,
from /usr/include/boost/graph/detail/adjacency_list.hpp:31,
from /usr/include/boost/graph/adjacency_list.hpp:324,
from /home/user/pgrouting-1.05/core/src/shooting_star_boost_wrapper.cpp:25:
/usr/include/c++/4.4/backward/backward_warning.h:28:2: warning: #warning This file includes at least one deprecated or antiquated header which may be removed without further notice at a future date. Please use a non-deprecated interface with equivalent functionality instead. For a listing of replacement headers and interfaces, consult the file backward_warning.h. To disable this warning use -Wno-deprecated.
In file included from /home/user/pgrouting-1.05/core/src/edge_visitors.hpp:10,
from /home/user/pgrouting-1.05/core/src/shooting_star_search.hpp:28,
from /home/user/pgrouting-1.05/core/src/shooting_star_boost_wrapper.cpp:28:
/usr/include/boost/graph/detail/is_same.hpp:17:4: warning: #warning "This header is deprecated. Please use: boost/type_traits/is_same.hpp"
Linking CXX shared library ../../lib/librouting.so
[ 58%] Built target routing
(成功したみたいです。)

user@deb6-vmw:~/pgrouting-1.05$ su
パスワード:
root@deb6-vmw:/home/user/pgrouting-1.05# make install
[ 16%] Built target routing_tsp
[ 50%] Built target routing_dd
[100%] Built target routing
Install the project...
-- Install configuration: ""
-- Installing: /usr/lib/postgresql/8.4/lib/librouting.so
-- Installing: /usr/share/postlbs/routing_core.sql
-- Installing: /usr/share/postlbs/routing_core_wrappers.sql
-- Installing: /usr/share/postlbs/routing_topology.sql
-- Installing: /usr/share/postlbs/matching.sql
-- Installing: /usr/lib/postgresql/8.4/lib/librouting_tsp.so
-- Removed runtime path from "/usr/lib/postgresql/8.4/lib/librouting_tsp.so"
-- Installing: /usr/share/postlbs/routing_tsp.sql
-- Installing: /usr/share/postlbs/routing_tsp_wrappers.sql
-- Installing: /usr/lib/postgresql/8.4/lib/librouting_dd.so
-- Installing: /usr/share/postlbs/routing_dd.sql
-- Installing: /usr/share/postlbs/routing_dd_wrappers.sql

続く ...

16 pgRouting in Debian6 1 - インストール準備

(15はありません。)
pgRouting は、

pgRouting Project サイト
pgRouting プロジェクト
http://www.pgrouting.org/

から引用すると、

*****
pgRouting は、地理空間ルーティング機能を提供するため PostGIS/PostgreSQL の空間データベースを拡張します。

データベースルーティングアプローチの利点は次の通りです:
データと属性は、JDBC または ODBC、もしくは PL/pgSQL を直接使用することを介した Quantum GIS と uDig のように、多くのクライアントによって変更することができます。クライアントは、PC または携帯デバイスです。
データの変更は、ルーティングエンジンを介して瞬時に反映させることができます。事前に計算する必要はありません。
"cost"パラメータは、SQLを通して動的に計算することができ、そして、その値は複数のフィールドまたはテーブルから算出することができます。

コア機能

pgRouting は次の機能を提供します:
最短距離 Dikstra:人手無しでルーティングアルゴリズム
最短距離 A-Star:(人手を介して)大規模なデータセットのためのルーティング
最短距離 Shooting-Star:(人手を介して)ターン制限ルーティング
巡回セールスマン問題(TSP)
走行距離の計算(等高線)
*****

ということです。
インストールは、

Documentation サイト
http://www.pgrouting.org/documentation.html

の Versions 1.x(current) をクリックし、

pgRouting Documentation サイト
http://www.pgrouting.org/docs/1.x/index.html

の Versions 1.x (current) の Installation リンクをクリックします。

Installation サイト
http://www.pgrouting.org/docs/1.x/install.html

に従ってインストールします。

Requirements (必要なもの)は追加インストールしたものはコメントしてあります。

Step 1: Libraries installation を参考にインストールしました。
GAUL 以外は、Synaptic パッケージマネージャでインストールしました。


■pgRouting Core - Shortest-Path algorithms で必要なもの

C and C++ compilers
(Debian では、g++ をインストールしました。)
Postgresql version >= 8.0
PostGIS version >= 1.0
The Boost Graph Library (BGL). Version >= 1.33 which contains the astar.hpp.
(Debian では、libboost-graph-dev をインストールしました。)


■pgRouting Extra - with TSP で必要なもの

The Genetic Algorithm Utility Library (GAUL). See http://gaul.sourceforge.net

Genetic Algorithm Utility Library by stewartadcock サイト
http://sourceforge.net/projects/gaul/files/

の Download gaul-devel-0.1850-0.tar.gz (1.3 MB) をクリックしてダウンロードします。

ファイルを保存して、解凍します。

user@deb6-vmw:~$ cd ダウンロード/
user@deb6-vmw:~/ダウンロード$ ls
---
gaul-devel-0.1850-0.tar.gz
---
user@deb6-vmw:~/ダウンロード$ tar xvzf gaul-devel-0.1850-0.tar.gz
user@deb6-vmw:~/ダウンロード$ ls
---
gaul-devel-0.1850-0
gaul-devel-0.1850-0.tar.gz
---

Installation Instructions の Step 1: Libraries installation の For Traveling Salesperson Problem (optional) にある通り、次のようにインストールしました。

user@deb6-vmw:~/ダウンロード$ cd gaul-devel-0.1850-0/
user@deb6-vmw:~/ダウンロード/gaul-devel-0.1850-0$ su
パスワード:
root@deb6-vmw:/home/user/ダウンロード/gaul-devel-0.1850-0# ./configure -enable-slang=no(または --disable-slang)

---
GAUL has been configured successfully. In summary:

Version: 0.1850-0
Source code location: .
Host system type: x86_64-unknown-linux-gnu
Target system type: x86_64-unknown-linux-gnu
Debugging level: 0
C compiler: gcc
C compiler flags: -g -O2 -Wall
Additional include flags:
Install path: /usr/local
Use S-Lang: no
Use MPI: no
Use OPENMP: no
Use pthreads: yes
---

root@deb6-vmw:/home/user/ダウンロード/gaul-devel-0.1850-0# make
root@deb6-vmw:/home/user/ダウンロード/gaul-devel-0.1850-0# make install


■pgRouting Extra - with Driving Distance で必要なもの

Computational Geometry Algorithms Library (CGAL) version >= 3.2. See http://www.cgal.org
(Debian では、libcgal-dev[non-free] をインストールしました。その他の処理は行いませんでした。)

続く ...

2011年4月23日土曜日

14 Open Street Map 4 - スタイリングの確認

14-5 OpenStreetMap スタイリングの確認

1 左側の欄の「Layer Preview」をクリックします。
2 「npn:japan_highway」の「OpenLayers」リンクをクリックします。
3 「wms を開く」ダイアログで「ファイルを保存する」を選択しボタンをクリックします。
wms の内容は次のようになっています。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE ServiceExceptionReport SYSTEM "http://localhost:8080/geoserver/schemas/wms/1.1.1/WMS_exception_1_1_1.dtd">
<ServiceExceptionReport version="1.1.1" >
<ServiceException>
The requested Style can not be used with this layer. The style specifies an attribute of aeroway and the layer is: npn:japan_highway
</ServiceException></ServiceExceptionReport>

osm_roads スタイルの Runway のデータを削除します。
4 左側の欄の Data -> Styles をクリックします。
5 osm_roads をクリックし、<!-- Runways from openstreetmap --> から
<-- end of zoom level b --> までを削除します。
(「japan_highway」の「Default Style」が「osm_roads」であることを確認します。)
6 左側の欄の「Layer Preview」をクリックします。
7 「npn:japan_highway」の「OpenLayers」リンクをクリックします。
「wms を開く」ダイアログで「ファイルを保存する」を選択しボタンをクリックします。
wms の内容は次のようになっています。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE ServiceExceptionReport SYSTEM "http://localhost:8080/geoserver/schemas/wms/1.1.1/WMS_exception_1_1_1.dtd">
<ServiceExceptionReport version="1.1.1" >
<ServiceException>
The requested Style can not be used with this layer. The style specifies an attribute of highway and the layer is: npn:japan_highway
</ServiceException></ServiceExceptionReport>

osm_roads.sld ファイルのすべての
<NamedLayer> の <Name> を npn:japan_highway にします。<-1
<Rule> の <Name> を npn:japan_highway にします。これは表示に影響はない(?)と思います。<-2
<ogc:Filter> の <ogc:PropertyName> を type にします。<-3

---
<NamedLayer>
<Name>npn:japan_highway</Name> <-1
<UserStyle>
<Title>A boring default style</Title>
<Abstract>A sample style that just prints out a green line</Abstract>

<!-- start of zoom level 3 -->

<FeatureTypeStyle>
<Rule>
<Name>npn:japan_highway</Name> <-2
<Title>freeways- outer zoom level</Title>
<Abstract>freeways style openstreetmap data</Abstract>
<ogc:Filter>
<ogc:Or>
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>type</ogc:PropertyName> <-3
<ogc:Literal>residential</ogc:Literal>
</ogc:PropertyIsEqualTo>
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>type</ogc:PropertyName> <-3
<ogc:Literal>unclassified</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Or>
</ogc:Filter>
<MinScaleDenominator>1000</MinScaleDenominator>
<MaxScaleDenominator>4000</MaxScaleDenominator>
<LineSymbolizer>
<Stroke>
<CssParameter name="stroke">#f4faf6</CssParameter>
<CssParameter name="stroke-width">12</CssParameter>
<CssParameter name="stroke-linejoin">round</CssParameter>
</Stroke>
</LineSymbolizer>
<TextSymbolizer>
<Label>
<ogc:PropertyName>name</ogc:PropertyName>
</Label>
<Font>
<CssParameter name="font-size">10</CssParameter>
<CssParameter name="font-family">Arial</CssParameter>
<CssParameter name="font-color">#eeeeee</CssParameter>
</Font>
<LabelPlacement>
<LinePlacement>
<PerpendicularOffset>
0
</PerpendicularOffset>
</LinePlacement>
</LabelPlacement>
<Halo>
<Radius>
<ogc:Literal>1</ogc:Literal>
</Radius>
<Fill>
<CssParameter name="fill">#f4faf6</CssParameter>
</Fill>
</Halo>
<Fill>
<CssParameter name="fill">#808080</CssParameter>
</Fill>
<VendorOption name="maxDisplacement">50</VendorOption>
<VendorOption name="labelAllGroup">true</VendorOption>
<VendorOption name="removeOverlaps">true</VendorOption>
<VendorOption name="followLine">true</VendorOption>
<VendorOption name="group">true</VendorOption>
</TextSymbolizer>
</Rule>
</FeatureTypeStyle>
---

japan_highway の type の内容は次の通りです。

user@deb6-vmw:~/ダウンロード/japan_shapefiles$ psql osm
psql (8.4.7)
"help" でヘルプを表示します.

osm=> \dt

リレーションの一覧
スキーマ | 名前 | 型 | 所有者
----------+------------------+----------+--------
public | geometry_columns | テーブル | user
public | japan_highway | テーブル | user
public | japan_natural | テーブル | user
public | japan_poi | テーブル | user
public | spatial_ref_sys | テーブル | user
(5 行)

osm=> SELECT distinct type from japan_highway;

type
--------------------------
unclassified

footway
motorway
proposed
residential;unclassified
raceway
motorway_link
steps
pedestrian
bridleway
primary_link
crossing
platform
services
motorway_junction
service
trunk_link
cycleway
byway
bus_guideway
runaway_truck_lane
living_street
plathome
path
residential
slope
road
rest_area
construction
residential;tertiary
minor
primary
secondary
track
sericve
escalator
tertiary
trunk
tertiary_link
unclassificed
secondary_link
bridge
(43 行)

(END):q


このうち、osm_roads.sld に設定されているものは次の通りです。

residential
unclassified
primary
secondary
tertiary
motorway
trunk

倍率によって、表示できる道路、線の太さ、色が変わるように設定されています。
「Layer Preview」をクリックして「npn:japan_highway」の「OpenLayers」リンクをクリックしてください。
最初の倍率では何も表示されません。
拡大すると表示されるようになります。

<VendorOption... は、

Throw GeoServer a curve (and it will be labeled)
http://blog.geoserver.org/2009/01/08/throw-geoserver-a-curve/

に説明があります。
これによってラベルが道路に沿って表示されます。

14 Open Street Map 3 - スタイリングの設定

14-4 OpenStreetMap のスタイリングの設定

GeoServer and OpenStreetMap ページ
http://blog.geoserver.org/2009/01/30/geoserver-and-openstreetmap/

の「Making sense of the data」リンクをクリックすると

Map Features-OpenStreetMap Wiki ページ
http://wiki.openstreetmap.org/wiki/Map_Features

が表示されます。
Available languages の「日本語」リンクをクリックします。
Ja:Map Features-OpenStreetMap Wiki ページの「ご注意」内の「Japan tagging」をクリックします。
ここには日本の道路の表示についてかかれています。
GeoServer and OpenStreetMap ページの Styling の 「final SLD」では英国の道路に対応していますが、これを使ってスタイリングします。

1「final SLD」リンクをクリックしてダウンロードします。
2 osm_roadsld.zip を解凍します。

user@deb6-vmw:~/ダウンロード$ unzip osm_roadssld.zip
Archive: osm_roadssld.zip
inflating: osm_roads.sld

3 ログインした GeoServer ページの左側の欄の Data -> Styles をクリックします。
4 Styles ページの「Add a new style」をクリックします。
5 New style ページで
Name: osm_roads
と入力します。
6 New style ページの下の方の SLD file の「参照」ボタンをクリックします。
7 「ファイルのアップロード」で osm_roads.sld を選択し「開く」ボタンをクリックします。
8 「Upload...」リンクをクリックします。
9 「Validate」ボタンをクリックします。
次のようなエラーが表示されました。

# org.xml.sax.SAXParseException: cvc-complex-type.2.4.a: Invalid content was found starting with element 'Name'. One of '{"http://www.opengis.net/sld":Symbolizer}' is expected.
# org.xml.sax.SAXParseException: cvc-complex-type.2.4.a: Invalid content was found starting with element 'Halo'. One of '{"http://www.opengis.net/sld":VendorOption}' is expected.
---

GeoServer and OpenStreetMap ページ
http://blog.geoserver.org/2009/01/30/geoserver-and-openstreetmap/

のコメントと

Throw GeoServer a curve (and it will be labeled)ページ
http://blog.geoserver.org/2009/01/08/throw-geoserver-a-curve/

を参考に、osm_roads をつぎのように修正します。
該当するすべての <FeatureTypeStyle> で

---
<FeatureTypeStyle>
<Rule>
<Name>topp:planet_osm_line</Name>
<Title>freeways- outer zoom level</Title>
<Abstract>freeways style openstreetmap data</Abstract>
<ogc:Filter>
<ogc:Or>
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>highway</ogc:PropertyName>
<ogc:Literal>residential</ogc:Literal>
</ogc:PropertyIsEqualTo>
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>highway</ogc:PropertyName>
<ogc:Literal>unclassified</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Or>
</ogc:Filter>
<!-- Min および MaxScaleDenominator を LineSymbolizer の直前に Property(type) によって値が違うので一つずつ修正してください -->
<MinScaleDenominator>1000</MinScaleDenominator>
<MaxScaleDenominator>4000</MaxScaleDenominator>
<!-- ここまで -->
<LineSymbolizer>
<Stroke>
<CssParameter name="stroke">#f4faf6</CssParameter>
<CssParameter name="stroke-width">12</CssParameter>
<CssParameter name="stroke-linejoin">round</CssParameter>
</Stroke>
</LineSymbolizer>
<TextSymbolizer>
<Label>
<ogc:PropertyName>name</ogc:PropertyName>
</Label>
<Font>
<CssParameter name="font-size">10</CssParameter>
<CssParameter name="font-family">Arial</CssParameter>
<CssParameter name="font-color">#eeeeee</CssParameter>
</Font>
<LabelPlacement>
<LinePlacement>
<PerpendicularOffset>
0
</PerpendicularOffset>
</LinePlacement>
</LabelPlacement>
<Halo>
<Radius>
<ogc:Literal>1</ogc:Literal>
</Radius>
<Fill>
<CssParameter name="fill">#f4faf6</CssParameter>
</Fill>
</Halo>
<Fill>
<CssParameter name="fill">#808080</CssParameter>
</Fill>
<!-- VendorOption を TextSymbolizer 終了タグの直前にに -->
<VendorOption name="maxDisplacement">50</VendorOption>
<VendorOption name="labelAllGroup">true</VendorOption>
<VendorOption name="removeOverlaps">true</VendorOption>
<VendorOption name="followLine">true</VendorOption>
<VendorOption name="group">true</VendorOption>
<!-- ここまで -->
</TextSymbolizer>
</Rule>
</FeatureTypeStyle>
---

no validation error と表示されたら「submit」ボタンをクリックします。

10 左側の欄の Data -> Layers をクリックします。
11 「japan_highway」をクリックします。
12 ページ上部の「Publishing」タブをクリックします。
13 「Default Title」の「Default Style」が「osm_roads」にします。
(他は変更しません。)
14 ページ下部の「Save」ボタンをクリックします。

14 Open Street Map 2 - GeoServer に登録

14-3 GeoServer に OpenStreetMap のデータを登録

PostGIS データベース "osm" の data store を作成します。
1 左側の欄の「Data」の「Stores」をクリックします。
2 「Add new Store」をクリックします。
3 「PostGIS」をクリックします。
4 Workspace の初期設定は変えずに、Basic Store Info の Name と Description を入力します。

Workspace: npn (変更なし)
Data Source Name: osm
Description: Open Street Map (説明、任意です)
Enabled: チェックする(変更なし)

5 PostGIS データベースの Connection Parameters を指定します。

dbtype: postgis (変更なし)
host: localhost (変更なし)
port: 5432 (変更なし)
database: osm
schema: public (変更なし)
user: user (japan_highway テーブルに接続できるユーザ)
password: ●●●●●●● (user がテーブルに接続するときのパスワード)
Namespace: http://geoserver.sf.net(固定)
Expose primary keys: チェックしない(変更なし)
max connections: 10 (変更なし、任意です)
min connections: 1 (変更なし、任意です)
fetch size: 1000 (変更なし、任意です)
Connection timeout: 20 (変更なし、任意です)
validate connection: チェックする
Primary key metadata table: (空、変更なし、任意です)
Loose bbox: チェックする(変更なし)
preparedStatements: チェッしない(変更なし)
Max open prepared statements: 50 (変更なし、任意です)

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

「Layer Configration」
0 「Create a new data store」から続けて操作しても OK です。
1 左側の欄の「Data」の「Layers」をクリックします。
2 「Add a new resource」をクリックします。
3 「New Layer chooser」の「Add a layer from」ドロップダウンから「npn:osm」を選択します。
4 OSM store のリソース(レイヤ)のリストが表示されます。
「japan_highway」の「Publish」をクリックします。
5 選択したレイヤのリソースと編集した情報の設定をします。

「Basic Resource Info」を入力します。
Name: japan_highway (変更なし)
Title: Japan Highway (最初の文字を大文字に変更 任意)
Abstract: Open Street Map Japan Highway (任意)

「Keywords」を入力します。
Current Keywords: (追加したキーワードが表示されます)
New Keyword: japan highway, OSM (1つずつ入力して「追加」ボタンをクリック)
「Metadata links」は変更しません。
「Coordinate Reference Systems」を入力します。
Native SRS: 空(変更なし)
Declared SRS: EPSG:4326 (「Find」ボタンをクリックして「4326」を検索して表示された「4326」をクリック)
SRS handling: Force declared (変更しない)

6 「Bounding Boxes」を入力します。
Native Bounding Box: (「Compute from data」をクリック -以下の値が入力されました)
Min X: 122.94
Min Y: 24.322
Max X: 145.82
Max Y: 45.522
Lat/Lon Bounding Box: (「Compute from native bounds」をクリック -以下の値が入力されました)
Min X: 122.94
Min Y: 24.322
Max X: 145.82
Max Y: 45.522

7 ページ上部の「Publishing」タブをクリックします。
8 「Default Title」の「Default Style」を「simple_roads」にします。
(他は変更しません。)
9 ページ下部の「Save」ボタンをクリックします。

「Layer」ページの一番下に「japan_highway」が追加されます。

「Preview the Layer」
1 左側の欄の「Layer Preview」をクリックし、「japan_highway」を検索します。
2 Common Formats 列の「OpenLayers」をクリックします。
3 成功すれば、OpenLayers Map がポリゴンで表示されます。

14 Open Street Map 1 - PostGIS に登録

14-1 OSM ダウンロード

1 GeoServer and OpenStreetMap ページ
http://blog.geoserver.org/2009/01/30/geoserver-and-openstreetmap/

の 「download sections of the data set」リンクをクリックします。
2 Cloudmade の Mappers の Download ページ
http://downloads.cloudmade.com/
の Last maps update: 03 February 2011 の「Asia」リンクをクリックします。
3 Last maps update: 03 February 2011 の「World > Asia」の「Japan」リンクをクリックします。
4 「japan.shapefiles.zip」をクリックし、「japan.shapefiles.zip を開く」で「ファイルを保存」ボタンをクリックしてダウンロードします。

5 japan.shapefiles.zip を解凍します。

user@deb-vmw:~/ダウンロード$ mkdir japan_shapefiles
user@deb-vmw:~/ダウンロード$ mv japan.shapefiles.zip japan_shapefiles/
user@deb-vmw:~/ダウンロード$ cd japan_shapefiles/
user@deb-vmw:~/ダウンロード/japan_shapefiles$ ls
japan.shapefiles.zip
user@deb-vm:~/ダウンロード/japan_shapefiles$ unzip japan.shapefiles.zip
Archive: japan.shapefiles.zip
inflating: japan_natural.dbf
inflating: japan_administrative.dbf
inflating: japan_water.prj
inflating: japan_highway.prj
inflating: japan_coastline.shx
inflating: japan_location.prj
inflating: japan_poi.shp
inflating: japan_administrative.shx
inflating: japan_coastline.dbf
inflating: japan_water.dbf
inflating: japan_natural.prj
inflating: readme.txt
inflating: japan_poi.shx
inflating: japan_administrative.shp
inflating: japan_coastline.shp
inflating: japan_water.shp
inflating: japan_poi.prj
inflating: japan_highway.shx
inflating: japan_coastline.prj
inflating: japan_water.shx
inflating: japan_poi.dbf
inflating: japan_location.shx
inflating: japan_location.dbf
inflating: japan_administrative.prj
inflating: japan_highway.shp
inflating: japan_natural.shp
inflating: japan_natural.shx
inflating: japan_highway.dbf
inflating: japan_location.shp

japan_administrative
japan_coastline
japan_highway
japan_location
japan_natural
japan_poi
japan_water
readme.txt

内容:道路、タイプ:polyline、属性:highway type,name,一方通行

14-2 PostGIS に japan_highway.shp を登録します。

1 template_postgisをテンプレートとして、オーナーが user で osm というデータベースを作成します。

user@deb6-vmw:~/ダウンロード/japan_shapefiles$ su - postgres
パスワード:
postgres@deb6-vmw:~$ createdb -T template_postgis -O user osm
postgres@deb6-vmw:~$ psql -l

データベース一覧
名前 | 所有者 | エンコーディング | 照合順序 | Ctype(変換演算子) | アクセス権
------------------+----------+------------------+-------------+-------------------+-----------------------
nippon_bmi | user | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 |
nippon_dnli | user | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 |
osm | user | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 |
postgres | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 |
template0 | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres
: postgres=CTc/postgres
template1 | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres
: postgres=CTc/postgres
template_postgis | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 |
(stdin):q

osm データベースの geometry_column テーブルと spatial_ref_sys テーブルのオーナーを user に変更します。

postgres@deb6-vmw:~$ psql osm
psql (8.4.7)
"help" でヘルプを表示します.

osm-# \d

リレーションの一覧
スキーマ | 名前 | 型 | 所有者
----------+-------------------+----------+----------
public | geography_columns | ビュー | postgres
public | geometry_columns | テーブル | postgres
public | spatial_ref_sys | テーブル | postgres
(3 行)

osm=# ALTER TABLE geometry_columns OWNER TO user;
ALTER TABLE
osm=# ALTER TABLE spatial_ref_sys OWNER TO user;
ALTER TABLE
osm=# \d

リレーションの一覧
スキーマ | 名前 | 型 | 所有者
----------+-------------------+----------+----------
public | geography_columns | ビュー | postgres
public | geometry_columns | テーブル | user
public | spatial_ref_sys | テーブル | user
(3 行)

osm=# \q


2 shp2pgsqlコマンドを使ってシェイプファイルを sql ファイルを作成します。
一般ユーザでシェイプファイルのあるディレクトリに移動して、次のように入力します。

postgres@deb-vmw:~$ exit
logout
user@deb6-vmw:~$ cd ダウンロード/japan_shapefiles
user@deb6-vmw:~/ダウンロード/japan_shapefiles$ shp2pgsql japan_highway japan_highway > japan_highway.sql
Shapefile type: Arc
Postgis type: MULTILINESTRING[2]
Unable to convert field value "南牧場線" to UTF-8: iconv reports "Invalid or incomplete multibyte or wide character"

sql ファイルが作成できなかったので、utf-8 エンコードを utf-8 にするという(?)オプションを追加しました。

user@deb6-vmw:~/ダウンロード/japan_shapefiles$ shp2pgsql -W utf-8 japan_highway japan_highway > japan_highway.sql
Shapefile type: Arc
Postgis type: MULTILINESTRING[2]

psqlコマンドを使ってデータベースに登録します。
一般ユーザで sql ファイルのあるディレクトリに移動して、次のように入力します。

user@deb6-vmw:~/Download/japan_shapefiles$ psql -d osm -f japan_highway.sql

メッセージが流れて、終了するまでに時間がかかります。
データベースを確かめてみます。
user@deb6-vmw:~/ダウンロード/japan_shapefiles$ psql osm
psql (8.4.7)
"help" でヘルプを表示します.

osm=> \dt


List of relations
Schema | Name | Type | Owner
--------+------------------+-------+-------
public | geometry_columns | table | user
public | japan_highway | table | user
public | spatial_ref_sys | table | user
(3 rows)

osm=> \d japan_highway

テーブル "public.japan_highway"
カラム | 型 | 修飾語

----------+------------------------+----------------------------------------------------------------
gid | integer | not null デフォルト nextval('japan_highway_
gid_seq'::regclass) type | character varying(24) |
name | character varying(133) |
oneway | character varying(11) |
lanes | numeric(11,0) |
the_geom | geometry |
インデックス:
"japan_highway_pkey" PRIMARY KEY, btree (gid)CHECK 制約:
"enforce_dims_the_geom" CHECK (st_ndims(the_geom) = 2)
"enforce_geotype_the_geom" CHECK (geometrytype(the_geom) = 'MULTILINESTRING'::text OR the_geom IS NULL)
"enforce_srid_the_geom" CHECK (st_srid(the_geom) = (-1))
~
(stdin):q

osm=> \q

続く ...

2011年4月21日木曜日

13 GeoServer 2 PostGIS Table の追加 - Debian6

13-3 PostGIS Table の追加1 国土数値情報
Getting Started ページ
http://docs.geoserver.org/stable/en/user/gettingstarted/index.html

の「Adding a PostGIS Table」

をクリックします。

Adding a PostGIS Table ページ
http://docs.geoserver.org/stable/en/user/gettingstarted/postgis-quickstart/index.html


13-3-1 Workspaces の追加

1 左側の欄の「Data」の「Workspaces」をクリックします。
2 「Add new workspace」をクリックします。
3 「New Workspace」で次のように入力します。

Name: npn (10文字以内)
Namespace URI: http://www.myhome.net/npn
(インターネット上の唯一(unique)の空間。実際に存在しなくてもいい。
公開予定がないなら上記のように適当に。)

4 「Default Workspace」にチェックをつけて、「Submit」ボタンをクリックします。


既に使用している PostGIS のデータを追加するので、「Getting Started」を省略します。

13-3-2 Store の追加
最初のステップは、PostGIS データベース "nippon_dnli" の data store を作成します。
data store は GeoServer にデータベースの接続の方法を教えます。

1 左側の欄の「Data」の「Stores」をクリックします。
2 「Add new Store」をクリックします。
3 「PostGIS」をクリックします。
4 Workspace の初期設定は変えずに、Basic Store Info の Name と Description を入力します。

Workspace: npn (変更なし)
Data Source Name: dnli
Description: Digital National Land Info. (説明、任意です)
Enabled: チェックする(変更なし)


5 PostGIS データベースの Connection Parameters を指定します。

dbtype: postgis (変更なし)
host: localhost (変更なし)
port: 5432 (変更なし)
database: nippon_dnli
schema: public (変更なし)
user: user (tokyo_kuiki テーブルに接続できるユーザ)
password: ●●●●●●● (user がテーブルに接続するときのパスワード)
Namespace: http://www.myhome.net(固定)
Expose primary keys:(transactional WFS を使用するときに必要 チェックなしのとき読み取り専用)
max connections: 10 (変更なし、任意です)
min connections: 1 (変更なし、任意です)
fetch size: 1000 (変更なし、任意です)
Connection timeout: 20 (変更なし、任意です)
validate connection: チェックする
Primary key metadata table: (空、変更なし、任意です)
Loose bbox: チェックする(変更なし)
preparedStatements: チェッしない(変更なし)
Max open prepared statements: 50 (変更なし、任意です)

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


13-3-3 Layer Configration
0 「Create a new data store」から続けて操作しても OK です。
1 左側の欄の「Data」の「Layers」をクリックします。
2 「Add a new resource」をクリックします。
3 「New Layer chooser」の「Add a layer from」ドロップダウンから「npn:dnli」を選択します。
4 Tokyo store のリソース(レイヤ)のリストが表示されます。
「tokyo_kuiki」の「Publish」をクリックします。
5 選択したレイヤのリソースと編集した情報の設定をします。

「Basic Resource Info」を入力します。
Name: tokyo_kuiki (変更なし)
Title: Tokyo Kuiki (最初の文字を大文字に変更 任意)
Abstract: Digital National Land Info. Tokyo Kuiki (任意)

「Keywords」を入力します。
Current Keywords: (追加したキーワードが表示されます)
New Keyword: Tokyo, Kuiki (1つずつ入力して「追加」ボタンをクリック)

「Metadata links」は変更しません。

「Coordinate Reference Systems」を入力します。
Native SRS: 空(変更なし)
Declared SRS: EPSG:4326 (「Find」ボタンをクリックして「4326」を検索して表示された「4326」をクリック)
SRS handling: Force declared (変更しない)

6 「Bounding Boxes」を入力します。
Native Bounding Box: (「Compute from data」をクリック -以下の値が入力されました)
Min X: 136.069
Min Y: 20.425
Max X: 153.987
Max Y: 35.898
Lat/Lon Bounding Box: (「Compute from native bounds」をクリック -以下の値が入力されました)
Min X: 136.069
Min Y: 20.425
Max X: 153.987
Max Y: 35.898

7 ページ上部の「Publishing」タブをクリックします。
8 「Default Title」の「Default Style」が「polygon」になっていることを確認します。
(他は変更しません。)
9 ページ下部の「Save」ボタンをクリックします。


「Layer」ページの一番下に「tokyo_kuiki」が追加されます。


「Preview the Layer」
1 左側の欄の「Layer Preview」をクリックし、「tokyo_kuiki」を検索します。
2 Common Formats 列の「OpenLayers」をクリックします。


3 成功すれば、OpenLayers Map がポリゴンで表示されます。
範囲が諸島部まで入っていました。

13 GeoServer 1 インストール - Debian6

13-1 GeoServer のインストール

GeoServer のホームページ
http://geoserver.org/display/GEOS/Welcome

の Documentation リンクをクリック。

Documentation サイト
http://docs.geoserver.org/

の User Manual リンクをクリック。

GeoServer User Manual ページ
http://docs.geoserver.org/stable/en/user/

の「Installation」をクリック。

Installation ページ
http://docs.geoserver.org/stable/en/user/installation/index.html

の「OS-independent binary」をクリックします。
説明によると、すべての OS にインストールできるようです。
Linux のインストールの説明がないので、「OS-independent binary」をインストールします。


Download ページ
http://geoserver.org/display/GEOS/Download

の「Stable」をクリック。

Stable ページ
http://geoserver.org/display/GEOS/Stable

から「Binary(OS independent)」をダウンロードします。
geoserver-2.0.2-bin.zip ファイルを解凍します。

user@deb6-vmw:~$ cd ダウンロード
user@deb6-vmw:~$ unzip geoserver-2.0.2-bin.zip
user@deb6-vmw:~/ダウンロード$ mv geoserver-2.0.2 ../
user@deb6-vmw:~/ダウンロード$ cd
user@deb6-vmw:~$ ls
---
geoserver-2.0.2
---

geoserver-2.0.2 ディレクトリに移動して、RUNNING.txt を開きます。

user@deb6-vmw:~$ cd geoserver-2.0.2/
user@deb6-vmw:~/geoserver-2.0.2$ ls
GPL.txt README.txt bin etc logs start.jar
LICENSE.txt RUNNING.txt data_dir lib resources webapps
user@deb6-vmw:~/geoserver-2.0.2$ vim RUNNING.txt


ここに動作手順が書かれています。
最初に、「(0) Download and install a Java Development Kit」にJava Development Kit (JDK) のインストールについて書いてありますが、既にインストールしてあるので省略します。
次の「(1) Download and install the GeoServer binary」も作業が済んでいます。

ここに、GeoServer のあるディレクトリについて symbolic name(環境変数)を設定しておくとよいとあります。

.bashrc の最後の行に次のように追加しました。

user@deb6-vmw:~/geoserver-2.0.2$ cd
user@deb6-vmw:~$ vim .bashrc
---
export GEOSERVER_HOME=geoserver-2.0.2


再ログインして次のコマンドで確認します。

user@deb6-vmw:~$ printenv GEOSERVER_HOME
geoserver-2.0.2


「(2) Start Up GeoServer」の UNIX の例で GeoServer を起動します。

user@deb6-vmw:~$ $GEOSERVER_HOME/bin/startup.sh
The JAVA_HOME environment variable is not defined
This environment variable is needed to run this program

この様にメッセージが出たので、.bashrc の最後の行に次のように追加しました。

user@deb6-vmw:~$ vim .bashrc
---
export GEOSERVER_HOME=geoserver-2.0.2
export JAVA_HOME=/usr/lib/jvm/java-6-openjdk


再ログインして次のコマンドで確認し、GeoServer を起動します。

user@deb6-vmw:~$ printenv JAVA_HOME
/usr/lib/jvm/java-6-sun
user@deb6-vmw:~$ $GEOSERVER_HOME/bin/startup.sh


$GEOSERVER_HOME/bin に移動して「./startup.sh」でもできます。

user@deb6-vmw:~$cd $GEOSERVER_HOME/bin
user@deb6-vmw:~$./startup.sh


Web ブラウザのアドレス欄に「http://localhost:8080/geoserver」と入力して Enter キーを押すと次のように GeoServer のページが表示されます。



13-2 GeoServer クイックスタート

ドキュメンテーション(目次)ページ
http://docs.geoserver.org/

の 「User Manual」をクリック、

Geoserver User Manual ページ
http://docs.geoserver.org/stable/en/user/

の「Getting Started」をクリック、

Getting Started ページ
http://docs.geoserver.org/2.0.x/en/user/gettingstarted/index.html

の「Web Administration Interface Quickstart」

をクリックします。

Web Administration Interface Quickstart ページ
http://docs.geoserver.org/stable/en/user/gettingstarted/web-admin-quickstart/index.html

には、「Web Administration Tool」の操作方法が記述されています。
これに沿って GeoServer を使ってみます。

「Logging In」
サーバの設定は、ログインして行います。
最初のユーザ名とパスワードは、「admin」と「geoserver」です。
ユーザ名とパスワードの変更は、「GeoServer Data Directory」の「security/users.properties」ファイルを編集します。
今回は変更しないで使いました。



もし前述のように何もデータがないときは、別の端末を起動して次のようにリンクを作成してください。

user@deb6-vmw:~$ cd geoserver-2.0.2/webapps/geoserver/
user@deb6-vmw:~/geoserver-2.0.2/webapps/geoserver$ mv data data_org
user@deb6-vmw:~/geoserver-2.0.2/webapps/geoserver$ ln -s ../../data_dir data

Geoserver をログアウトし Geoserver を再起動します。

user@deb6-vmw:~/geoserver-2.0.2/webapps/geoserver$ cd
user@deb6-vmw:~$ $GEOSERVER_HOME/bin/shutdown.sh
user@deb6-vmw:~$ $GEOSERVER_HOME/bin/startup.sh

ログインすると次のように表示されます。