あなた自身のウェブサイトでマップを提供するためにはいろいろな選択肢があります。使うのにいちばん基本的で簡単なのは、OpenLayersと呼ばれるJavaScriptライブラリを使うことで、あなた自身のウェブページに組み込むことができるドラッグ可能なマップを提供します。これは、この本のはじめの方のセクションに記述したhttp://osm.orgの"エクスポート"タブに似ています。この章ではさらにOpenStreetMapデータに基づくカスタマイズされたマップスタイルであなた自身のサーバにセットアップする方法を説明します。自転車や徒歩経路といった特定のOpenStreetMapデータを強調したいような場合、あるいはもしあなたが他の利用可能なマップスタイルに表示される要素に飽き足らない場合にはそうしたくなるかもしれません。
自分でマップを提供するのははかなり労力を要するタスクです。あなたが提供しようとしているエリアのサイズとシステム要件が変化することが予想されるトラフィックに依存します。一般的には、要件は10-20GBのストレージで4GBのメモリ、都市サイズの地域用には最近のデュアルコアプロセッサーを300GB超の高速ストレージに、24GBのメモリ、そして全世界用にはクアッドコアプロセッサー、といった範囲になります。
我々の目的のために、ウェブマップはいくつかの隣接した四角い、それぞれが256ピクセル四方の画像で作られており、地球上の特定の地理領域をカバーします。この例で使っている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
http://planet.openstreetmap.org/ からOpenStreetMapデータを少しだけ参照します。planet全体では圧縮して18GBあるため、このページには小さな国や州サイズに抽出されたものへのリンクがあります。取り扱うのに小さくて早いので、できればPBFファイル形式が望ましいです。この場合、我々は次のコマンドを発行してplanetファイル全体をダウンロードします:
cd planet wget http://planet.openstreetmap.org/planet-latest.osm.bz2
次に、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
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は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ライブラリを認識しています。おめでとうございます!
次に、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を使ってタイルのリクエストを処理するタイル提供ソフトウェアをセットアップする必要があります。これをやるために、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.