Locus MapはAndroid端末で動作するGPS地図アプリケーション。無料版のLocus Mapと有料版のLocus Map Pro(04/05/2022にLocus Map 3 Classicに名前が変更されて販売中)があった。
03/15/2021にLocus Mapの後継アプリのLocus Map 4がリリースされ,無料版と有料版のSilver(€10/年)とGold(€24/年)のサブスクリプション契約版になった。Locus Map無料版もLocus Map 4無料版に変更された。
旧Locus Map/旧Locus Map Pro(現Locus Map 3 Classic)は,
のような機能・特徴があり,使いやすく高機能な地図アプリ。
私はLocus Map Proを購入して使用している。
Locus Mapでオフラインで使用できる日本地図には,Locus Mapを使ってLucusストアからダウンロード購入出来るLoMapsと呼ばれているベクター地図がある。
Locus Map Free(無料版)でもこのLoMapsからファイル3個までは無料でダウンロードして使用することが出来るが,日本全体をカバーするにはファイル4個(北海道・本州・四国・九州)をダウンロードする必要がある。
実は初期のLoMapsのベクター日本地図はところどころデータが破損していて,正常に地図が表示されない問題があった。
このことを指摘した後,2015/12月以降のダウンロード出来る地図は問題が修正されていて,その後は問題はなく使用出来ている。
また,このLoMapsは概ね3-4ヶ月毎に地図が更新されるのだが,この更新時は再度お金を払って(日本全部で200円程度)ダウンロードする必要がある。(上記の正常に表示されない地図からのバージョンアップでもお金を払ったことがあったが,不具合があったベクター地図を更新するのにも有料なのは納得出来なかったなぁ。)
LoMapsをダウンロードすると,オフラインで使えるPOI DBや住所検索DBが合わせてダウンロード出来るので有用ではある。(抱き合わせ販売・・・)
オフラインPOI DBのフォーマット仕様は公開してもらいたいなぁ。
LoMapsはOpenStreetMapの地図データをMapsforge Map Writerで変換したデータと,SRTMデータから作成した等高線データを組み合わせたMapsforge形式のベクター地図に,独自のPOI/住所DBファイルで構成されている。
有料のLoMaps以外でLocus Mapで無料で使用できるMapsforge形式のベクター日本地図がどこかにないのか探してみると,以下からダウンロードして使用することができた。(LoMaps以前にはフリーな日本の地図がLocus Mapのサイトからでもダウンロード出来た。)
通常は,OpenAndroMapsのベクター地図を利用すれば問題無いと思う。更新頻度が上記のMapsforge Download Serverよりも遅いのが残念。更新頻度がもう少し上がってくれればいいんだけどな!
ところどころ(ローマ字)表記されるところがある。ただ,これはOpenStreetMapの登録がローマ字入りになっているからなんだけど。
上記のサイトから提供されているOpenStreetMapのデータを変換したベクター地図をダウンロードして利用は出来るが,地図が必ずしも最新ではないことがある。OpenStreetMapは自分で自由に地図を編集出来るのが楽しい。自分で編集したら,すぐそのデータを使いたくなっちゃいます。
そこで自前でOpenStreetMapの地図データからLocus Mapで使用できるMapsforge形式のベクター地図(.mapファイル)を作成することにした。
まず,こちらのページに書いてあるようにして,最新のOpenstreetMapの日本の地図データjapan-latest.osm.pbfを用意する。
この日本の地図データをLocus Mapが表示できるMapsforge形式のベクター地図(mapsforgeライブラリで出力した地図)に変換する。
Mapsforge形式のベクター地図にはmapsforgeライブラリでoption指定の仕方でV3,V4,V5のバージョンのどれかが作成される。
--preferred-languages=ja,en
--tag-values=true
このページで作成しているMapsforge形式のベクター地図は,V3で作成するようにしている。
日本全体の地図データは大きなファイルになってしまって,ツールを使っての変換処理も大変時間がかかってしまうのと,PCに多くのメモリーを搭載していないと*1処理が途中でメモリ不足で停止してしまう。なので幾つかの小さい地域に分けたほうが良いみたいだ。
Locusストアで提供されているLoMaps日本地図も,北海道・本州・四国・九州の4個に分けられている。(本州は大きい領域だけど・・・) OsmAnd/OsmAnd+では,北海道・東北・関東・中部・近畿・中国・四国・九州の8個に分けられている。
そこで,Locus MapやOsmAnd/OsmAnd+と同じように北海道・本州(東北・関東・中部・近畿・中国)・四国・九州の4個(8個)に分けて作成してみた。
まず日本全体の地図データ(japan-latest.osm.pbf)を北海道・本州・四国・九州,といったの4個の.pbfファイルに,もしくは北海道・東北・関東・中部・近畿・中国・四国・九州の8個の.pbfファイルに分割する。(北海道・四国・九州は共通)
日本全体の地図を4個(or 8個)に分割するため,領域を定義したpolyファイルを作成した。( Hokkaido.poly Tohoku.poly Kanto.poly Chubu.poly Kinki.poly Chugoku.poly Shikoku.poly Kyushu.polyHonshu.poly)
このpolyファイルは,地図のエリアを緯度・経度の情報で指定する目的で使用出来る。
日本全体の地図データの.pbfファイルはバイナリデータに圧縮したファイルなんで,osmctoolsのosmconvertを使って,各地域の地図データ.pbfファイルに分割できる。
日本全体の地図データを単純に4個に分割する場合は以下のようにする。
> cd jpmap > osmconvert --complex-ways japan-latest.osm.pbf -B=..\poly\Hokkaido.poly -o=hokkaido.osm.pbf > osmconvert --complex-ways japan-latest.osm.pbf -B=..\poly\Honshu.poly -o=honshu.osm.pbf > osmconvert --complex-ways japan-latest.osm.pbf -B=..\poly\Shikoku.poly -o=shikoku.osm.pbf > osmconvert --complex-ways japan-latest.osm.pbf -B=..\poly\Kyushu.poly -o=kyushu.osm.pbf
日本全体の地図データを単純に8個に分割する場合は以下のようにする。
> cd jpmap > osmconvert --complex-ways japan-latest.osm.pbf -B=..\poly\Hokkaido.poly -o=hokkaido.osm.pbf > osmconvert --complex-ways japan-latest.osm.pbf -B=..\poly\Tohoku.poly -o=tohoku.osm.pbf > osmconvert --complex-ways japan-latest.osm.pbf -B=..\poly\Kanto.poly -o=kanto.osm.pbf > osmconvert --complex-ways japan-latest.osm.pbf -B=..\poly\Chubu.poly -o=chubu.osm.pbf > osmconvert --complex-ways japan-latest.osm.pbf -B=..\poly\Kinki.poly -o=kinki.osm.pbf > osmconvert --complex-ways japan-latest.osm.pbf -B=..\poly\Chugoku.poly -o=chugoku.osm.pbf > osmconvert --complex-ways japan-latest.osm.pbf -B=..\poly\Shikoku.poly -o=shikoku.osm.pbf > osmconvert --complex-ways japan-latest.osm.pbf -B=..\poly\Kyushu.poly -o=kyushu.osm.pbf
分割するのにオブジェクト・タグが境界にまたがっている場合,そのまま分割するとオブジェクト・タグが落ちてしまう場合があるので,--complex-waysをつけている。(4個に分割する場合は,またがらないとは思うが・・・)
上記はOpenStreetMapの日本全体の地図データをそのまま分割する場合なのだが,地図データから不要なタグ情報をあらかじめ削除して少しでも地図のサイズを小さくするために,日本の地図データを少し編集することにした。
地図データを編集しない場合は,Locus Mapだと不要なタグはThemeファイルを使って表示しなくすることも出来る。
日本全体の地図データの.pbfファイルはバイナリデータに圧縮したファイルなんで, osmctools
のosmconvertを使ってosmfilterで編集出来るように.o5mファイルに変換する。
まず,日本全体のpbf地図データをo5mフォーマットに変換する。
> osmconvert japan-latest.osm.pbf -o=japan-latest.o5m
その後,4個に分割する。
> osmconvert --complex-ways japan-latest.o5m -B=..\poly\Hokkaido.poly -o=hokkaido.o5m > osmconvert --complex-ways japan-latest.o5m -B=..\poly\Honshu.poly -o=honshu.o5m > osmconvert --complex-ways japan-latest.o5m -B=..\poly\Shikoku.poly -o=shikoku.o5m > osmconvert --complex-ways japan-latest.osm -B=..\poly\Kyushu.poly -o=kyushu.o5m
8個に分割するばあいは,
> osmconvert --complex-ways japan-latest.o5m -B=..\poly\Hokkaido.poly -o=hokkaido.o5m > osmconvert --complex-ways japan-latest.o5m -B=..\poly\Tohoku.poly -o=tohoku.o5m > osmconvert --complex-ways japan-latest.o5m -B=..\poly\Kanto.poly -o=kanto.o5m > osmconvert --complex-ways japan-latest.o5m -B=..\poly\Chubu.poly -o=chubu.o5m > osmconvert --complex-ways japan-latest.o5m -B=..\poly\Kinki.poly -o=kinki.o5m > osmconvert --complex-ways japan-latest.o5m -B=..\poly\Chugoku.poly -o=chugoku.o5m > osmconvert --complex-ways japan-latest.o5m -B=..\poly\Shikoku.poly -o=shikoku.o5m > osmconvert --complex-ways japan-latest.osm -B=..\poly\Kyushu.poly -o=kyushu.o5m > osmconvert --complex-ways japan-latest.o5m -B=..\poly\Honshu.poly -o=honshu.o5m
とする。
上記と同様に--complex-waysをつけている。
そして,いらないタグ(他の言語,電線とか)をosmfilterを使って削除する。del.txtにいらないタグを入れておく。 4個に分割している場合は,
> osmfilter hokkaido.o5m --parameter-file=del.txt > hokkaido_temp.o5m > osmfilter honshu.o5m --parameter-file=del.txt > honshu_temp.o5m > osmfilter shikoku.o5m --parameter-file=del.txt > shikoku_temp.o5m > osmfilter kyushu.o5m --parameter-file=del.txt > kyushu_temp.o5m
として,8個に分割している場合は,
> osmfilter tohoku.o5m --parameter-file=del.txt > tohoku_temp.o5m > osmfilter kanto.o5m --parameter-file=del.txt > kanto_temp.o5m > osmfilter chubu.o5m --parameter-file=del.txt > chubu_temp.o5m > osmfilter kinki.o5m --parameter-file=del.txt > kinki_temp.o5m > osmfilter chugoku.o5m --parameter-file=del.txt > chugoku_temp.o5m > osmfilter shikoku.o5m --parameter-file=del.txt > shikoku_temp.o5m > osmfilter kyushu.o5m --parameter-file=del.txt > kyushu_temp.o5m
とした。
ところどころ,名前に「ほげほげ(英語)」のように登録されているデータがあるので,ついでに(英語)の部分を削除する。*2
これは,地図データを.osmファイルに変換してからperlを使って削除した。
4個の場合は,
> osmconvert hokkaido_temp.o5m -o=hokkaido_temp.osm > osmconvert honshu_temp.o5m -o=honshu_temp.osm > osmconvert shikoku_temp.o5m -o=shikoku_temp.osm > osmconvert kyushu_temp.o5m -o=kyushu_temp.osm > perl -p -e 's/\(.+?\)//g;' hokkaido_temp.osm > hokkaido.osm > perl -p -e 's/\(.+?\)//g;' honshu_temp.osm > honshu.osm > perl -p -e 's/\(.+?\)//g;' shikoku_temp.osm > shikoku.osm > perl -p -e 's/\(.+?\)//g;' kyushu_temp.osm > kyushu.osm
として,8個の場合は,
> osmconvert hokkaido_temp.o5m -o=hokkaido_temp.osm > osmconvert tohoku_temp.o5m -o=tohoku_temp.osm > osmconvert kanto_temp.o5m -o=kanto_temp.osm > osmconvert chubu_temp.o5m -o=chubu_temp.osm > osmconvert kinki_temp.o5m -o=kinki_temp.osm > osmconvert chugoku_temp.o5m -o=chugoku_temp.osm > osmconvert shikoku_temp.o5m -o=shikoku_temp.osm > osmconvert kyushu_temp.o5m -o=kyushu_temp.osm > perl -p -e 's/\(.+?\)//g;' hokkaido_temp.osm > hokkaido.osm > perl -p -e 's/\(.+?\)//g;' tohoku_temp.osm > tohoku.osm > perl -p -e 's/\(.+?\)//g;' kanto_temp.osm > kanto.osm > perl -p -e 's/\(.+?\)//g;' chubu_temp.osm > chubu.osm > perl -p -e 's/\(.+?\)//g;' kinki_temp.osm > kinki.osm > perl -p -e 's/\(.+?\)//g;' chugoku_temp.osm > chugoku.osm > perl -p -e 's/\(.+?\)//g;' shikoku_temp.osm > shikoku.osm > perl -p -e 's/\(.+?\)//g;' kyushu_temp.osm > kyushu.osm
とした。
こんなようにして,(英語)を削除した。ちょっと地図データのサイズが小さくなった。
これで,ベクター日本地図のhakkaido.osm(北海道),honshu.osm(本州),shikoku.osm(四国),kyushu.osm(九州)または,hakkaido.osm(北海道),tohoku.osm(東北),kanto.osm(関東),chubu.osm(中部),kinki.osm(近畿),chugoku.osm(中国),shikoku.osm(四国),kyushu.osm(九州)が出来た。
.osmファイルはテキストファイル(xml)で,日本全体だと24Gbyte以上になっちゃう。
この後,.osmを.pbf(圧縮ファイル)に変換しておく。
4個の場合は,
> osmconvert hokkaido.osm -o=hokkaido.osm.pbf > osmconvert honshu.osm -o=honshu.osm.pbf > osmconvert shikoku.osm -o=shikoku.osm.pbf > osmconvert kyushu.osm -o=kyushu.osm.pbf > del *.osm
8個の場合は,
> osmconvert tohoku.osm -o=tohoku.osm.pbf > osmconvert kanto.osm -o=kanto.osm.pbf > osmconvert chubu.osm -o=chubu.osm.pbf > osmconvert kinki.osm -o=kinki.osm.pbf > osmconvert chugoku.osm -o=chugoku.osm.pbf > osmconvert shikoku.osm -o=shikoku.osm.pbf > osmconvert kyushu.osm -o=kyushu.osm.pbf > del *.osm
で変換する。
日本のOpenStreatMapから各地域の地図データに分割は出来たんだけど,この地図には等高線が入っていない。
ハイキングやちょっとした山登りをするときには等高線が見れないと不便。そこで,等高線地図を作ることにした。
日本の等高線データを得られるサイト。
NASA SRTMのデータをダウンロードして,さらにOpenStreetMapのフォーマットに変換してくれる以下のようなツールがあるみたいなんで,それを使用して等高線地図を作ってみた。
まず見つけたツールがsrtm2osm version 1.12(最新バージョン1.16.5)。
OpenStreetMapのwikiに使い方が書かれていた。.netアプリなんでWindows専用。(monoを使ってLinuxでも動かせるようだが・・・)
srtm2osmのオプションの-bounds1に日本の左下の緯度・経度と右上の緯度・経度を指定すれば,SRTMデータがあるサーバーからデータをダウンロードして,等高線データを作成して,それを.osmファイルとして作成してくれる。
日本全体の等高線データを作りたいので緯度・軽度を1°毎の矩形(299個)で指定したら,129個のファイル(データがある分)の.osmファイルが出来た。これらを1つの.osmにマージしないといけないのだが,マージがうまく出来なかった。
しょうがないので以下のようにして1つの.osmファイルを作成した。しかしこのやり方だと日本以外の韓国なども対象になるのもあって等高線を作成するのにすごく時間がかかるのと,海底の等高線も作成されちゃう
> cd srtm > srtm2osm -bounds1 24 122 46 146 -step 10 -cat 100 50 -large -firstnodeid 20000000000 -firstwayid 10000000000 -incrementid -o japan_srtm.osm
次に見つけたのがphyghtmap version 1.42(python2.7が必要)で,このツールを使ってみた*4。最新版はPython3.xで動作するversion 2.23。
Pythonで動くのでWindowsでもLinuxでも使える。
phyghtmapを使用するとSRTMのデータをダウンロードして,その後.osmファイルに変換してくれる。既にSRTMのデータがダウンロード済みの場合は,.osmファイルへの変換のみを行ってくれる。
日本の領域指定にはpolyファイルで指定できるので,japan.polyを使った。
このツールでもやはり129個のデータをダウンロード(hgtディレクトリにhgtまたはtiffファイル)するのはsrtm2osmと同様だが,.osmに変換する時にオプションに--max-nodes-per-tile=0を使うと,1個の.osmにマージして出力してくれた
詳細データのSRTM1 Version 3(1秒/30m)をダウンロードするには,--srtm=1 --srtm-version=3のオプションを指定する。デフォルトは--srtm=3 --srtm-version=3(3秒/90m)。
> cd srtm > phyghtmap --polygon=..\poly\japan.poly --output-prefix=japan_srtm --srtm=3 --step=20 --line-cat=500,100 --start-node-id=20000000000 --start-way-id=10000000000 --write-timestamp --max-nodes-per-tile=0 --no-zero-contour --earthexplorer-user=USER_ID --earthexplorer-password=PASSWORD > move japan_srtm_lon122.56_153.89lat21.21_45.80_srtm3.osm japan_srtm.osm > osmconvert japan_srtm.osm -o=japan_srtm.pbf > del japan_srtm.osm
USER_IDとPASSWORDはphyghtmapの最初の起動時のみ必要。
--step=20で20mの等高線に,--line-cat=500,100で500m/100m毎に少し太線にするようにした。
--step=10 --line-cat=100,50とすれば10mの等高線にも出来る。ファイルサイズは倍になる。
--write-timestampオプションを指定しないと,後でosmosisでマージしてLocus map用のベクター地図.mapファイルを作成する時にtimestampが無いってエラーを出してうまくいかない。
また,--no-zero-contourで0mの等高線を作成しないようにしている。
これで,なんとかハイキング用に使える20m(または10m)での日本の等高線地図japan_srtm.osm(japan_srtm10.osm)を作成できた。
ただ出来上がった等高線地図には,おかしな等高線がたくさん出来ている。ダウンロードしたSRTMの.hgtファイルを確認したら,ところどころデータがおかしいのが原因。
srtm2osmでダウンロードした.hgtファイルのデータは大丈夫みたい。どうもhttp://dds.cr.usgs.gov/srtm/version2_1/SRTM3/Eurasia/にあるSRTMデータはいくつかファイルが壊れていて,http://e4ftl01.cr.usgs.gov/MEASURES/SRTMGL3.003/2000.02.11/ のファイルだと問題ない。なのでsrtm2osmでダウンロードした.hgtファイルに入れ替えて,再度phyghtmapを使って.osmファイルを作成した。
これでやっと,日本の等高線データjapan_srtm.pbf(20m等高線),japan_srtm10.pbf(10m等高線)が作成できた。(version2.10以降のphyghtmapだと正常な標高データがダウンロード出来る。)
日本の等高線データjapan_srtm.pbfから地図データと同様に4個(8個)に分割するのも,osmconvertを使った。phyghtmapで直接作成することも出来るが,こっちのやり方のほうが早かった。
4個の場合は,
> osmconvert japan_srtm.pbf -B=..\poly\Hokkaido.poly -o=hokkaido_srtm.pbf > osmconvert japan_srtm.pbf -B=..\poly\Honshu.poly -o=honshu_srtm.pbf > osmconvert japan_srtm.pbf -B=..\poly\Shikoku.poly -o=shikoku_srtm.pbf > osmconvert japan_srtm.pbf -B=..\poly\Kyushu.poly -o=kyushu_srtm.pbf
8個の場合は,
> osmconvert japan_srtm.pbf -B=..\poly\Hokkaido.poly -o=hokkaido_srtm.pbf > osmconvert japan_srtm.pbf -B=..\poly\Tohoku.poly -o=tohoku_srtm.pbf > osmconvert japan_srtm.pbf -B=..\poly\Kanto.poly -o=kanto_srtm.pbf > osmconvert japan_srtm.pbf -B=..\poly\Chubu.poly -o=chubu_srtm.pbf > osmconvert japan_srtm.pbf -B=..\poly\Kinki.poly -o=kinki_srtm.pbf > osmconvert japan_srtm.pbf -B=..\poly\Chugoku.poly -o=chugoku_srtm.pbf > osmconvert japan_srtm.pbf -B=..\poly\Shikoku.poly -o=shikoku_srtm.pbf > osmconvert japan_srtm.pbf -B=..\poly\Kyushu.poly -o=kyushu_srtm.pbf
として,作成した。
一度作成しておけば,後は地図と等高線をマージすれば等高線入り日本地図データが作れることになる。
ちなみに,ダウンロードした.hgtファイルをLocus/data/srtmフォルダーに入れておいて,Locus mapで地形を表示する設定にすると,起伏なんかが明暗表示されて見やすくなる。
OpenStreetMapの地図データは陸地と海岸の境界線(natural=coastlineタグ)がサポートされなくなってきている。
このためMapsforge形式のベクター地図を作成する時に何もこの対策をしないと,海の部分が青く表示出来ないベクター地図になってしまう。
Locus Mapで使われているMapsforgeの表示ライブラリでは,Theme(テーマ)で陸地と海の部分をタグ(陸地はnosea,海はsea)指定しておくと,海のタグ部分を青く表示するように設定できる。
なので海を青く表示するには,なんとかして陸地と海岸の境界を特定し,海側はkey='natural' value='sea'タグを,陸側はkey='natural' value='nosea'タグを地図データに追加する必要がある。
このために正しい方法かどうかはわからないが,以下のような対策をしてみる。
このやり方の場合,日本の陸地や海の領域を特定する地形データが別途必要になる。
> cd sea
このディレクトリに,海を特定した上で key='natural' value='sea' タグを付けるため,テキストエディタを使ってjapan_s.osmを作成した。面倒なので日本全体を海にしている。
同様にして,hokkaido_s.osm tohoku_s.osm kanto_s.osm chubu_s.osm kinki_s.osm chugoku_s.osm shikoku_s.osm kyushu_s.osm honshu_s.osm をそれぞれ作成した。
OpenStreetMap Dataというサイトから,世界の陸地線のデータである,land-polygons-split-4326.zipファイルをダウンロードする。
> wget https://osmdata.openstreetmap.de/download/land-polygons-split-4326.zip > unzip land-polygons-split-4326.zip
zipファイルを解凍すると,land_polygons.shpという世界全体のShapeフォーマット(外形)のデータがある。このファイルをogr2ogr( GDAL に含まれているツール。Windowsの場合QGISにGDALが含まれているので,QGISがインストールされていればogr2ogrも使える。)というツールを使用して,日本全体の外形のShapeデータのjapan.shpを取り出す。
> ogr2ogr -overwrite -progress -skipfailures -clipsrc 122.560700 21.209920 153.890100 45.802450 japan.shp land-polygons-split-4326\land_polygons.shp
その後,shape2osm.py(自分でPython3で動くように修正したもの)を使用して,日本全体の外形データを,japan_ns.osmファイルに変換する。
> python shape2osm.py -l japan_ns -o 10000000 japan.shp
これで,日本全体の陸地の外形データのjapan_ns.osmが作成される。この時,shape2osm.pyにより, key='natural' value='nosea' タグが追加されている。
そして,日本全体の外形データから,北海道,本州,四国,九州,または北海道,東北,関東,中部,近畿,中国,四国,九州の外形データを作成する。これはosmconvertを使用して各場所をカットすることにした。
ツールにはOpenStreetMapのwikiに書かれているosmosisも使用した。
4個の場合は,
> osmosis --read-xml file="japan_s.osm" --read-xml file="japan_ns.osm" --sort --merge --write-xml file="japan_ns2.osm" > osmconvert --complex-ways japan_ns2.osm -B=..\poly\Hokkaido.poly -o=hokkaido_ns.osm > osmconvert --complex-ways japan_ns2.osm -B=..\poly\Honshu.poly -o=honshu_ns.osm > osmconvert --complex-ways japan_ns2.osm -B=..\poly\Shikoku.poly -o=shikoku_ns.osm > osmconvert --complex-ways japan_ns2.osm -B=..\poly\Kyushu.poly -o=kyushu_ns.osm
8個の場合は,
> osmosis --read-xml file="japan_s.osm" --read-xml file="japan_ns.osm" --sort --merge --write-xml file="japan_ns2.osm" > osmconvert --complex-ways japan_ns2.osm -B=..\poly\Tohoku.poly -o=tohoku_ns.osm > osmconvert --complex-ways japan_ns2.osm -B=..\poly\Kanto.poly -o=kanto_ns.osm > osmconvert --complex-ways japan_ns2.osm -B=..\poly\Chubu.poly -o=chubu_ns.osm > osmconvert --complex-ways japan_ns2.osm -B=..\poly\Kinki.poly -o=kinki_ns.osm > osmconvert --complex-ways japan_ns2.osm -B=..\poly\Chugoku.poly -o=chugoku_ns.osm > osmconvert --complex-ways japan_ns2.osm -B=..\poly\Shikoku.poly -o=shikoku_ns.osm > osmconvert --complex-ways japan_ns2.osm -B=..\poly\Kyushu.poly -o=kyushu_ns.osm
で作成した。
海(xxxx_s.osm)と陸地部分(xxxx_ns.osm)をマージして,xxxx_sea.osmを作成しておく。
4個の場合は,
> osmosis --read-xml file="hokkaido_s.osm" --read-xml file="hokkaido_ns.osm" --sort --merge --write-xml file="hokkaido_sea.osm" > osmosis --read-xml file="honshu_s.osm" --read-xml file="honshu_ns.osm" --sort --merge --write-xml file="honshu_sea.osm" > osmosis --read-xml file="shikoku_s.osm" --read-xml file="shikoku_ns.osm" --sort --merge --write-xml file="shikoku_sea.osm" > osmosis --read-xml file="kyushu_s.osm" --read-xml file="kyushu_ns.osm" --sort --merge --write-xml file="kyushu_sea.osm"
8個の場合は,
> osmosis --read-xml file="hokkaido_s.osm" --read-xml file="hokkaido_ns.osm" --sort --merge --write-xml file="hokkaido_sea.osm" > osmosis --read-xml file="tohoku_s.osm" --read-xml file="tohoku_ns.osm" --sort --merge --write-xml file="tohoku_sea.osm" > osmosis --read-xml file="kanto_s.osm" --read-xml file="kanto_ns.osm" --sort --merge --write-xml file="kanto_sea.osm" > osmosis --read-xml file="chubu_s.osm" --read-xml file="chubu_ns.osm" --sort --merge --write-xml file="chubu_sea.osm" > osmosis --read-xml file="kinki_s.osm" --read-xml file="kinki_ns.osm" --sort --merge --write-xml file="kinki_sea.osm" > osmosis --read-xml file="chugoku_s.osm" --read-xml file="chugoku_ns.osm" --sort --merge --write-xml file="chugoku_sea.osm" > osmosis --read-xml file="shikoku_s.osm" --read-xml file="shikoku_ns.osm" --sort --merge --write-xml file="shikoku_sea.osm" > osmosis --read-xml file="kyushu_s.osm" --read-xml file="kyushu_ns.osm" --sort --merge --write-xml file="kyushu_sea.osm"
で作成する。
出来たosmファイルをpbfファイルに変換しておく。
4個の場合は,
> osmconvert hokkaido_sea.osm -o=hokkaido_sea.pbf > osmconvert honshu_sea.osm -o=honshu_sea.pbf > osmconvert shikoku_sea.osm -o=shikoku_sea.pbf > osmconvert kyushu_sea.osm -o=kyushu_sea.pbf
8個の場合は,
> osmconvert hokkaido_sea.osm -o=hokkaido_sea.pbf > osmconvert tohoku_sea.osm -o=tohoku_sea.pbf > osmconvert kanto_sea.osm -o=kanto_sea.pbf > osmconvert chubu_sea.osm -o=chubu_sea.pbf > osmconvert kinki_sea.osm -o=kinki_sea.pbf > osmconvert chugoku_sea.osm -o=chugoku_sea.pbf > osmconvert shikoku_sea.osm -o=shikoku_sea.pbf > osmconvert kyushu_sea.osm -o=kyushu_sea.pbf
で作成した。
やっと,陸地は<tag k="natural" v="nosea" />が,海の部分は<tag k="natural" v="sea" />がある地図データが作成できた。
上で作成した各場所のベクター地図とベクター等高線地図,及び海を青くする地図,を1つのファイルにマージして日本の各地域のベクター地図.mapファイルに変換する。
変換ツールには,osmosisとMapsforge Map-Writer pluginを使っている。
osmosis/Mapsforge Map-Writer pluginで日本の地図を処理するには,かなり多くのメモリが必要になる。
使用するメモリの設定はosmosisのbin/osmosis.batで,
set JAVACMD_OPTIONS=-Xms5G -Xmx5G
と設定して,使用するNotePCが8GBのRAMが搭載されているので5Gにしてみた。
しかしMapsforge Map-Writer pluginを使って8GのRAMを搭載したWindows Note PCで5Gを割り当てても,本州なんかを処理するにはまったく足りない
搭載メモリが少ない場合は,オプションのtype=hdを使うと速度はかなり遅くなるがうまくいくことがある。
最近の日本全体や本州のmap地図を作成する場合は,RAMが16G搭載したNote PC(Java VMを動かす時に-Xms12G -Xmx12Gとか使って)でも,メモリ不足で停止しちゃうようになってしまった。
どうもzoom interval 1の書き出し時にエラー(java.nio.BufferOverflowException)でうまく行かなくなっている
これは,Mapsforge Map-Writer pluginでのオブジェクト書き出し時のメモリ割り当てサイズが固定値で,それを超えた量になってしまったためと思われる。
しょうがないので,tag mappingファイル(tags.xml)を編集してzoom interval 1(0~7)に割り当てるタグ(オブジェクト数)をできるだけ減らすようにしたら,なんとか本州の.mapも作成できた。この為,zoom 0~7だと表示する情報が減ってしまった。まあ実用上はこれでも問題はない。
等高線が表示されるように,またさらにいくつか表示されるようにtag-conf-file=tags.xmlにオブジェクトを設定しておく。
以下のようにして(本州だけはtype=hdオプションを使っている)でマージして,各.mapファイルを作成した。
4個の場合は,
> osmosis --read-pbf file="jpmap\hokkaido.osm.pbf" --read-pbf file="srtm\hokkaido_srtm.pbf" --merge --read-pbf file="sea\hokkaido_sea.pbf" --merge --mapfile-writer file="hokkaido.osm.map" tag-conf-file=tags\tags.xml map-start-zoom=10 comment="OpenStreetMap contributors %date% made by Yuji Ueno" > osmosis --read-pbf file="jpmap\honshu.osm.pbf" --read-pbf file="srtm\honshu_srtm.pbf" --merge --read-pbf file="sea\honshu_sea.pbf" --merge --mapfile-writer file="honshu.osm.map" tag-conf-file=tags\tags.xml map-start-zoom=10 comment="OpenStreetMap contributors %date% made by Yuji Ueno" type=hd > osmosis --read-pbf file="jpmap\shikoku.osm.pbf" --read-pbf file="srtm\shikoku_srtm.pbf" --merge --read-pbf file="sea\shikoku_sea.pbf" --merge --mapfile-writer file="shikoku.osm.map" tag-conf-file=tags\tags.xml map-start-zoom=10 comment="OpenStreetMap contributors %date% made by Yuji Ueno" > osmosis --read-pbf file="jpmap\kyushu.osm.pbf" --read-pbf file="srtm\kyushu_srtm.pbf" --merge --read-pbf file="sea\kyushu_sea.pbf" --merge --mapfile-writer file="kyushu.osm.map" tag-conf-file=tags\tags.xml map-start-zoom=10 comment="OpenStreetMap contributors %date% made by Yuji Ueno"
8個の場合は,
> osmosis --read-pbf file="jpmap\hokkaido.osm.pbf" --read-pbf file="srtm\hokkaido_srtm.pbf" --merge --read-pbf file="sea\hokkaido_sea.pbf" --merge --mapfile-writer file="hokkaido.osm.map" tag-conf-file=tags\tags.xml map-start-zoom=10 comment="OpenStreetMap contributors %date% made by Yuji Ueno" > osmosis --read-pbf file="jpmap\tohoku.osm.pbf" --read-pbf file="srtm\tohoku_srtm.pbf" --merge --read-pbf file="sea\tohoku_sea.pbf" --merge --mapfile-writer file="tohoku.osm.map" tag-conf-file=tags\tags.xml map-start-zoom=10 comment="OpenStreetMap contributors %date% made by Yuji Ueno" > osmosis --read-pbf file="jpmap\kanto.osm.pbf" --read-pbf file="srtm\kanto_srtm.pbf" --merge --read-pbf file="sea\kanto_sea.pbf" --merge --mapfile-writer file="kanto.osm.map" tag-conf-file=tags\tags.xml map-start-zoom=10 comment="OpenStreetMap contributors %date% made by Yuji Ueno" > osmosis --read-pbf file="jpmap\chubu.osm.pbf" --read-pbf file="srtm\chubu_srtm.pbf" --merge --read-pbf file="sea\chubu_sea.pbf" --merge --mapfile-writer file="chubu.osm.map" tag-conf-file=tags\tags.xml map-start-zoom=10 comment="OpenStreetMap contributors %date% made by Yuji Ueno" > osmosis --read-pbf file="jpmap\kinki.osm.pbf" --read-pbf file="srtm\kinki_srtm.pbf" --merge --read-pbf file="sea\kinki_sea.pbf" --merge --mapfile-writer file="kinki.osm.map" tag-conf-file=tags\tags.xml map-start-zoom=10 comment="OpenStreetMap contributors %date% made by Yuji Ueno" > osmosis --read-pbf file="jpmap\chugoku.osm.pbf" --read-pbf file="srtm\chugoku_srtm.pbf" --merge --read-pbf file="sea\chugoku_sea.pbf" --merge --mapfile-writer file="chugoku.osm.map" tag-conf-file=tags\tags.xml map-start-zoom=10 comment="OpenStreetMap contributors %date% made by Yuji Ueno" > osmosis --read-pbf file="jpmap\shikoku.osm.pbf" --read-pbf file="srtm\shikoku_srtm.pbf" --merge --read-pbf file="sea\shikoku_sea.pbf" --merge --mapfile-writer file="shikoku.osm.map" tag-conf-file=tags\tags.xml map-start-zoom=10 comment="OpenStreetMap contributors %date% made by Yuji Ueno" > osmosis --read-pbf file="jpmap\kyushu.osm.pbf" --read-pbf file="srtm\kyushu_srtm.pbf" --merge --read-pbf file="sea\kyushu_sea.pbf" --merge --mapfile-writer file="kyushu.osm.map" tag-conf-file=tags\tags.xml map-start-zoom=10 comment="OpenStreetMap contributors %date% made by Yuji Ueno"
でマージした。
とにかく時間がかかる。4分割の場合は全部マージすると大体27時間(現在のNote PCだと8時間,サーバーマシンで16時間)ぐらいかかった
こうやって,北海道(hokkaido.osm.map),本州(honshu.osm.map),四国(shikoku.osm.map),九州(kyushu.osm.map)の4個セットか,北海道(hokkaido.osm.map),東北(tohoku.osm.map),関東(kanto.osm.map),中部(chubu.osm.map),近畿(kinki.osm.map),中国(chugoku.osm.map),四国(shikoku.osm.map),九州(kyushu.osm.map)の8個セットの日本のベクター地図が出来た。
北海道(hokkaido.osm.map),本州(honshu.osm.map),四国(shikoku.osm.map),九州(kyushu.osm.map)の4個のベクター地図をLocus MapのmapsVectorフォルダーにコピーして,日本の地図をLocus Mapで使用することが出来た。
上記の作業をbatファイルにして,定期的に自動で日本のベクター地図を作成することにした。
作成されたMapsforge形式のベクター地図はバージョンV3となる。
Mapsforgeのthemeの仕様はこちらで説明されている。
Locus Mapではdpiが違う端末でも表示の互換性が取れるようにMapsforgeのThemeの仕様が拡張されていて,文字サイズや線幅などにdpをつけて定義できる。これを使うと解像度が高い端末でも文字等が小さすぎて見えにくいことを回避できる。
上記で作成したLocus Map用の日本のベクター地図は,独自のtag mappingファイル(tags.xml)によりLoMapsより多くのオブジェクトを含んでいる。これらのオブジェクト(等高線を含む)が表示出来るように,自分用のThemeファイル(V3用のテーマ)を作成して使用している。
Locus MapのmapsVector/_themesフォルダーにこのファイル(zipのまま)をコピーすれば使用できる。
POI(Point of Interest)は地図上の特定のポイント情報のこと。
Mapsforgeライブラリには,OpenStreetMapのデータからPOIを抽出するためのPOI Writerプラグイン(バージョン0.6.1から対応した)がある。このプラグインを使うとOpenStreetMapの地図データから任意のものをPOIとして抽出して,Mapsforge形式のSQLite DBファイルに書き出すことが出来る。
POIとして抽出するOpenStreetMapのタグ要素としては,nodeとwayを対象にしていてrelationは省かれている。geo-tags=trueオプションを使うとrelationも対象になるはずだが,osmosisの処理途中でエラーで停止してしまった。
なのでrelationで設定されているところ(関西国際空港など)は,POIとして出力されない
OpenStreetMapを編集してrelationだけのオブジェクトには,nodeかwayでPOI情報を追加してもらうとありがたいのだが・・・
LoMapsのオフラインPOI DBではrelationも処理されているようだ。
POI DBファイルを作成するのには,mapファイル作成する時にも使ったosmosisとMapsforge POI-Writer pluginを使っている。
抽出するPOIは,poi-mapping.xmlファイル(tagsディレクトリに置く)に設定しておく。デフォルトからいくつか追加している。
以下のようにしてosmosisコマンドで.poiファイルを作成した。
4個に分割する場合,
> cd poi > osmosis --read-pbf file="..\jpmap\hokkaido.osm.pbf" --poi-writer file="hokkaido.osm.poi" tag-conf-file=..\tags\poi-mapping.xml comment="OpenStreetMap contributors %date% made by Yuji Ueno" > osmosis --read-pbf file="..\jpmap\honshu.osm.pbf" --poi-writer file="honshu.osm.poi" tag-conf-file=..\tags\poi-mapping.xml comment="OpenStreetMap contributors %date% made by Yuji Ueno" > osmosis --read-pbf file="..\jpmap\shikoku.osm.pbf" --poi-writer file="shikoku.osm.poi" tag-conf-file=..\tags\poi-mapping.xml comment="OpenStreetMap contributors %date% made by Yuji Ueno" > osmosis --read-pbf file="..\jpmap\kyushu.osm.pbf" --poi-writer file="kyushu.osm.poi" tag-conf-file=..\tags\poi-mapping.xml comment="OpenStreetMap contributors %date% made by Yuji Ueno"
8個に分割する場合は,
> cd poi > osmosis --read-pbf file="..\jpmap\hokkaido.osm.pbf" --poi-writer file="hokkaido.osm.poi" tag-conf-file=..\tags\poi-mapping.xml comment="OpenStreetMap contributors %date% made by Yuji Ueno" > osmosis --read-pbf file="..\jpmap\tohoku.osm.pbf" --poi-writer file="tohoku.osm.poi" tag-conf-file=..\tags\poi-mapping.xml comment="OpenStreetMap contributors %date% made by Yuji Ueno" > osmosis --read-pbf file="..\jpmap\kanto.osm.pbf" --poi-writer file="kanto.osm.poi" tag-conf-file=..\tags\poi-mapping.xml comment="OpenStreetMap contributors %date% made by Yuji Ueno" > osmosis --read-pbf file="..\jpmap\chubu.osm.pbf" --poi-writer file="chubu.osm.poi" tag-conf-file=..\tags\poi-mapping.xml comment="OpenStreetMap contributors %date% made by Yuji Ueno" > osmosis --read-pbf file="..\jpmap\kinki.osm.pbf" --poi-writer file="kinki.osm.poi" tag-conf-file=..\tags\poi-mapping.xml comment="OpenStreetMap contributors %date% made by Yuji Ueno" > osmosis --read-pbf file="..\jpmap\chugoku.osm.pbf" --poi-writer file="chugoku.osm.poi" tag-conf-file=..\tags\poi-mapping.xml comment="OpenStreetMap contributors %date% made by Yuji Ueno" > osmosis --read-pbf file="..\jpmap\shikoku.osm.pbf" --poi-writer file="shikoku.osm.poi" tag-conf-file=..\tags\poi-mapping.xml comment="OpenStreetMap contributors %date% made by Yuji Ueno" > osmosis --read-pbf file="..\jpmap\kyushu.osm.pbf" --poi-writer file="kyushu.osm.poi" tag-conf-file=..\tags\poi-mapping.xml comment="OpenStreetMap contributors %date% made by Yuji Ueno"
これで,北海道(hokkaido.osm.poi),本州(honshu.osm.poi),四国(shikoku.osm.poi),九州(kyushu.osm.poi),または北海道(hokkaido.osm.poi),東北(tohoku.osm.poi),関東(kanto.osm.poi),中部(chubu.osm.poi),近畿(kinki.osm.poi),中国(chugoku.osm.poi),四国(shikoku.osm.poi),九州(kyushu.osm.poi)のMapsforge形式のPOI DBファイルが作成できた。
Locus Mapでは残念ながらMapsforge POI DBをオフラインPOI DBとしては使用できない。
MapsforgeライブラリでPOI DBがサポートされる前から,Locus MapではオフラインPOI機能を搭載するため独自にオフラインPOI DBを作成していた。なので独自フォーマットなのはしょうがない。
またこのLoMapsの一部であるオフラインPOI DBは,住所検索用のDBデータも入っているようだ。
LoMapsのオフラインPOI DBのフォーマット仕様は公開されていないのでLoMapsを購入しないとオフラインPOI DBを使用することは出来なかったが,独自にフォーマットを解析した人が仕様を公開してくれている
また,Mapsforge POI DBをLocus Mapのoffline POI DBに変換するツールpoi_converterも公開されているので,このツールを使ってMapsforge POI DBからLocus Map用のオフラインPOI DBを作成してみた。*5 ただ住所検索用のデータは,残念ながら変換できないようだ。
このおかげかどうかはわからないがOpenAndroMapsでも,2020/07ぐらいからLocus Mapで使用できるオフラインPOI DB(住所検索DBは含まれていない)をサポートしている。
Locus MapのオフラインPOI DB構造を,init.sqlファイル(configディレクトリに置く)で設定しておく。また,変換するPOIの選択は,tagfilter.txtファイル(configディレクトリに置く)に設定しておく。これらのファイルは,自分用に多少追加・変更している。
4個の場合は,
> python poiconverter.py -if poi -om create hokkaido.osm.poi hokkaido.osm.db > python poiconverter.py -if poi -om create honshu.osm.poi honshu.osm.db > python poiconverter.py -if poi -om create shikoku.osm.poi shikoku.osm.db > python poiconverter.py -if poi -om create kyushu.osm.poi kyushu.osm.db
8個の場合は,
> python poiconverter.py -if poi -om create hokkaido.osm.poi hokkaido.osm.db > python poiconverter.py -if poi -om create tohoku.osm.poi tohoku.osm.db > python poiconverter.py -if poi -om create kanto.osm.poi kanto.osm.db > python poiconverter.py -if poi -om create chubu.osm.poi chubu.osm.db > python poiconverter.py -if poi -om create kinki.osm.poi kinki.osm.db > python poiconverter.py -if poi -om create chugoku.osm.poi chugoku.osm.db > python poiconverter.py -if poi -om create shikoku.osm.poi shikoku.osm.db > python poiconverter.py -if poi -om create kyushu.osm.poi kyushu.osm.db
とした。
北海道(hokkaido.osm.db),本州(honshu.osm.db),四国(shikoku.osm.db),九州(kyushu.osm.db),または北海道(hokkaido.osm.db),東北(tohoku.osm.db),関東(kanto.osm.db),中部(chubu.osm.db),近畿(kinki.osm.db),中国(chugoku.osm.db),四国(shikoku.osm.db),九州(kyushu.osm.db)のLocus Mapで使えるオフラインPOI DBファイルが作成できた。
北海道(hokkaido.osm.db),本州(honshu.osm.db),四国(shikoku.osm.db),九州(kyushu.osm.db)の4個のファイルをLocus MapのmapsVectorフォルダーにコピーするとオフラインPOI DBとして使用できた。
上記で作成したオフラインPOI DBファイルでは住所検索が出来ないので,代わりにGeoNamesのデータをオフライン住所検索に使ってみる。
GeoNamesのここからJP.zip(日本のデータ)をダウンロードする。
JP.zipを解凍してJP.txtをLocus Mapのdata/geoNamesフォルダーにコピーする。
これでLocus Mapの検索を開き「GenoNamesとGNSでオフライン検索」をマークしてファイルの選択でJPを選ぶと,住所検索として使用できた。GenoNamesのデータは,日本のすべての住所が入っているわけではないので,住所検索出来ないところも多い
Windowsでも動作するCruiserという地図アプリを使うと,作成した日本のベクター地図をPCで確認することが出来る。
Mapsforgeライブラリでの地図の標示は,非常に高速に処理されているのがわかる。
作成した日本のベクター地図(2023/07頃から10m等高線にした)はこちら Newに置いておく。
コメント一覧
新しくコメントをつける
この場合,テーマもLoMaps V4形式の物に変更する必要があります。Mapsforge形式の地図は,表示するときに使用するテーマに基づいてレンダリングされます。表示の色やどのアイコン表示するかなどが,テーマで設定されています。
通常デフォルトのテーマはLocus Mapを更新するとテーマも更新されます。
テーマを自分で編集することで色などは自由に変更できます。