OpenStreetMapで地図タイルサーバーを構築する

OpenStreetMapで地図タイルサーバーを構築する

osm

OpenStreetMapはオープンソースの地理情報データを作成する事を目的としたプロジェクトで、
世界中の有志が地図を改善するために日々変更を加えています。

地図データはPlanet OSMで最新データが公開されていますが、
全データを導入するためにはハイスペックのサーバーと大容量のメモリが必要で、
参照するデータをSQLサーバーに入れるために最低でも数日間を要するため、
ベンチマーク情報が公開されているくらいです。
またダウンロードするデータ量も30GB近くあるため現実的ではありません。

そこで国別にデータが提供されている以下サイトよりデータを導入する事を推奨します。
http://download.geofabrik.de/asia.html

他の提供サイトについては以下URLを参照ください。
http://wiki.openstreetmap.org/wiki/Planet.osm

無料で利用できる地図情報はGoogle Mapsが有名ですが、
様々なライセンス規約によって縛られており、
一部のサイトでGoogle Mapsを自社サービスの地図として提供している所もありますが、
本来地図タイルとして利用する事はライセンス違反ですので、オープンソース技術を用いて地図の組み込みサイトを実現したいと思います。

前提パッケージのインストール

・前提パッケージのインストール

yum -y install subversion freetype-devel libxml2-devel bzip2-devel freetype-devel libtool-ltdl-devel libpng-devel libtiff-devel libjpeg-devel gcc-c++ python-devel bzip2-devel libcurl-devel libpng-devel libtiff-devel libtool-ltdl-devel pycairo-devel cairomm-devel libjpeg-turbo-devel git httpd-devel libmemcached-devel libtool apxs memcached-devel httpd lua-devel

・手動パッケージ認識用の追加設定

vi /etc/ld.so.conf.d/osm.conf
--------------------------------------------------
/usr/local/lib
/usr/local/lib64
/usr/local/pgsql/lib

・ソースからのパッケージインストール (postgresql)

http://ftp.postgresql.org/pub/source/v9.2.4/postgresql-9.2.4.tar.bz2
tar -jvxf postgresql-9.2.4.tar.bz2
cd postgresql-9.2.4
./configure
make
make install
/sbin/ldconfig

・ソースからのパッケージインストール (geos)

wget http://download.osgeo.org/geos/geos-3.3.8.tar.bz2
tar -jvxf geos-3.3.8.tar.bz2
cd geos-3.3.8
./configure
make
make install
/sbin/ldconfig

・ソースからのパッケージインストール (proj)

wget http://download.osgeo.org/proj/proj-4.8.0.tar.gz
tar -xvjf proj-4.8.0.tar.gz
cd proj-4.8.0
./configure
make
make install
/sbin/ldconfig

・ソースからのパッケージインストール (icu4c)

wget http://download.icu-project.org/files/icu4c/51.1/icu4c-51_1-src.tgz
tar -xvjf icu4c-51_1-src.tgz
cd icu/source
./configure
make
make install
/sbin/ldconfig

・ソースからのパッケージインストール (gdal)

wget http://download.osgeo.org/gdal/gdal-1.9.2.tar.gz
tar -xvzf gdal-1.9.2.tar.gz
cd gdal-1.9.2
./autogen.sh
./configure
make
make install
/sbin/ldconfig

・ソースからのパッケージインストール (protobuf)

wget http://protobuf.googlecode.com/files/protobuf-2.5.0.tar.bz2
tar -jvxf protobuf-2.5.0.tar.bz2
cd protobuf-2.5.0
./autogen.sh
./configure
make
make install
/sbin/ldconfig

・ソースからのパッケージインストール (protobuf-c)

wget http://protobuf-c.googlecode.com/files/protobuf-c-0.15.tar.gz
tar -xvzf protobuf-c-0.15.tar.gz
cd protobuf-c-0.15
./configure
make
make install
/sbin/ldconfig

・ソースからのパッケージインストール (postgis)

