プログラマーのメモ書き

伊勢在住のプログラマーが気になることを気ままにメモったブログです

map フォーマットファイルを自分で作成する方法について

Androidアプリ『避難所検索@伊勢』では、オフラインマップを使っています。 このオフラインマップでは、 Mapsforge というライブラリを利用して地図を表示しており、 Mapsforge では OpenStreetMap のデータを map フォーマットというファイル形式で読み込み・表示します。

map フォーマットのファイルは、

Mapsforge Download Server

このサイトからダウンロードできます。明記はされていませんが、定期的に更新しているようです。

ただ、こちらのサイトの map ファイルは国または都市単位で、残念ながら日本は国単位でしかないので、サイズが非常に大きくなっています(japan.map で約 800MB!)。

スマホのストレージはそんなに潤沢じゃないので、これだと、アプリに同梱するにせよ、オンライン時にダウンロードするにせよ、扱いが難しくなってきます。

そこで、『避難所検索@伊勢』では、伊勢市近辺のみのオフライン地図データを作成して、それをアプリに同梱しています。

ここでは、メモがてら、オフラインマップファイルの作成の際にやったことをまとめておきます。

Webサービス

最初にWebサービスで任意の範囲の mapファイルをダウンロードできるものがないか探しました。

すると、BBBike というサイトが OpenStreetMap のファイルのダウンロードサービス(正しくは抽出サービス、というのかな?)を提供してくれています。

extract.bbbike.org

このサービスでは、指定した範囲に含まれる OpenStreetmap のデータを抽出(ダウンロード)することができます。また、ダウンロードできるファイル形式には、.map を始め、 .pbf など多種多様なものがあります(.pbf というのが、標準的な OpenStreetMap データのバイナリ形式フォーマットのようです)。

ということで、このサイトにアクセスして、ファイル形式を指定して、抽出完了通知を受け取るメールアドレスを入力して、ダウンロードしたい範囲を指定します。

しばらくすると、入力したメールアドレス宛に、ダウンロード準備ができたよ、と通知が来るので、メールに記載のリンクをクリックして、データを落とします。 zipファイル形式になっているので、解凍すると、中にお目当ての.mapファイルがあります。

なお、BBBike の抽出サービスについての詳細は下記サイトなどをご参考にしてください。

Help | BBBike extracts

OpenStreetMapの地図情報からタイル画像を生成する - GiBlockラボ

(参考)BBBike について

あと、元々の BBBike というサイトは、サイトのトップページに

Welcome to BBBike, your cycle route planner! We'll help you find a nice, safe and short bicycle route in your city and around. Please choose your city:

とあるように、自転車向けに最適なルートを提供するというサービスのサイトのようです。元々、ベルリンを対象に始まり、それが他の都市にも広がったもようです。 日本だと、東京ぐらいしか入ってないですね。伊勢も入れてくれないかなー。

実は

実はこれで問題ないかと思いきや、このファイルを使って mapsforge で表示させると、なんと、海が真っ白になってしまいます。

f:id:junichim:20170707221930p:plain

最初はよくわからなかったのですが、いろいろ調べてみると mapsforge のやり方として、海岸線のデータを個別に持ったりしているのではなく、レンダリング時に海をうまいこと描画しているようです(ちょっと中途半端な理解なんでこれ以上なんともいえないです)。

なので、海へ対応するためには、それなりの手順を踏む必要があり、そのことが mapsforge のサイトに記載されていました。下記ページにあるような手順が必要とのことです。

mapsforge/MapCreation.md at master · mapsforge/mapsforge · GitHub

また、この際に、map-writer というのを使って書き出すようです。

mapsforge/Getting-Started-Map-Writer.md at master · mapsforge/mapsforge · GitHub

『こんなややこしいのやるの嫌だなー』と思いつつ、もう少し調べると、既に mapsforge のサイトに答えがありました。 mapcreator というツールが用意されており、これを使うと、上記ページに記載されている手順を python スクリプトで自動的に実行してくれるようです。

github.com

ということで、この mapcreator を使ってみたので(わかる範囲で)使い方を書いておきます。

mapcreator

準備

mapcreator のページ(一番下あたり)見ると、いろいろと準備が必要とあります。 詳細な手順は覚えていないのですが、 Windows10 (64bit, Anniversary Update) 上の BoW (Ubuntu 14.04.5 相当)で環境構築した際には、以下のものをインストールしています。

