OpenStreetMapサーバを自作する(Install OpenStreetMap on AWS EC2/Ubuntu14.04)

2015.05.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

下記エントリにて、TMS(Tableau Map Service)という仕組みを使い、Tableauから背景地図の設定を追加する為の手順をご紹介しました。

このエントリの最後で『アクセス負荷を掛け過ぎるとアク禁喰らうかもしれないので気を付けてね』的な文章を記載しましたが、TMSの対象リソースとなっている『OpenStreetMap』では代替策についても用意がなされていました。その手段の1つが『自前のOpenStreetMapサーバを用意する』です。(※下記リンクにその辺りの記載があります)

当エントリは、一般公開されているOpenStreetMapのサーバをTMSの接続先にするのでは無く、自前のOpenStreetMapサーバを構築し、そのサーバをTMSの接続先にする、という手順を解説する内容となります。

目次

OpenStreetMapとは

OpenStreetMapについては以下の情報をご参照ください。ざっくり言うと『GoogleMapみたいな地図をオープンライセンスの下、自由に利用出来るサービス』です。

osm-install_01

OpenStreetMapを利用する上での注意点

同じタイミングで投稿した以下エントリでは、このOpenStreetMapを利用したTMSファイルを使い、背景地図の選択に新たなバリエーションを提供するための解説を行いました。ただ、OpenStreetMapを始めとするMapサービスは、無償で利用出来るものの、場合によっては高負荷をサーバに強いてしまう場合があり、その場合は提供元のサーバからアクセス禁止の制裁を受けてしまう可能性があります。

OpenStreetMapを自前で用意する方法についての調査

上記Wikiの『Tile Usage Policy』の欄に『Alternative OpenStreetMap Tile Providers』(代替のOpenStreetMap Tileプロバイダー)と称して以下の様な記載を発見。一番上の『switch2osm.org』というサイトで、Ubuntuベースの導入方法が紹介されているのでこれは使えそうだ!と調査を進める事にしました。

その他、世界各国でOpenStreetMapを自前で導入している資料を漁ってみた所、以下の様な情報が見つかりました。日本語での情報が幾つか見つかったのは嬉しいところです。

上記リストの中でも特に一番下、nyampireさんのまとめたQiitaエントリの内容が素晴らし過ぎるクオリティでした。今回基本的にはこちらの内容をUbuntu14.04でほぼそのまま実行した(出来た)形になります。nyampireさん、ありがとうございます!

OpenStreetMapのインストール(AWS EC2/Ubuntu14.04)

直近、管理コンソールのEC2メニューから選択可能なUbuntuの最新バージョンのものを今回利用する事にしました。また、途中投入する事になるデータの範囲は日本国内のみとしました。その他スペック等はざっくり適当な感じで選んでいます。実際この辺は稼働状況を鑑みて設定を変えて行く事にはなると思います。

  • AMI:Ubuntu Server 14.04 LTS (HVM), SSD Volume Type
  • インスタンスタイプ:m3.xlarge
  • ストレージ容量:200GiB
  • セキュリティグループ:80(HTTP), 22(SSH)を必要なアクセス制御範囲で

osm-install_02

EC2インスタンス起動を確認後、サーバにログインします。Ubuntuサーバへのデフォルトユーザのログインはec2-userでは無く、ubuntuとなる事に注意。