wget http://download.osgeo.org/postgis/source/postgis-2.0.2.tar.gz
tar -xvzf postgis-2.0.2.tar.gz
cd postgis-2.0.2
./autogen.sh
./configure --with-pgconfig=/usr/local/pgsql/bin/pg_config
make
make install
/sbin/ldconfig

・ソースからのパッケージインストール (boost)

wget http://downloads.sourceforge.net/project/boost/boost/1.53.0/boost_1_53_0.tar.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fboost%2Ffiles%2Fboost%2F1.53.0%2F&ts=1364186642&use_mirror=jaist
tar -xvzf boost_1_53_0.tar.gz
cd boost_1_53_0
./bootstrap.sh --prefix=/usr/local
./b2
./b2 install
/sbin/ldconfig

・osm2pgsqlのインストール

地図のOSMフォーマットをPostgreSQLに導入するツールをインストールします。

git clone https://github.com/openstreetmap/osm2pgsql
cd osm2pgsql
./autogen.sh
./configure --with-postgresql=/usr/local/pgsql/bin/pg_config
make
make install
ldconfig -v

GISデータベースの準備

予めデータベースをinitdbで準備した事を前提に、postgresユーザーで以下の操作を行います。

createdb template_postgis
psql -d template_postgis -c "UPDATE pg_database SET datistemplate=true WHERE datname='template_postgis'"
psql -d template_postgis -f /usr/local/pgsql/share/contrib/postgis-2.0/postgis.sql
psql -d template_postgis -f /usr/local/pgsql/share/contrib/postgis-2.0/spatial_ref_sys.sql
psql -d template_postgis -f /usr/local/pgsql/share/contrib/postgis-2.0/postgis_comments.sql
psql -d template_postgis -f /usr/local/pgsql/share/contrib/postgis-2.0/rtpostgis.sql
psql -d template_postgis -f /usr/local/pgsql/share/contrib/postgis-2.0/raster_comments.sql
psql -d template_postgis -f /usr/local/pgsql/share/contrib/postgis-2.0/topology.sql
psql -d template_postgis -f /usr/local/pgsql/share/contrib/postgis-2.0/topology_comments.sql
createdb gis
psql -d gis -f /usr/local/pgsql/share/contrib/postgis-2.0/postgis.sql
psql -d gis -f /usr/local/pgsql/share/contrib/postgis-2.0/spatial_ref_sys.sql
wget http://download.geofabrik.de/asia/japan-latest.osm.bz2
osm2pgsql -m -d gis japan-latest.osm.bz2 -U postgres --cache 2400

地図描画ソフトウェア(mapnik/mapnik-stylesheets)のインストール

wget https://github.com/downloads/mapnik/mapnik/mapnik-v2.0.2.tar.bz2
tar -jxvf mapnik-v2.0.2.tar.bz2
cd mapnik-v2.0.2
python scons/scons.py PG_CONFIG=/usr/local/pgsql/bin/pg_config
make install
ldconfig -v
cd ..

git clone git://github.com/openstreetmap/mapnik-stylesheets.git
cd mapnik-stylesheets
wget http://tile.openstreetmap.org/world_boundaries-spherical.tgz
wget http://tile.openstreetmap.org/processed_p.tar.bz2
wget http://tile.openstreetmap.org/shoreline_300.tar.bz2
tar xzf world_boundaries-spherical.tgz
tar xjf processed_p.tar.bz2 -C world_boundaries
tar xjf shoreline_300.tar.bz2 -C world_boundaries
cd word_boundaries
wget http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_populated_places.zip
wget http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/110m/cultural/ne_110m_admin_0_boundary_lines_land.zip
unzip ne_10m_populated_places.zip
unzip ne_110m_admin_0_boundary_lines_land.zip
・設定用XMLファイルの生成
localhostにPostgreSQLがインストールされていると仮定しての設定になります。

cd ../../mapnik-stylesheets
./generate_xml.py --host localhost --user postgres --dbname gis --symbols ./symbols/ --world_boundaries=./world_boundaries/ --accept-none

Apache用地図タイル描画モジュール(mod_tile)のインストール

