OpenStreetMapで地図タイルサーバーを構築する
OpenStreetMapで地図タイルサーバーを構築する
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パワーを必要とする上に、
ソフトウェアのバージョンアップによって構築手順が変わってくることがありましたが、
こういう便利なソフトウェアが世の中には存在するのですね。