OSM2 オフラインタイルサーバ構築
http://extstrg.asabiya.net/pukiwiki/index.php?OSM2%20%A5%AA%A5%D5%A5%E9%A5%A4%A5%F3%A5%BF%A5%A4%A5%EB%A5%B5%A1%BC%A5%D0%B9%BD%C3%DBサーバ関連
目次
概要 †
Ubuntu 22を用いたタイルサーバの構築手順。
環境情報 †
OS | Ubuntu 22.04.4 LTS |
構築 †
概要 †
基礎情報はOSMのインストール手順を参考にすること。
Manually building a tile server (Ubuntu 22.04)
ユーザ作成 †
インストール作業を行うユーザのホームディレクトリ内に重要なファイルが配置されるため、専用のユーザを作成する。
- ユーザ作成
# adduser osm Adding user `osm' ... Adding new group `osm' (1001) ... Adding new user `osm' (1001) with group `osm' ... Creating home directory `/home/osm' ... Copying files from `/etc/skel' ... New password: Retype new password: passwd: password updated successfully Changing the user information for osm Enter the new value, or press ENTER for the default Full Name []: osm Room Number []: Work Phone []: Home Phone []: Other []: Is the information correct? [Y/n] y
アップデート †
OSのアップデートを行い、最新化する。
- アップデート
$ sudo su - osm $ sudo apt update $ sudo apt upgrade
パッケージインストール †
使用するパッケージをインストールする。
- インストール
$ sudo apt install screen locate libapache2-mod-tile renderd git tar unzip wget bzip2 apache2 lua5.1 mapnik-utils python3-mapnik python3-psycopg2 python3-yaml gdal-bin npm fonts-noto-cjk fonts-noto-hinted fonts-noto-unhinted fonts-unifont fonts-hanazono postgresql postgresql-contrib postgis postgresql-14-postgis-3 postgresql-14-postgis-3-scripts osm2pgsql net-tools curl
DB作成 †
GIS情報を格納するデータベースを作成する。
- DB作成
$ sudo -u postgres -i $ createuser _renderd $ createdb -E UTF8 -O _renderd gis
- スキーマ作成
$ psql psql (14.11 (Ubuntu 14.11-0ubuntu0.22.04.1)) Type "help" for help. postgres=# \c gis You are now connected to database "gis" as user "postgres". gis=# CREATE EXTENSION postgis; CREATE EXTENSION gis=# CREATE EXTENSION hstore; CREATE EXTENSION gis=# ALTER TABLE geometry_columns OWNER TO _renderd; ALTER TABLE gis=# ALTER TABLE spatial_ref_sys OWNER TO _renderd; ALTER TABLE gis=# \q
- DBユーザからログアウト
$ exit
Mapnikインストール †
- Mapnikインストール
$ python3 Python 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import mapnik >>> quit()
スタイルシート作成 †
- スタイルシート作成
$ mkdir ~/src $ cd ~/src $ git clone https://github.com/gravitystorm/openstreetmap-carto Cloning into 'openstreetmap-carto'... remote: Enumerating objects: 18101, done. remote: Counting objects: 100% (256/256), done. remote: Compressing objects: 100% (164/164), done. remote: Total 18101 (delta 140), reused 187 (delta 88), pack-reused 17845 Receiving objects: 100% (18101/18101), 17.23 MiB | 26.33 MiB/s, done. Resolving deltas: 100% (12514/12514), done. $ cd openstreetmap-carto $ sudo npm install -g carto
- バージョン確認
$ carto -v 1.2.0
- スタイルシートをMapnik用にコンバート
$ carto project.mml > mapnik.xml
GIS情報の取り込み †
日本地図を取り込む。
- 作業場所の作成
$ mkdir ~/data
- GIS情報のダウンロード
$ cd ~/data $ wget https://download.geofabrik.de/asia/japan-latest.osm.pbf $ chmod o+rx ~
日本以外の地図を取り込む際には、以下のURLから国名を指定してファイルを取得する。|
GIS情報をDBへ書き込む †
本処理は、システムのI/O性能と取り込む地図のサイズ次第で時間単位の処理待ちが発生する。
システムの性能に合わせてパラメータを調整して実行する。
- DBへの書き込み
$ sudo -u _renderd osm2pgsql -d gis --create --slim -G --hstore --tag-transform-script ~/src/openstreetmap-carto/openstreetmap-carto.lua -C 14000 --number-processes 8 -S ~/src/openstreetmap-carto/openstreetmap-carto.style ~/data/japan-latest.osm.pbf
- 書式
sudo -u _renderd osm2pgsql -d gis --create --slim -G --hstore --tag-transform-script ~/src/openstreetmap-carto/openstreetmap-carto.lua -C 【使用するメモリ量(MB)】 --number-processes 【処理するプロセッサ数】 -S ~/src/openstreetmap-carto/openstreetmap-carto.style 【取り込むGIS情報】
処理性能 †
- 参考:クラウドサービスのNFSボリュームをストレージとした際の処理速度
Reading input files done in 2414s (40m 14s). Processed 256616513 nodes in 1005s (16m 45s) - 255k/s Processed 35702697 ways in 1103s (18m 23s) - 32k/s Processed 156150 relations in 306s (5m 6s) - 510/s osm2pgsql took 7948s (2h 12m 28s) overall.
- 参考:仮想化基盤のSSDデータストアをストレージとした際の処理速度
Reading input files done in 1961s (32m 41s). Processed 228171421 nodes in 1077s (17m 57s) - 212k/s Processed 31090659 ways in 634s (10m 34s) - 49k/s Processed 116738 relations in 250s (4m 10s) - 467/s osm2pgsql took 4316s (1h 11m 56s) overall.
indexの生成 †
- Indexを生成
$ cd ~/src/openstreetmap-carto/ $ sudo -u _renderd psql -d gis -f indexes.sql CREATE INDEX
Shapefileの取得 †
- Shapefileのダウンロード
$ cd ~/src/openstreetmap-carto/ $ mkdir data $ sudo chown _renderd data $ sudo -u _renderd scripts/get-external-data.py INFO:root:Starting load of external data into database INFO:root:Checking table simplified_water_polygons INFO:root: Download complete (23839309 bytes) INFO:root: Decompressing file INFO:root: Importing into database INFO:root: Import complete 〜以下略
Fontの導入 †
- Fontのダウンロード
$cd ~/src/openstreetmap-carto/ $ scripts/get-fonts.sh
Web Server導入 †
Web Server設定 †
- 設定
$ sudo nano /etc/renderd.conf
- /etc/renderd.conf
[s2o] URI=/hot/ XML=/home/osm/src/openstreetmap-carto/mapnik.xml HOST=localhost TILESIZE=256 MINZOOM=0 MAXZOOM=11
renderdの設定 †
- 設定
$sudo nano /usr/lib/systemd/system/renderd.service
- /usr/lib/systemd/system/renderd.service
[Unit] Description=Daemon that renders map tiles using mapnik Documentation=man:renderd After=network.target auditd.service [Service] ExecStart=/usr/bin/renderd -f User=_renderd Environment=G_MESSAGES_DEBUG=all ←追記 [Install] WantedBy=multi-user.target
サービス再起動 †
$ sudo systemctl daemon-reload $ sudo systemctl restart renderd $ sudo systemctl restart apache2
コンテンツの配置 †
地図生成を行うテストページを配置する。
- コンテンツの配置
cd /var/www/html sudo wget https://raw.githubusercontent.com/SomeoneElseOSM/mod_tile/switch2osm/extra/sample_leaflet.html sudo mv indev.html ubuntu.html sudo ln -s sample_leaflet.html index.html
- 設定修正
sudo nano sample_leaflet.html
- 修正箇所(デフォルトの地図表示場所)
var map = L.map('map').setView([35.680, 136.853], 5);
- 修正箇所(アクセス先URL)
L.tileLayer('http://【サーバアドレス】/hot/{z}/{x}/{y}.png', {
設定チューニング †
renderd †
- /etc/renderd.conf
[s2o] URI=/hot/ XML=/home/osm/src/openstreetmap-carto/mapnik.xml HOST=localhost TILESIZE=256 MINZOOM=0 MAXZOOM=11
- /etc/apache2/conf-available/renderd.conf
Options Indexes FollowSymLinks MultiViews AllowOverride None Require all granted ModTileTileDir /var/cache/renderd/tiles LoadTileConfigFile /etc/renderd.conf ModTileEnableStats On ModTileBulkMode Off ModTileRequestTimeout 600 ModTileMissingRequestTimeout 60 ModTileMaxLoadOld 50 ModTileMaxLoadMissing 80 ModTileVeryOldThreshold 31536000000000 ModTileRenderdSocketName /run/renderd/renderd.sock ModTileCacheExtendedDuration 2592000 ModTileCacheDurationMax 604800 ModTileCacheDurationDirty 900 ModTileCacheDurationMinimum 10800 ModTileCacheDurationMediumZoom 13 86400 ModTileCacheDurationLowZoom 1 518400 ModTileCacheLastModifiedFactor 0.20 ModTileEnableTileThrottling Off ModTileEnableTileThrottlingXForward 0 ModTileThrottlingTiles 10000 1 ModTileThrottlingRenders 128 0.2
PostgreSQL †
- /etc/postgresql/14/main/postgresql.conf
max_wal_size = 20GB min_wal_size = 80MB
サービス再起動 †
$ sudo systemctl restart postgresql $ sudo systemctl restart renderd $ sudo systemctl restart apache2
動作確認 †
Webブラウザにてサーバのアドレスにアクセスを行う。
http://【サーバアドレス】/
地図が表示され、拡大/縮小によりタイルのレンダリングが行われる。
操作 †
キャッシュのクリア †
レンダリング済みのタイルを手動で削除するには以下の操作を行う。
キャッシュは以下のパスに格納されている。
/var/cache/renderd/tiles/s2o
- 手順(全て消す場合)
cd /var/cache/renderd/tiles/s2o rm -rf *
- 特定の倍率のみ消す(例では10)
cd /var/cache/renderd/tiles/s2o rm -rf ./10
設定 †
ポート番号の変更 †
デフォルト設定ではHTTP(80/tcp)にて動作するが、これをHTTP(tcp/8080)に変更する方法。
Aoache設定 †
Webサーバの待受ポートとしてtcp/8080を追加する。
- /etc/apache2/ports.conf
【追記】Listen 8080
- /etc/apache2/sites-available/000-default.conf
【変更】<VirtualHost *:8080>
Firewall設定 †
Firewallにtcp/8080の受信を許可する。
- 8080ポートの開放
# ufw allow 8080
コンテンツ設定 †
タイルサーバのコンテンツにて、tcp/8080で応答する様に変更する。
vi /var/www/html/sample_leaflet.html
- [変更前]
L.tileLayer('http://[SERVER IP]/hot/{z}/{x}/{y}.png', { attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors', maxZoom: 21, maxNativeZoom: 20 }).addTo(map);
- [変更後]
L.tileLayer('http://[SERVER IP]:8080/hot/{z}/{x}/{y}.png', { attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors', maxZoom: 21, maxNativeZoom: 20 }).addTo(map);
Last-modified: 2024-04-21 (日) 11:21:50 (4d)