FLOSS Manuals

 English |  Español |  Français |  Italiano |  Português |  Русский |  Shqip

OpenStreetMap Ja

Providing maps for your web site

あなたのウェブサイトでマップを提供する

あなた自身のウェブサイトでマップを提供するためにはいろいろな選択肢があります。使うのにいちばん基本的で簡単なのは、OpenLayersと呼ばれるJavaScriptライブラリを使うことで、あなた自身のウェブページに組み込むことができるドラッグ可能なマップを提供します。これは、この本のはじめの方のセクションに記述したhttp://osm.orgの"エクスポート"タブに似ています。この章ではさらにOpenStreetMapデータに基づくカスタマイズされたマップスタイルであなた自身のサーバにセットアップする方法を説明します。自転車や徒歩経路といった特定のOpenStreetMapデータを強調したいような場合、あるいはもしあなたが他の利用可能なマップスタイルに表示される要素に飽き足らない場合にはそうしたくなるかもしれません。

システム要件

自分でマップを提供するのははかなり労力を要するタスクです。あなたが提供しようとしているエリアのサイズとシステム要件が変化することが予想されるトラフィックに依存します。一般的には、要件は10-20GBのストレージで4GBのメモリ、都市サイズの地域用には最近のデュアルコアプロセッサーを300GB超の高速ストレージに、24GBのメモリ、そして全世界用にはクアッドコアプロセッサー、といった範囲になります。

タイルとは?

我々の目的のために、ウェブマップはいくつかの隣接した四角い、それぞれが256ピクセル四方の画像で作られており、地球上の特定の地理領域をカバーします。この例で使っているOpenLayersライブラリはこれらのタイルをグリッド内に配置し、地球上のどこでもドラッグできるビューを形成します。

OpenLayersを使う

OpenLayersはあなたのウェブサイトにマップを表示するためのJavaScriptライブラリです。とてもパワフルで、ボタン、オーバーレイ、ポップアップウィンドウそしてラインといった高度な機能を追加するのに使うことができます。この例では我々はこれを単にあなたが描画したマップを表示するのに使いますが、こういった機能を含めてもっと拡張するためには、http://openlayers.org/を訪問してください。

ツール連携

マップタイルの生成と提供には一連のツールを使っています:

Apacheはフロントエンドのサーバを提供し、あなたのウェブブラウザからのリクエストを処理し、リクエストをmod_tileに引き渡します。Apacheウェブサーバはまたあなたのマップウェブページ用にHTML, JavaScript, あるいはCSSといった静的なウェブコンテンツを提供するのに使われます。

Apacheはいったんウェブユーザからリクエストを受け取ると、そのリクエストを取り扱うためにmod_tileに渡します。Mod_tileはタイルが生成済みで使用可能かどうか、あるいはまだキャッシュに無いという理由で更新が必要かどうかチェックします。既に利用可能でレンダリングの必要が無ければ、直ちにクライアントにタイルを返します。レンダリングが必要であれば、それを"レンダーリクエスト"キューに追加するでしょう。そしてキューの先頭に来たとき、タイルレンダラーはそれをレンダリングし、タイルをクライアントに返します。

我々はタイルのレンダリングにMapnikというツールを使います。これは動作中のキューからできるだけ早くリクエストを取り出し、スタイル情報に従って様々なデータソースからデータを抽出し、そしてタイルをレンダリングします。このタイルはクライアントに渡され、次のアイテムをキューに移します。

レンダリングのために、OpenStreetMapデータはosm2pgsqlと呼ばれるツールで作成されたPostgreSQLデータベースに蓄えられます。この両者があいまってOpenStreetMap地理データへの効果的なアクセスを実現します。メインのOpenStreetMapサーバ上で60秒ごとに作成される差分ファイルのストリームを使ってPostgreSQLデータベース内のデータを最新に保つことができます。

あなたのタイルサーバのセットアップ

あなた自身のOpenStreetMapサーバをセットアップするのは長くかかるタスクで、Richard Weatのこちらのウェブサイトにいちばんよく書かれています: http://weait.com/content/build-your-own-openstreetmap-server

ソフトウェア構成

ハードウェアのアーキテクチャには Ubuntu (10.04) Lucid Lynx Serverのインストールから始めてください。そしてLAMPサーバとSSHサーバをインストール中に追加してください。インストールできたら、これはモニターもキーボードも無いヘッドレスのサーバとして実行できます。そしてsshを新しいボックスに入れて、始めましょう。Lucid Lynx用の更新がいくつかあるかもしれないので、あなたのシステム上で更新してください:

sudo apt-get update
sudo apt-get upgrade

