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は、公式の配信サーバも利用できるのですが独自に立てることも出来るんわけなんです。

どんな形で仕組みで配信されるかというと、以下のサイトの図がいい感じにまとまってるので引用させてもらいます。

ircama.github.io

今回の環境

インストール手順

基本的にはこちらのサイトの手順に則ってます。ライブラリとかの関係で一部修正している部分があります。

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

作成したPostgreSQLgis 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_tilerenderd フォルダの作成と所有者の変更

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 にアクセスする。 下の画像がブラウザに表示される。 f:id:hinosita:20170818065318p:plain

まとめ

各ツールを1つずつインストールしながら、最新のubuntuでtile serverが動作するところまでは確認が取れました。 今回の手順をDockerファイルにまとめてコンテナ化が今後の課題かな。