OpenRailwayMapサーバを構築する
最近OpenStreetMapのデータから作成したOpenRailwayMapが話題になったようです。 いろいろ試行錯誤してやっとサーバを構築できたので記事にしてみました。
結論から言うと、OpenRailwayMapの公式ページで紹介されている方法だと構築失敗しました。個人的に察するに、多分紹介されている方法が古い。 中身はOpenStreetMapなのだから、OSMのサーバ構築手順とおなじなのでは?と考え、こちら の方法に沿ってサーバを構築しました。
実施環境
AWS EC2 t2.large Ubuntu 20.04.3 LTS
ソフトウェアのインストール
renderaccountユーザを作成する
sudo useradd -m renderaccount sudo passwd renderaccount # sudo権限を付与する sudo -i usermod -aG sudo renderaccount exit
postgresql と postgisをインストール
sudo apt install postgresql postgresql-contrib postgis postgresql-12-postgis-3 postgresql-12-postgis-3-scripts
postgresqlにgisというテーブルを作成し、gis extensionを導入する データベースに接続するユーザにrenderaccountを追加し、gisというデータベースを作成する。renderaccountに所有権を付与する。
sudo -u postgres -i createuser renderaccount createdb -E UTF8 -O renderaccount gis
データベースに接続する。
psql
\c gis CREATE EXTENSION postgis; CREATE EXTENSION hstore; ALTER TABLE geometry_columns OWNER TO renderaccount; ALTER TABLE spatial_ref_sys OWNER TO renderaccount;
データベースから抜ける
\q
renderaccountから抜ける
exit
osm2pgsqlをインストールする
sudo apt install osm2pgsql
Mapnikをインストールする 必要なパッケージをインストール
sudo apt install autoconf apache2-dev libtool libxml2-dev libbz2-dev libgeos-dev libgeos++-dev libproj-dev gdal-bin libmapnik-dev mapnik-utils python3-mapnik python3-psycopg2 python3-yaml
Mapnikがインストールできたか確認する
python3 >>> import mapnik >>>exit()
mod_tileとrenderdをインストールする makeに時間がかかります。cpuクレジットが残りわずかだと失敗します。
mkdir ~/src cd ~/src git clone -b switch2osm git://github.com/SomeoneElseOSM/mod_tile.git cd mod_tile ./autogen.sh #warningがでても無視 ./configure make sudo make install #warningがでても無視 sudo make install-mod_tile #warningがでても無視 sudo ldconfig
スタイルシートの設定 cartoのインストール プロンプトでcartro -vを実行し、バージョンが表示されればOK。
sudo apt install npm sudo npm install -g carto carto -v 1.2.0
ここからはopenrailwaymap独自の設定になります。 ここからはrenderaccountユーザでの作業になります。
スタイルシートの作成
mkdir ~/src cd ~/src git clone https://github.com/OpenRailwayMap/OpenRailwayMap-CartoCSS.git cd OpenRailwayMap-CartoCSS make
データの投入
openstreetmapの全世界データから鉄道データを抽出します。 wgetでplanetデータをダウンロードすると、とても時間がかりますが、awsでオープンデータとしてplanetデータが公開されています。 こちらをダウンロードしたほうが早いです。1週間毎にファイルが更新されて行っているようです。鉄道が頻繁に廃線になったり、新しく開通したりするわけではないので、こちらでいいでしょう。 ここからの作業は、ディスク容量と計算リソースをとても食うので、ご注意ください。 planetデータをダウンロードする。
aws s3 cp s3://osm-pds/2021/planet-211227.osm.pbf ~/data/ --no-sign-request #60GB以上あります。
鉄道関連のデータだけ抽出する。抽出したデータはplanet-railway.osm.pbfとします。
osmium tags-filter -o ~/data/planet-railway.osm.pbf ~/data/planet-latest.osm.pbf "nwr/railway r/route=train r/route=light_rail r/route=tram r/route=subway nwr/disused:railway nwr/abandoned:railway nwr/razed:railway nwr/construction:railway nwr/proposed:railway"
抽出した結果、planet-railway.osm.pbfは500MB程度でした。
データベースにデータを投入する かなりの計算リソースを使います。そしてDBの性能によりますが、完了までに10分以上かかるかと思います。
osm2pgsql --create --database gis --hstore --slim --merc --style ~/src/OpenRailwayMap-CartoCSS/setup/openstreetmap-c arto.style --tag-transform ~/src/OpenRailwayMap-CartoCSS/setup/openstreetmap-carto.lua --multi-geometry --cache 7000 data/planet-railway.osm.pbf
データベースにインデックスの作成
cat <<EOF | sudo -u postgres psql -d gis CREATE INDEX openrailwaymap_line_all_but_ab_raz_prop ON planet_osm_line USING gist(way) WHERE railway IN ('rail', 'tram', 'light_rail', 'subway', 'narrow_gauge', 'disused', 'construction'); CREATE INDEX openrailwaymap_line_low ON planet_osm_line USING gist(way) WHERE railway = 'rail' AND tags->'usage' IN ('main', 'branch') AND tags->'service' IS NULL; CREATE INDEX openrailwaymap_line_med ON planet_osm_line USING gist(way) WHERE railway = 'rail' AND tags->'usage' = 'main' AND tags->'service' IS NULL; CREATE INDEX openrailwaymap_electrification_signals ON planet_osm_line USING gist(way) WHERE railway = 'signal' AND tags ? 'railway:signal:electricity'; EOF
psql -d gis -f sql/osm_carto_views.sql psql -d gis -f sql/functions.sql psql -d gis -f sql/get_station_importance.sql
フォントのインストール
sudo apt install fonts-noto-cjk fonts-noto-hinted fonts-noto-unhinted ttf-unifont
webサーバの設定
renderdの設定 “/usr/local/etc/renderd.conf”を編集します。 以下のように設定しました。
[renderd] num_threads=4 tile_dir=/var/lib/mod_tile stats_file=/var/run/renderd/renderd.stats [mapnik] plugins_dir=/usr/lib/mapnik/3.0/input font_dir=/usr/share/fonts/truetype font_dir_recurse=1 [ajt] URI=/standard/ TILEDIR=/var/lib/mod_tile XML=/home/renderaccount/src/carto_test/OpenRailwayMap-CartoCSS/standard.xml HOST=localhost TILESIZE=512 MAXZOOM=19
num_threadsの数はPCのスペックが良ければ数を増やせるかもしれません。 DB周りは詳しくはわかりませんが...
Apacheの設定 画像をキャッシュするフォルダを作成し、所有者をrenderaccountに変更
sudo mkdir /var/lib/mod_tile sudo chown renderaccount /var/lib/mod_tile sudo mkdir /var/run/renderd sudo chown renderaccount /var/run/renderd
Apacheにmod_tileモジュールを追加する。
sudo nano /etc/apache2/conf-available/mod_tile.conf LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so
sudo systemctl restart apache2
sudo a2enconf mod_tile
Apacheにrenderdを読み込ませる。
sudo vim /etc/apache2/sites-available/000-default.conf
“ServerAdmin”と“DocumentRoot” の間に以下を追加します。10行目あたり。
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
renderdの実行
renderaccountにて以下を実行します。
renderd -f -c /usr/local/etc/renderd.conf
ブラウザで以下のアドレスを打ち込んでみて、画像が返されれば成功です。
http://[IPアドレス]/standard/0/0/0.png
参考文献
Manually building a tile server (20.04 LTS) – Switch2OSM
OpenRailwayMap-CartoCSS/SETUP.md at master · OpenRailwayMap/OpenRailwayMap-CartoCSS · GitHub
OpenRailwayMap/INSTALL.md at master · OpenRailwayMap/OpenRailwayMap · GitHub