このタイルサーバのインストール手順用に、いくつかの不可欠なシステムツールを入手してください:

sudo apt-get install subversion autoconf screen munin-node munin htop

ファイルシステムを組み立ててインストール手順を少し早くしましょう:

cd ~
mkdir src bin planet

最新のOpenStreetMap データを取得する 

http://planet.openstreetmap.org/ からOpenStreetMapデータを少しだけ参照します。planet全体では圧縮して18GBあるため、このページには小さな国や州サイズに抽出されたものへのリンクがあります。取り扱うのに小さくて早いので、できればPBFファイル形式が望ましいです。この場合、我々は次のコマンドを発行してplanetファイル全体をダウンロードします:

cd planet
wget http://planet.openstreetmap.org/planet-latest.osm.bz2

PostgreSQL データベースをインストールして構成設定 

次に、PostgreSQLデータベースシステムをインストールする必要があります。apt-getを使って始め、データベースと必要なエクステンションをインストールします:

sudo apt-get install postgresql-8.4-postgis postgresql-contrib-8.4 postgresql-server-dev-8.4 build-essential libxml2-dev libtool libgeos-dev libpq-dev libbz2-dev proj

PostgeSQL 8.4用のデフォルト構成では追加したいデータ量を調整する必要があります。/etc/postgresql/8.4/main/postgresql.conf にあるファイルを編集して以下のように変更してください:

shared_buffers = 128MB
checkpoint_segments = 20
maintenance_work_mem = 256MB
autovacuum = off

これらの変更にはカーネル構成の変更が必要です。次のように変更して保存し、あなたのコンピュータの次回リブート時に適用されるようにしてください:

sudo sysctl -w kernel.shmmax=268435456
sudo sysctl -p /etc/sysctl.conf

PostgreSQLをリスタートし、これらの新しい変更を適用します:

sudo /etc/init.d/postgresql-8.4 restart

エラー無しで、次のようなメッセージがレポートされなければなりません:

 * Restarting PostgreSQL 8.4 database server
   ...done.

gisと呼ばれるデータベースを作成します。これから先に使うツールの中にはこのデータベース名を前提としているものがあります。あなたのユーザ名を下記のように2箇所で置き換えてください。これはmapnikでマップをレンダリングするユーザ名であるべきです:

sudo -u postgres -i
createuser username # answer yes for superuser
createdb -E UTF8 -O username gis
createlang plpgsql gis
exit

PostgreSQLデータベース上にPostGISをセットアップします:

psql -f /usr/share/postgresql/8.4/contrib/postgis-1.5/postgis.sql -d gis

これは下記のように表示して終わる行を多数返すはずです:

...
CREATE FUNCTION
COMMIT
...
DROP FUNCTION

いくつかのPostGISエクステンションのデータにアクセスするために、新しく作成したユーザパーミッションを与えてください:

echo "ALTER TABLE geometry_columns OWNER TO username; ALTER TABLE spatial_ref_sys OWNER TO username;" | psql -d gis

OpenStreetMap データをデータベースにロードする 

OSMデータをPostgreSQLデータ形式に変換するツールのセットアップが必要です。最新のソースコードのチェックアウトから始めて、コンパイルしましょう:

cd ~/bin
svn co http://svn.openstreetmap.org/applications/utils/export/osm2pgsql/
cd osm2pgsql
./autogen.sh
./configure
make

コンパイルが終わったら、新しく作成したデータベース上に空間参照をセットする必要があります:

psql -f ~/bin/osm2pgsql/900913.sql -d gis

コンパイル済みの変換ツールと準備したデータベースを使って、先にあなたがダウンロードしたOpenStreetMapデータを次のコマンドで挿入します。このステップではディスクI/Oが激しく、変換を実行するコンピュータの処理速度とサーバから参照したデータの量によりますが、おおまかに30時間かかります。

cd ~/bin/osm2pgsql
./osm2pgsql -S default.style --slim -d gis -C 2048 ~/planet/planet-latest.osm.bz2

あなたのデータインポートを進行にあわせて見てみましょう。osm2pgsqlの最初のアウトプットには少したじろぎますが、これが正常です:

Using projection SRS 900913 (Spherical Mercator)
Setting up table: planet_osm_point
NOTICE:  table "planet_osm_point" does not exist, skipping
NOTICE:  table "planet_osm_point_tmp" does not exist, skipping
Setting up table: planet_osm_line
NOTICE:  table "planet_osm_line" does not exist, skipping
NOTICE:  table "planet_osm_line_tmp" does not exist, skipping
Setting up table: planet_osm_polygon
NOTICE:  table "planet_osm_polygon" does not exist, skipping
NOTICE:  table "planet_osm_polygon_tmp" does not exist, skipping
Setting up table: planet_osm_roads
NOTICE:  table "planet_osm_roads" does not exist, skipping
NOTICE:  table "planet_osm_roads_tmp" does not exist, skipping
Mid: pgsql, scale=100, cache=4096MB, maxblocks=524289*8192
Setting up table: planet_osm_nodes
NOTICE:  table "planet_osm_nodes" does not exist, skipping
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "planet_osm_nodes_pkey" for table "planet_osm_nodes"
Setting up table: planet_osm_ways
NOTICE:  table "planet_osm_ways" does not exist, skipping
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "planet_osm_ways_pkey" for table "planet_osm_ways"
Setting up table: planet_osm_rels
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "planet_osm_rels_pkey" for table "planet_osm_rels"

上記NOTICE: エントリーは気にしないでください。全て正常です。次に、osm2pgsqlは圧縮したplanetファイルの読み込みを開始します:

Reading in file: /home/user/planet/planet-latest.osm.bz2

osm2pgsqlがplanetファイルを読み込むのに合わせて、進捗がレポートされます。下記の行は数秒おきにリフレッシュされ、カッコ内の数字を更新します。インポートのこの部分には長い時間が掛かります。あなたのサーバ次第ですが、数時間から数日掛かります。

Processing: Node(10140k) Way(0k) Relation(0k)

インポートが進むにつれ、ノード番号は完了するまで1秒間に数回更新され、ウェイ番号はおおよそ1秒か2秒ごとに更新されます。最後に、リレーション番号はおおよそ1分に1回更新されます。これらの番号が進んでいる限り、インポート手順はあなたのサーバで正常に進んでいます。最初からやり直すことにした場合を除き、このインポート手順を中断しないでください。

Processing: Node(593072k) Way(45376k) Relation(87k)
Exception caught processing way id=110802
Exception caught processing way id=110803
Processing: Node(593072k) Way(45376k) Relation(474k)

上記に表示されている例外はplanetファイル中のマイナーなエラーによるものです。planetのインポートは正常に進んでいます。

次のステージ、osm2pgsqlのplanetインポート手順もあなたのハードウェア次第ですが、数時間から数日掛かります。次のように始まります:

Node stats: total(593072533), max(696096737)
Way stats: total(45376969), max(55410575)
Relation stats: total(484528), max(555276)

Going over pending ways
processing way (752k)

処理中のウェイ番号はおおよそ毎秒更新されます。

Going over pending relations

node cache: stored: 515463899(86.91%), storage efficiency: 96.01%, hit rate: 85.97%
Committing transaction for planet_osm_roads
Committing transaction for planet_osm_line
Committing transaction for planet_osm_polygon
Sorting data and creating indexes for planet_osm_line
Sorting data and creating indexes for planet_osm_roads
Sorting data and creating indexes for planet_osm_polygon
Committing transaction for planet_osm_point
Sorting data and creating indexes for planet_osm_point
Stopping table: planet_osm_nodes
Stopping table: planet_osm_ways
Stopping table: planet_osm_rels
Building index on table: planet_osm_rels
Stopped table: planet_osm_nodes
Building index on table: planet_osm_ways
Stopped table: planet_osm_rels
Completed planet_osm_point
Completed planet_osm_roads
Completed planet_osm_polygon
Completed planet_osm_line
Stopped table: planet_osm_ways

この時点でインポートは正常終了しました。

mapnikライブラリのインストール 

次に、Mapnikライブラリをインストールする必要があります。mapnikはOpenStreetMapデータをOpenLayersのウェブマップで使われるタイルにレンダリングするのに利用されます。始めるには、mapnikに依存関係があるものをダウンロードとソースのコンパイルの後にインストールします。

sudo apt-get install libltdl3-dev libpng12-dev libtiff4-dev libicu-dev libboost-python1.40-dev python-cairo-dev python-nose libboost1.40-dev libboost-filesystem1.40-dev libboost-iostreams1.40-dev libboost-regex1.40-dev libboost-thread1.40-dev libboost-program-options1.40-dev libboost-python1.40-dev libfreetype6-dev libcairo2-dev libcairomm-1.0-dev libgeotiff-dev libtiff4 libtiff4-dev libtiffxx0c2 libsigc++-dev libsigc++0c2 libsigx-2.0-2 libsigx-2.0-dev libgdal1-dev python-gdal imagemagick ttf-dejavu

Mapnikライブラリをソースからビルドします:

cd ~/src
svn co http://svn.mapnik.org/tags/release-0.7.1/ mapnik
cd mapnik
python scons/scons.py configure INPUT_PLUGINS=all OPTIMIZATION=3 SYSTEM_FONTS=/usr/share/fonts/truetype/
python scons/scons.py
sudo python scons/scons.py install
sudo ldconfig

Mapnikが正しくインストールされたかどうか検証します:

python
>>> import mapnik
>>> 

もしpythonが2番目のシェブロン(訳注:紋章の盾型の)プロンプトを返してエラーが無い場合は、pythonがMapnikライブラリを認識しています。おめでとうございます!

Mapnik ツールのインストール 

次に、OpenStreetMap Mapnikツールをインストールする必要があります、これはMapnikがOpenStreetMapデータをレンダリングするのを支援するデフォルトのスタイルファイルとを含みます:

cd ~/bin
svn co http://svn.openstreetmap.org/applications/rendering/mapnik

Mapnikは予め用意されたファイルを使って小縮尺のマップ用に海岸線や海洋を生成します、というのもこの情報のためには全データベースを読むよりもその方が早いためです。

cd ~/bin/mapnik
mkdir world_boundaries
wget http://tile.openstreetmap.org/world_boundaries-spherical.tgz
tar xvzf world_boundaries-spherical.tgz
wget http://tile.openstreetmap.org/processed_p.tar.bz2
tar xvjf processed_p.tar.bz2 -C world_boundaries
wget http://tile.openstreetmap.org/shoreline_300.tar.bz2
tar xjf shoreline_300.tar.bz2 -C world_boundaries
wget http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/10m-populated-places.zip
unzip 10m-populated-places.zip -d world_boundaries
wget http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/110m/cultural/110m-admin-0-boundary-lines.zip
unzip 110m-admin-0-boundary-lines.zip -d world_boundaries

データベースはロードされ、ツールはインストールされました。さあ一緒に全部テストしましょう。ユーザ名はあなたのユーザ名に置き換えることをお忘れなく。

cd ~/bin/mapnik
./generate_xml.py --dbname gis --user username --accept-none
./generate_image.py

image.pngを見て、イングランドのマップをレンダリングしたかどうか、確認してください。おめでとうございます!

Apache ウェブサーバと mod_tileのインストールと構成

さあ、これであなたのマップデータを使って画像を作成しましたので、これからApacheを使ってタイルのリクエストを処理するタイル提供ソフトウェアをセットアップする必要があります。これをやるために、Apacheウェブサーバをインストールし、mod_tileエクステンションを使ってタイルレンダリングシステムを処理します。

mod_tileのビルドに必要なツールのインストールから始めます:

sudo aptitude install apache2 apache2-threaded-dev apache2-mpm-prefork apache2-utils libagg-dev

mod_tileのソースコードをコンパイルします:

cd ~/src
svn co http://svn.openstreetmap.org/applications/utils/mod_tile
cd mod_tile
make
sudo make install

/etc/renderd.conf を編集して次の行のように変えて(ユーザ名は忘れずにあなたのユーザ名に変えてください)mod_tileの設定を変更します:

plugins_dir=/usr/local/lib/mapnik/input
font_dir=/usr/lib/mapnik/fonts
XML=/home/username/bin/mapnik/osm.xml
HOST=localhost

mod_tileシステムに必要なファイルを作成して実行します(ユーザ名は忘れずにあなたのユーザ名に変えてください):

sudo mkdir /var/run/renderd
sudo chown username /var/run/renderd

次に、ファイル /etc/apache2/conf.d/mod_tile を作成して1行加えることでApacheウェブサーバに新しくmod_tileをインストールしたことを通知しなければなりません:

LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so

同様に、Apacheのデフォルトのウェブサイト構成ファイルも変更してmod_tile設定に含める必要があります。ファイル /etc/apache2/sites-available/default を変更して管理者メールアドレス行の後に、次の行をいますぐ含めてください:

LoadTileConfigFile /etc/renderd.conf
ModTileRenderdSocketName /tmp/osm-renderd
# Timeout before giving up for a tile to be rendered
ModTileRequestTimeout 0
# Timeout before giving up for a tile to be rendered that is otherwise missing
ModTileMissingRequestTimeout 30

そしてmod_tileレンダリングアプリケーションを開始する必要があります。開始が成功した場合には何も出力されないことに注意してください。

cd ~/src/mod_tile
./renderd

おめでとうございます!これであなたは自分自身のOpenStreetMapデータのコピーを使ってタイルの生成が可能なサーバを手にしました。http://localhost/osm_tiles2/0/0/0.png にアクセスして作成済みの有効なマップタイルを得られたかどうか検証してください。

There has been error in communication with Booktype server. Not sure right now where is the problem.

You should refresh this page.