$ chmod 400 OpenStreetMap_key.pem
$ ssh -i OpenStreetMap_key.pem ubuntu@xx.xxx.xxx.xxx
Welcome to Ubuntu 14.04.2 LTS (GNU/Linux 3.13.0-48-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

  System information as of Sat May 30 19:32:35 UTC 2015

  System load:  0.0                Processes:           119
  Usage of /:   0.4% of 196.73GB   Users logged in:     0
  Memory usage: 0%                 IP address for eth0: 10.x.x.xxx
  Swap usage:   0%

  Graph this data and manage this system at:
    https://landscape.canonical.com/

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

0 packages can be updated.
0 updates are security updates.


Last login: Sat May 30 19:32:38 2015 from xxxxxxxxxxxxxxxxx
$

apt-getコマンドでパッケージ導入を行う際の情報をリポジトリに追加。こちらはQiitaで紹介されている様に、以下サイトから追加する内容を生成し、対象ファイルに追記します。

$ sudo vi /etc/apt/sources.list
----------
# (ファイル末尾に以下の2行を追記)
deb http://ppa.launchpad.net/kakrueger/openstreetmap/ubuntu trusty main 
deb-src http://ppa.launchpad.net/kakrueger/openstreetmap/ubuntu trusty main

追記が完了したら以下コマンドを順次実行して行きます。

$ sudo apt-get install python-software-properties
$ sudo add-apt-repository ppa:kakrueger/openstreetmap
Press [ENTER] to continue or ctrl-c to cancel adding it   ## 【Enter押下で先に進める】
$ sudo apt-get update
$ sudo apt-get install libapache2-mod-tile

途中、以下の様にダイアログが表示され、決定・入力処理を促されます。基本的にここはデフォルト指定のまま進めます。YES or NOは全てYES。

osm-install_03 osm-install_04 osm-install_05

データベース名はデフォルトのgis

osm-install_06

DBアクセスユーザー名もデフォルトのwww-dataで。

osm-install_07

このくだりは最後に以下の様なメッセージが出ていればOKです。

 :
 * Restarting web server apache2
[Sat May 30 19:39:30.437421 2015] [tile:notice] [pid 6116:tid 139659681163136] Loading tile config default at /osm/ for zooms 0 - 20 from tile directory /var/lib/mod_tile with extension .png and mime type image/png
                                                    [ OK ]
Processing triggers for libc-bin (2.19-0ubuntu6.6) ...
$

OSMデータのインポート

上記処理までで、環境自体は整いました。次に、環境に投入するデータを用意します。

OpenStreetMapは全世界の地図を対象としていますので、投入データも最大規模のものは当然全世界が対象となります。以下公式サイトで公開されている『Latest Weekly Planet File』の容量は何と38GB。ファイル名もPlanet(惑星)と来たもんだ。ただ、全世界を対象にすると半端無く時間が掛かるので今回は日本国内のデータのみに留めておこうと思います。

データダウンロードの際は上記サイトは負荷の都合上避けるように、とあるので先のQiitaのエントリ同様、下記サイトからデータをダウンロードする事に。

ダウンロード実行。とは言え日本国内だけでも900MB超。結構ボリュームありますね。

$ wget http://download.geofabrik.de/asia/japan-latest.osm.pbf
$ ls -lta *.pbf
-rw-rw-r-- 1 ubuntu ubuntu 959104312 May 30 00:51 japan-latest.osm.pbf

いよいよデータのインポート。...と思ったらエラーが出ます。

$ osm2pgsql --slim -C 1500 japan-latest.osm.pbf
osm2pgsql SVN version 0.85.0 (64bit id space)

Error: Connection to database failed: FATAL:  role "ubuntu" does not exist

『エラーが出るようならこのコマンドを実行すべし』と手順にもあるので、指定の内容でコマンドを実行します。後半エラーが出てますがここでは気にしなくてOK。

$ sudo /usr/bin/install-postgis-osm-user.sh gis ubuntu
Granting rights to user 'ubuntu'
GRANT
GRANT
GRANT
ERROR:  relation "planet_osm_line" does not exist
ERROR:  relation "planet_osm_nodes" does not exist
ERROR:  relation "planet_osm_point" does not exist
ERROR:  relation "planet_osm_rels" does not exist
ERROR:  relation "planet_osm_roads" does not exist
ERROR:  relation "planet_osm_ways" does not exist
ERROR:  relation "planet_osm_polygon" does not exist
$

再度コマンド実行。今回の環境ではおよそ50分程掛かりました。コマンド実行後は休憩してるか別のタスクに取り掛かるなどして時間を有効活用しといてください。Osm2pgsql took XXXXs overallの様なコマンドが出たら投入完了です。

$ time osm2pgsql --slim -C 1500 japan-latest.osm.pbf
:
:
Sorting data and creating indexes for planet_osm_roads
Stopping table: planet_osm_rels
Building index on table: planet_osm_rels (fastupdate=off)
Stopping table: planet_osm_ways
Building index on table: planet_osm_ways (fastupdate=off)
Stopping table: planet_osm_nodes
Stopped table: planet_osm_nodes in 0s
Analyzing planet_osm_polygon finished
Analyzing planet_osm_point finished
Analyzing planet_osm_roads finished
Analyzing planet_osm_line finished
Stopped table: planet_osm_rels in 5s
Copying planet_osm_point to cluster by geometry finished
Creating geometry index on  planet_osm_point
Creating osm_id index on  planet_osm_point
Creating indexes on  planet_osm_point finished
All indexes on  planet_osm_point created  in 85s
Completed planet_osm_point
Copying planet_osm_roads to cluster by geometry finished
Creating geometry index on  planet_osm_roads
Creating osm_id index on  planet_osm_roads
Creating indexes on  planet_osm_roads finished
All indexes on  planet_osm_roads created  in 140s
Completed planet_osm_roads
Copying planet_osm_polygon to cluster by geometry finished
Creating geometry index on  planet_osm_polygon
Copying planet_osm_line to cluster by geometry finished
Creating geometry index on  planet_osm_line
Creating osm_id index on  planet_osm_polygon
Creating indexes on  planet_osm_polygon finished
All indexes on  planet_osm_polygon created  in 432s
Completed planet_osm_polygon
Creating osm_id index on  planet_osm_line
Creating indexes on  planet_osm_line finished
All indexes on  planet_osm_line created  in 711s
Completed planet_osm_line
Stopped table: planet_osm_ways in 847s

Osm2pgsql took 3117s overall

real	51m56.263s
user	24m36.932s
sys	0m55.809s
$

構築手順で作成したユーザー: www-data用にも以下のコマンドを実行しておきます。

$ sudo /usr/bin/install-postgis-osm-user.sh gis www-data
Granting rights to user 'www-data'
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
$

renderdを再起動し、

$ sudo /etc/init.d/renderd restart
 * Restarting Mapnik rendering daemon renderd                                                                                                                                                 [ OK ] 
$

対象となるHTMLファイルを一部編集。QiitaではHTMLのホスト名を変更していましたが、今回のケースではそこは編集する必要が無く(相対パスになっていました)、以下の初期表示位置指定を書き換えました。

$ sudo vi /var/www/osm/slippymap.html
-------
// Start position for the map (hardcoded here for simplicity)
// 東京の辺りを指定
        var lat=35.685;
        var lon=139.745;
        var zoom=11;

また併せて、以下設定行の部分、インストールで用いたEC2サーバのIPアドレス(やホスト名)を追記した形に変更しておきます。

// This is the layer that uses the locally stored tiles
//var newLayer = new OpenLayers.Layer.OSM("Local Tiles", "${z}/${x}/${y}.png", {numZoomLevels: 19});
var newLayer = new OpenLayers.Layer.OSM("Local Tiles", "http://xxx.xxx.xxx.xxx/osm/${z}/${x}/${y}.png", {numZoomLevels: 19});
            map.addLayer(newLayer);

OpenStreetMapサーバのブラウザ接続確認

http://接続先サーバー/osm/slippymap.htmlにアクセス。すると、以下の様にEC2上でOpenStreetMapを稼働させる事が出来ました。デベロッパーツールでアクセスしているURLを確認してみると、参照先のサーバが所定のEC2サーバを向いている事が確認出来ました。(※モザイク掛けちゃってますが)

osm-install_09

ここで確認した情報を元に、下記エントリで作成したTMSファイルを元に、EC2にインストールしたOpenStreetMapを参照させるTMSファイルを作成します。

OpenStreetMap(on AWS EC2).tms

<?xml version="1.0" encoding="utf-8"?>
<mapsource inline="true" version="8.1">
<connection
  class="OpenStreetMap"
  port="80"
  server="http://xxx.xxx.xxx.xxx/"
  url-format="/osm/{Z}/{X}/{Y}.png" />
<layers>
<layer display-name='Base' name='base' show-ui='false' type='features' request-string='/' />
</layers>
</mapsource>

上記作成ファイルを所定の場所に配置後、Tableau Desktopを再起動。新しく追加したTMSファイルをバックグラウンドマップとして指定すると、ちゃんと読み込んでくれました!

osm-install_10

まとめ

以上、OpenStreetMap自作に関する手順のご紹介でした。これで一応、自作したサーバーにアクセスが行くようになったのですが、実際アクセスしてみるとサーバのレスポンスであったり、Tile情報(OpenStreetMapの地図情報を表示する画像情報)の有無によって上手く地図が表示されない状況でした。これを解決する手段として『あらかじめTile情報をダウンロードして用意しておく』というものがあるようなので、別途エントリとしてその辺りについて進めてみようと思います。こちらからは以上です。