mkdir -p /var/run/renderd
mkdir -p /var/lib/mod_tile
chmod 777 /var/run/renderd
chmod 777 /var/lib/mod_tile

vi /etc/renderd.conf
--------------------------------------------------
[renderd]
socketname=/var/run/renderd/renderd.sock
num_threads=8
tile_dir=/var/lib/mod_tile
stats_file=/var/run/renderd/renderd.stats

[mapnik]
plugins_dir=/usr/local/lib64/mapnik/input
font_dir=/usr/local/lib64/mapnik/fonts
font_dir_recurse=1

[default]
URI=/osm_tiles2/
XML=/path_to_mapnik-style/osm.xml # mapnik-style内のosm.xmlを指定
HOST=localhost

git clone https://github.com/openstreetmap/mod_tile.git
cd mod_tile
./autogen.sh
./configure --with-apxs=/usr/sbin/apxs
make
make install
make install-mod_tile
ldconfig

vi /etc/httpd/conf/httpd.conf
--------------------------------------------------
LoadModule tile_module modules/mod_tile.so
LoadTileConfigFile /etc/renderd.conf
ModTileRenderdSocketName /var/run/renderd/renderd.sock
# Timeout before giving up for a tile to be rendered
ModTileRequestTimeout 30
# Timeout before giving up for a tile to be rendered that is otherwise missing
ModTileMissingRequestTimeout 30
・地図タイルサーバーの起動
以下を実行し、Apacheを起動、また地図をレンダリングするアプリケーション(renderd)を起動します。
地図タイルは/etc/renderd.confに設定したURI(/var/lib/mod_tile/osm_tiles2)に生成されます。
この時のURLはhttp://_サーバーのIPアドレス_/osm_tiles2/x/y/z.pngで生成されます。

/etc/init.d/httpd start
/usr/local/bin/renderd -f > /var/log/renderd.log 2> /var/log/renderd.log &

・動作確認
以下のHTMLタグをコピペしウェブブラウザからアクセスして動作確認を行ってください。

vi /var/www/html/index.html
--------------------------------------------------
<html>
<head>
<title>OpenLayers Demo</title>
<style type="text/css">
html, body, #basicMap {
width: 100%;
height: 100%;
margin: 0;
}
</style>
<script src="http://www.openlayers.org/api/OpenLayers.js"></script>
<script>
function init() {
var options = {
projection: new OpenLayers.Projection("EPSG:900913"),
displayProjection: new OpenLayers.Projection("EPSG:4326"),
units: "m",
maxResolution: 156543.0339,
maxExtent: new OpenLayers.Bounds(-20037508.34, -20037508.34,
20037508.34, 20037508.34),
numZoomLevels: 20,
controls: [
new OpenLayers.Control.Navigation(),
new OpenLayers.Control.PanZoomBar(),
new OpenLayers.Control.Permalink(),
new OpenLayers.Control.ScaleLine(),
new OpenLayers.Control.MousePosition(),
new OpenLayers.Control.KeyboardDefaults()

]
};
map = new OpenLayers.Map("basicMap",options);
var newL = new OpenLayers.Layer.OSM("Default", "/osm_tiles2/${z}/${x}/${y}.png", {numZoomLevels: 19});
map.addLayer(newL);
map.zoomIn();
}
</script>
</head>
<body onload="init();">
<div id="basicMap"></div>
</body>
</html>

今回はOpenStreetMapというソフトウェアで地図タイルサーバーを構築しました。
Google Mapsの商用版はコストがかかりますし、他社でも数万円~数十万円はする価格設定ですので、
低価格でシステムを構築するにはこのOpenStreetMapは非常に便利です。

OpenLayersというJavaScriptのAPIを用いて世界地図を表示していますが、
この他にも様々な使い方があります。
レイヤーという概念を持っていますので、現在地にマーカーを置くという使い方もできます。

手順が多く、地図タイルサーバー(特にDB側)でCPUパワーを必要とする上に、
ソフトウェアのバージョンアップによって構築手順が変わってくることがありましたが、
こういう便利なソフトウェアが世の中には存在するのですね。

最新ブログ一覧