mapcreator

git clone https://github.com/mapsforge/mapsforge-mapcreator.git

Osmosis

wget http://bretth.dev.openstreetmap.org/osmosis-build/osmosis-latest.tgz
mkdir osmosis
mv osmosis-latest.tgz osmosis
cd osmosis
tar xvfz osmosis-latest.tgz
rm osmosis-latest.tgz

map-writer, Osmosisのプラグインとして動作

mkdir ~/.openstreetmap/osmosis/plugins
cd ~/.openstreetmap/osmosis/plugins
wget http://search.maven.org/remotecontent?filepath=org/mapsforge/mapsforge-map-writer/0.8.0/mapsforge-map-writer-0.8.0-jar-with-dependencies.jar

Osmosisのプラグインとして設定するには、特定のディレクトリに配置すればよいようです。詳細は下記リンク先等を参考にしてください。

mapsforge/Getting-Started-Map-Writer.md at master · mapsforge/mapsforge · GitHub

Osmosis/Detailed Usage 0.45 - OpenStreetMap Wiki

GDAL, ダウンロードページのUbuntuを参照, こちらのページに行きついた

sudo apt-get install python-software-properties
sudo add-apt-repository ppa:ubuntugis/ppa

sudo apt-get install python-gdal
sudo apt-get install gdal-bin

Shapely

sudo apt-get install python-pip
sudo apt-get install python-software-properties
sudo apt-get install libgeos-c1v5
sudo pip install Shapely

その他(ヘッダファイルなど)

sudo apt-get install python-dev
sudo apt-get install libgeos-dev

設定ファイル

入力となる .pbf ファイルですが、 mapcreator のサイトには、地球全体の.pbfファイル(planet.osm に対応する.pbf)を使って試しなさい、とありますが、数十GBもあるので、とてもじゃないけど扱いたくありません。 なので、.pbfファイルは抽出したい領域より少し大きめにとったものを BBBike のサイトからダウンロードしておきます。

ちなみに、.pbf ファイルはBBBikeからダウンロードするほかに、 Geofabrik 社のダウンロードサイトからも取得することができます。こちらのデータは定期的に更新されており、国別・地域別に提供されています。日本だと、地方(関東や関西など)別に提供されています。ちなみに関西で、約130MBありましたので、こちらのデータを使う場合はデータサイズにお気を付けください。

次に設定ファイルを編集します。基本的には、mapcreatorのページに説明があるので、それに従います。 あれこれいうより、実際に設定したxmlファイルを示します。

ise_config.xml

<?xml version="1.0" encoding="UTF-8"?>
<mapcreator-config xmlns="http://mapsforge.org/mapcreator" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://mapsforge.org/mapcreator https://raw.githubusercontent.com/mapsforge/mapsforge-mapcreator/master/resources/mapcreator.xsd"
    default-map-start-zoom="14" map-staging-path="maps"
    pbf-staging-path="data" polygons-path="polygons" map-target-path="mymaps" logging-path="logs" initial-source-pbf="ise.pbf"
    poi-staging-path="pois"
    poi-target-path="/productfiles/mapsforge/pois"
    osmosis-path="/home/mor/osmosis/bin/osmosis"
    preferred-language="ja"
    default-preferred-language="en">
    <!-- Asia -->
    <part name="ise" create-pbf="false" create-map="true" type="hd" map-start-lat="34.377" map-start-lon="136.517"/>

</mapcreator-config>

このファイルの意図としては、伊勢市周辺のデータを抽出して、.mapファイル(のみ)を作成するというものです。設定方法によっては.pbfファイルも一緒に作成できるようですが、今回は使っていません。

