Ubuntu 17でOpenStreetMap Tile Serverをたててみる
OpenStreetMap Tile Serverを最新のUbuntuで立てた際のメモ
はじめに
ちょっと仕事で、OpenStreetMap Tile Serverを立てる機会があったのですが、既存のサーバはUbuntu 14で立てられてたので再構築するなら新しいOSのバージョンにしようと思ったのがきっかけです。 既存のUbuntu 14の方は、apt-getでpackageをインストールすると簡単に立てられるのですが、Ubuntu 16以降はpackageをインストールが出来ない。
最小はDockerでDocker Hubからいい感じのコンテナイメージ持ってきてやろうと思ったのですが、Docker Hubを検索するとどのコンテナもUbuntu 14ベースで作成されていたので断念… そのため、まずは1から最新のUbuntuにインストールしてみました。
OpenStreetMap Tile Serverとは
ざっくり言うとOpenStreetMapを配信するためのサーバです。 OpenStreetMapは、公式の配信サーバも利用できるのですが独自に立てることも出来るんわけなんです。
どんな形で仕組みで配信されるかというと、以下のサイトの図がいい感じにまとまってるので引用させてもらいます。
今回の環境
- PC Virtual Box上のVM(1CPU、メモリ4G)
- Ubuntu 17
- PostgreSQL
- postgis
- Mapnik
- mod_tile
- renderd
- carto
インストール手順
基本的にはこちらのサイトの手順に則ってます。ライブラリとかの関係で一部修正している部分があります。
Manually building a tile server (16.04.2 LTS) | switch2osm
各種パッケージのインストール
サイトに記載されてるpackageで、libpng12
デフォルトでインストール出来ないため、リポジトリを追加します。
sudo apt-add-repository "deb http://us.archive.ubuntu.com/ubuntu/ xenial main universe" sudo apt-get update
パッケージのインストール
sudo apt install libboost-all-dev git-core tar unzip wget bzip2 build-essential autoconf libtool libxml2-dev libgeos-dev libgeos++-dev libpq-dev libbz2-dev libproj-dev munin-node munin libprotobuf-c0-dev protobuf-c-compiler libfreetype6-dev libpng12-dev libtiff5-dev libicu-dev libgdal-dev libcairo-dev libcairomm-1.0-dev apache2 apache2-dev libagg-dev liblua5.2-dev ttf-unifont lua5.1 liblua5.1-dev libgeotiff-epsg
PostgreSQL / postgis のインストール
postgresql-9.5-postgis-2.2
だけ postgresql-9.6-postgis-2.3
にバージョン更新しています。
更新しなくても、インストールは出来るのですが、警告画面みたいのが出たのでバージョンを更新しました。
sudo apt-get install postgresql postgresql-contrib postgis postgresql-9.6-postgis-2.3
PostgreSQL / postgisの初期設定します。
sudo -u postgres -i createuser mod_tile #mod_tileのUnixユーザはいる前提 createdb -E UTF8 -O mod_tile gis
postgisの設定
psql \c gis CREATE EXTENSION postgis; CREATE EXTENSION hstore; ALTER TABLE geometry_columns OWNER TO mod_tile; ALTER TABLE spatial_ref_sys OWNER TO mod_tile; \q
postgresユーザからログアウト
exit
osm2pgsqlツールのインストール
mkdir ~/src cd ~/src git clone git://github.com/openstreetmap/osm2pgsql.git cd osm2pgsql
osm2pgsqlに必要なライブラリをインストール
sudo apt install make cmake g++ libboost-dev libboost-system-dev libboost-filesystem-dev libexpat1-dev zlib1g-dev libbz2-dev libpq-dev libgeos-dev libgeos++-dev libproj-dev lua5.2 liblua5.2-dev
mkdir build && cd build cmake .. make sudo make install
Mapnikのインストール
Mapnikに必要なライブラリをインストール
sudo apt-get install autoconf apache2-dev libtool libxml2-dev libbz2-dev libgeos-dev libgeos++-dev libproj-dev gdal-bin libgdal1-dev libmapnik-dev mapnik-utils python-mapnik
Mapnikのインストールされていることの確認
python >>> import mapnik >>> >>> quit()
mod_tileとrenderdのインストール
cd ~/src git clone git://github.com/SomeoneElseOSM/mod_tile.git cd mod_tile ./autogen.sh ./configure make sudo make install sudo make install-mod_tile sudo ldconfig
tileのスタイルの設定
cd ~/src git clone git://github.com/gravitystorm/openstreetmap-carto.git cd openstreetmap-carto sudo apt install npm nodejs-legacy sudo npm install -g carto carto -v
Mapnikのスタイルの設定ファイルを生成
carto project.mml > mapnik.xml
日本のデータを登録
オープンストリートマップのデータを取得
mkdir ~/data cd ~/data wget http://download.geofabrik.de/asia/japan-latest.osm.pbf
作成したPostgreSQLの gis
DBにデータを登録
osm2pgsql -d gis --create --slim -G --hstore --tag-transform-script ~/src/openstreetmap-carto/openstreetmap-carto.lua -C 2500 --number-processes 1 -S ~/src/openstreetmap-carto/openstreetmap-carto.style ~/data/japan-latest.osm.pbf
今回用意した環境だと、データ投入に約4時間程かかりました。
低ズームの国境などのシェイプファイルの取得
cd ~/src/openstreetmap-carto/
scripts/get-shapefiles.py
フォントファイルの取得
sudo apt-get install fonts-noto-cjk fonts-noto-hinted fonts-noto-unhinted ttf-unifont
renderdの設定
- /usr/local/etc/renderd.conf
作成したmapnik.xml
ファイルの場所を指定する
XML=/home/mod_tile/src/openstreetmap-carto/mapnik.xml
Apacheの設定
mod_tile
と renderd
フォルダの作成と所有者の変更
sudo mkdir /var/lib/mod_tile sudo chown mod_tile /var/lib/mod_tile sudo mkdir /var/run/renderd sudo chown mod_tile /var/run/renderd
mod_tileモジュールの設定ファルを設定
- mod_tile.conf
LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so
設定の反映
sudo a2enconf mod_tile
- /etc/apache2/sites-available/000-default.conf
LoadTileConfigFile /usr/local/etc/renderd.conf ModTileRenderdSocketName /var/run/renderd/renderd.sock # 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
Apacheの設定ファイルを再読込
sudo service apache2 reload
renderdの初回起動
renderd -f -c /usr/local/etc/renderd.conf
起動したら、http://サーバのIPアドレス/hot/0/0/0.png
にアクセスする。
下の画像がブラウザに表示される。
まとめ
各ツールを1つずつインストールしながら、最新のubuntuでtile serverが動作するところまでは確認が取れました。 今回の手順をDockerファイルにまとめてコンテナ化が今後の課題かな。