たぶん動く...

多分GIS系の人。あくまで個人的見解であり、所属団体を代表するものではありません。

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

postgresqlpostgisをインストール

sudo apt install postgresql postgresql-contrib postgis postgresql-12-postgis-3 postgresql-12-postgis-3-scripts

postgresqlgisというテーブルを作成し、gis extensionを導入する データベースに接続するユーザにrenderaccountを追加し、gisというデータベースを作成する。renderaccountに所有権を付与する。

sudo -u postgres -i
createuser renderaccount 
createdb -E UTF8 -O renderaccount gis

データベースに接続する。

psql

gisテーブルにgis extensionを導入する

\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 f:id:TTY6335:20220107225634p:plain

参考文献

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