上記のxmlファイル中にパスを指定するタグ(xml中の~pathのタグ)がいくつかありますが、それぞれの意味は次の通りのようです。

  • osmosis-path, インストールしたOsmosis のbinフォルダ中の osmosis ファイルを指定
  • map-staging-path, 作業途中でmapファイル保存に使うフォルダ
  • pbf-staging-path, .pbf ファイルを保存するフォルダ。またスクリプト動作時に自動的に土地データ(http://openstreetmapdata.com/data/land-polygons)をダウンロードおよび展開する際に使用するフォルダ
  • polygons-path, 設定ファイルの part タグの name 属性に対応するポリゴンデータを格納するフォルダ
  • map-target-path, 最終的に.mapファイルが出力されるフォルダ(map-staging-pathと同じだと実行時に、コピーできないと怒られます)
  • logging-path, ログフォルダ
  • initial-source-pbf, 処理対象となる.pbfファイル名

ここで、 polygons-path に格納するポリゴンデータ(ポリゴンファイル)ですが、このファイルに定義した範囲が抽出の対象となるようです。 今回は下記の様に矩形で定義しました。

ise.poly

polygon
1
   136.517   34.585
   136.928   34.585
   136.928   34.377
   136.517   34.377
   136.517   34.585
END
END

なお、抽出元の.pbfファイルは、地図の北を上側にして矩形の左下と右上を、(経度、緯度)で表すと

(136.517, 34.377) - (136.928, 34.585)

の範囲を対象としたものになっています。

また、設定ファイル(上記の例だと ise_config.xml)の part タグの map-start-lat, map-start-lon はこのポリゴンで指定される領域内を指す必要があるそうです。

なお、ポリゴンファイルは、設定ファイルの part タグの入れ子の階層およびname属性と対応している必要があるので、注意してください。まあ、mapcreatorをcloneした状態で、xml/example-config.xml ファイルをみれば大体想像がつくとおみます。

上記の例の場合は、polygons-pathフォルダの直下に ise.poly ファイルを配置しています。

実行

上記の設定ができれば、さっそく実行してみます。

python mapcreator.py -c xml/ise_config.xml

実行が始まると、土地データ(http://openstreetmapdata.com/data/land-polygons)のダウンロードが始まります。全世界のデータっぽくて、このときで約460MBのサイズがありました。 無事にダウンロードが終わると処理が行われていきます。ちなみに、このファイルのことを調べると、ここでも『ポリゴン』という用語が出てきますが、先ほどのmapcreatorの設定ファイルで出てきている polygons-path のポリゴンとは別のものを指していると思いますので、ご注意ください。

内部の処理は詳細に追いかけていませんが、ログファイルを見て、特にエラーが出力されていず、終了しており、mapファイルが作られていればOKなのかと思います。

出来上がった map ファイルをmapsforgeで表示すると、今回は正しく海が表示されました。

おわりに

範囲を狭くしたmapファイルを作ることがこんなに大変だと思いませんでした。ちょっとやられた感があります。

とはいえ、OpenStreetMap のデータをあれこれ調べ始めると、結構楽しそうだな、とも感じてます。 どっかで仕事に絡めて調べてみたいなー。

避難所検索@伊勢(β版) をリリースしました

はじめに

今年度の頭頃(2017年4月頃)だったかな?伊勢市がオープンデータライブラリを公開しました。

オープンデータが増えてくれると、開発側としてはいろいろとうれしいことが多いので、大いに応援しています(頑張れー!伊勢市さん)。 といっても、誰も使ってる・見てるよ、という反応がないと、市役所の方もきっと残念がるでしょうから、早速オープンデータを使った何かを作ることにしました。

というわけで、作ったものを紹介します。

作ったもの

最初に結論を先に書いときます。

作ったのは、Android用アプリ『避難所検索@伊勢』で、現在地の近くの避難所を検索して表示するアプリです。 災害時でも利用できるように、オフラインでの地図表示を行います。

f:id:junichim:20170707150102p:plain

こんな感じになります。

まだ、β版ですが、気になる方がいれば、 Google Play から試してみてください!

play.google.com

ここまでの経緯

さて、以下ではこれをリリースするまでの経緯について書いておきます。

何をするか?

伊勢市でオープンデータの整備が始まったのを受け、作るものをあれこれ検討しました。まず公開されているオープンデータ(検討したのは2017年4月頃)を見ながら、いろいろと考えてみました。

最初は、伊勢市内の町毎の人口のデータがあったので、人口の移り変わりを一時期はやっていたインフォグラフィック的に見せるのも面白そうだと考えました。 国を挙げて、少子化対策・人口減少と言ってますからね。

伊勢市のオープンデータライブラリのデータには、町名ごとの人口はあるのですが、位置情報がありません。そこで、国土交通省の位置参照情報を見てみました。

位置参照情報ダウンロードサービス

両者を突き合わせると、その町を代表する地点の緯度経度がわかるので、地図上に表示できそうです。

ということで、これでいけそうかなと思い、CartoDB (今は CARTO と呼ぶみたい)を使って、ちょっと取り組んでみました。 最終的に、わかったことは、意外と町ごとの違いが目立たないし、町を地図上の一点で表示させると面白くないし、かといって、町の境界を表す多角形を定義して・・・なんてやり始めたら、仕事の時間が無くなってしまうし、ということでした。

もし、また気が向いたら、アイデア練り直してみよう、ということで、サクッとやめました。

次のネタ

で、次に浮かんだのが、避難所データを利用するアプリです。ほぼ一年前のOSC名古屋2016でも、オープンデータの避難所データを使うアプリの話があったので、悪くない線だと思います(もっとも、自分も参加していたのですが)。 アプリの機能としては、災害時での利用を想定して、インターネットが使えない環境でも、現在位置に最も近い避難所を検索できるアプリ、というものです。

構成

最初は、Google Map + マイマップ機能 で十分代用できるんじゃないかと思ったのですが、調べてみると日本国内だとGoogle Map の地図はオフラインモードで使えないようです。実際、自分のスマホで試した時も使えませんでした。

ということで、OpenStreetMap を利用して地図表示を行うことにしました。

今回作るのは、Android版のみですので、地図表示は、 Mapsforge というライブラリを使います。 また、現在位置から近くの避難所を探す際は、直線距離だとあまり現実味がないので、経路検索をするために、 GraphHopper というライブラリを使います。 まさか、経路検索ライブラリもオープンソースで使えるとは思ってなかったので、ちょっと感激です。

オフライン地図データの更新や避難所データの更新をどうしようかという点も気になったのですが、まずは使ってくれる人がどれだけいるかわからないので、それらの点は後回しにしています。 実際に対応するなら、特定のURLをチェックして、更新版があればダウンロード、という形になるんだろうな、きっと。

ということで、取り急ぎ作成したものが上記のものになります。 あと、このアプリのソースは、GitHub で公開しました。興味がある方はどうぞご覧ください。実装がいけてない点も多々あると思いますが、その点はご勘弁ください。

github.com

ライセンスは Apache License 2.0 です。

あ、あと、技術的なことなどはおいおい(気が向いたら)ブログなり、Webサイトなりに書いてきたいと思います。

今後

オープンデータに限ったことではないのですが、この手の無料版アプリの難しいところは、作って公開するまでは開発者のモチベーションさえあればなんとかなるのですが、その後の維持管理が難しいところです。 実際、オフライン地図データをどうやって定期的に更新させるのか、メンテナンスはどうするか、など色々と気にはなってきています。 (自分を振り返ってみても、過去に作ったもので、その後放置になってるものもあるんですよね、実際)

そういうわけで、当面は(まだモチベーションが続きそうなんで)メンテナンスすると思いますが、先々のことはまたその時に考えたいと思います。

OpenStreetMap で地図を編集してみよう!

はじめに

先日のOSC名古屋2017 にて、 OpenStreetMap のセッションを聞いてきました。 で、このセッション中に、地図が自由に編集できますよ、という話がありました。 自由にというとちょっと語弊がありますね。OpenStreetMap は

OpenStreetMap(OSM)は、道路地図などの地理情報データを誰でも利用できるよう、フリーの地理情報データを作成することを目的としたプロジェクトです。誰でも自由に参加して、誰でも自由に編集でき、誰でも自由に利用する事が出来ます。

OpenStreetMap 日本語サイト より引用

というもので、自分が知っている地域の情報が地図に反映されていない場合は、それを反映することができますよ、といったほうがいいかと思います。

ということで、 OpenStreetMap の地図を編集した話をメモしておきたいと思います。

ちなみに、OpenStreetMap なんて知らねーぜ、という方も多いかと思いますが、実は、Facebookの場所の地図表示はこの OpenStreetMap を使っています(地図のどこか下のほうかな?にクレジットがあります)。なので、知らず知らずのうちに使っていることも多いかもですよ。

アカウントの取得

地図を編集するなら、まずアカウントを取得する必要があります。 OpenStreetMapのページを開いて、『地図を編集』を押します。 アカウントを持っていなければ、『今すぐ登録』で登録します。 登録には、有効なメールアドレスとパスワード、表示名を入力します。

登録すると確認メールが来るので、問題なければメール中のリンクをクリックすればOKです。

チュートリアル

ログインすると、下記の様な画面が表示されます。

f:id:junichim:20170612165642p:plain

初めてなので、チュートリアルをやってみました。 チュートリアルでは、場所(ポイント)の指定方法、ライン(道路など)の指定方法、エリア(建物など)の指定方法、を教えてくれます。 いずれも、直感的な操作なので、すぐにわかる事かと思います。

ま、チュートリアルの詳細は紹介するよりも、実際にやってみてもらうほうがよくわかると思いますので、割愛します。

ただ、残念ながら、ポイントの説明までは日本語なのですが、エリアとラインの説明が英語でした。そんなに難しくないので、ポイントをやってみれば、エリアとラインのチュートリアルもなんなくこなせるかと思います。

地図を編集

さて、実際に地図を編集してみましょう。 OpenStreetMapにログインした状態だと、画面上部の『編集』ボタンをクリックすることでそのまま編集ができます。

f:id:junichim:20170612171150p:plain

編集画面では、上空からの画像(衛星写真?航空写真?)の上に、登録済みの地物(先ほどのポイント、ライン、エリア)が重ねて表示されています。

伊勢近辺の方ならわかりますが、上記の画像でも ダイムスタジアム伊勢(以前は、倉田山公園野球場)や最古の厄除観音で知られる松尾観音寺といった、超メジャーな場所ですらまだ登録されていません。 最初に登録すれば、登録者としての名前が一生(どころかOpeNStreetMapがある限りずっと)残るので、これは登録しない手はありません。

ということで、私が登録してしまいます。 登録すると、こんな感じです。

f:id:junichim:20170612173100p:plain

上空からの写真だと、伊勢市の消防本部・防災センターが建設中のようで、敷地がよくわからかったので、ポイントとして登録しています。 この状態だと、まだ正式に登録されていません。画面上部の『保存』ボタンを押すと、

f:id:junichim:20170612173620p:plain

のように、登録時の情報入力画面が表示されますので、適切なコメントを記入してから、『アップロード』を押します。 問題がなければ、データがアップロードされます。アップロード完了後、わりとすぐに反映されます(審査とかないので)。

f:id:junichim:20170612173959p:plain

これ、編集しだすと、『あ、ここの神社がない。よし、登録してしまえ。』とか『ここの川岸の形が違ってる。よし、なおしてやれ。』とか、簡単に編集できるので、結構くせになりそうです。

最後に

今回地図を編集してみようかな、と思い立ったきっかけは、OSM名古屋2017で聞いたのもあるのですが、たまたま自分の実家近辺を見たときに、近所の目印となるようなものが全くなかったためです。まあ、田舎だから仕方ないのですが、せっかくその場所に関する情報をもっていて、OpenStreetMapというものも知っているので、登録しない手はない、と思い立った次第です。

あと、普段は、OpenStreetMap を使ってばかりですが、一度昔々に地図作成ってどうなんだろうか?と思って、OpenStreetMap系の話を聞いたときは、(その時の話の主旨をよくわかってなかったのもあるかもしれませんが)GPSロガーが必要だったような印象を受けて、これは敷居高いな、と思った印象がありました。

でも、今回試して上空からの写真を元に、気軽に地図を編集できるので、これはやらない手はない、という印象でした。 登録したものが間違っていたらどうしよう、とかは気にせず、間違っていたら誰かが直してくれるはずなので、気にせずいきましょう。

少しでも、興味があれば、ぜひ試してみることをお勧めします。

ちなみに、上記の地図編集は、iDというエディタをブラウザ上で使った場合の地図編集となるようです。OpenStreetMapの地図編集は、これも上記の方法一通りというのではなく、JOSMという上級者向け(?)のツールなどもあるようです(こっちはまだ試せてません)。

地図編集するほどではない方に

あと、今回初めて知ったのですが、 OpenStreetMap の画面から、修正要望のようなメモを残す機能があります。

f:id:junichim:20170612174843p:plain

画面右端の列の吹き出しようなアイコンをクリックすると、

f:id:junichim:20170612232851p:plain

のようなメモ編集蘭が表示されます。

これは、自分で修正するほどではないけど、『こうしてほしい』、とか、『ここ間違ってるよ』いったような要望を伝えることができる機能のようです。 便利なのが、アカウントがなくてもメモを残すことができます。もちろん、アカウントでのログインがあれば、その人に紐づいたメモになります。

気になることがあるけど、地図を編集するほどではない、とか、アカウント作るのなんかいやだ、という場合、こういう機能を利用するのもありかと思います。