一昨年、自作アンドロイドアプリ用の中部地方の地図を作成した話を記事に書きました。
alasixosaka.hatenablog.com
この時は南アルプスに登山に行くために地図を作成しました。結局、予約していた山小屋がコロナで休業になり、おまけに台風の直撃を受けたので、結局登山は断念してせっかく作成した地図は使わずじまいでした。
alasixosaka.hatenablog.com
この夏は関東の山に登ろうかと思っています。まあ、どうなるかわからないですが。
いずれにしても、準備だけはしておこうということで、前の記事を見ながら関東の地図を作成したのですが、またまたいろいろ苦労してしまいました。
まず、前回と違うのはパソコンがWindos10からWindows11に変わったことでした。ですので、Windows11版として改めてポイントを含めて書いてみたいと思います。
手順
まず、前回と同様に元になるデータ、日本のオープンストリートマップ、等高線図、海岸線図は用意できているものとします。これらの詳細は過去の記事を見てください。
alasixosaka.hatenablog.com
alasixosaka.hatenablog.com
手順は下記のとおりです。
注意点
具体的な作業の詳細に入る前に、今回なかなかうまくいかなかった理由になったポイントをまず書いておきます。
- OSMOSISの最新版はWindows11では動かない。
これはOSMOSISの最新版を作成したときのJAVAインタープリタがWindows最新のJREでは対応していないためのようです。現在のOSMOSISの最新版は4.9ですが、Windowsでは2024/7/13現在バージョン4.7以下を使う必要がありそうです。バージョン4.8でも動くかもしれませんが試していません。バージョン4.8はなぜか旧バージョンのリストに載っていませんでした。ちなみに、その時点でのWindows版JAVAの最新版はバージョン8の4.11でした。
- OSMOSISのバージョンとマップライタープラグインのバージョンの組み合わせには注意。
OSMOSISを古いバージョンで動かしたときに、マップライタープラグインを新しいのにしてしまうとうまく動かないようです。また、エラーメッセージがある程度処理が進んだところで出るので、エラーになった時結構こたえます。はじめは理由がわからず何度もやり直して時間をかなり使ってしまいました。
私がうまくいった組み合わせは、OSMOSISのバージョン4.7とマップライタープラグインのバージョン 0.10.0 です。マップライタープラグインはOSMOSISのあるフォルダの下にあるlibフォルダの中のdefaultフォルダに入れておきます。
- JAVAのヒープメモリサイズはなるべく大きくする。
前回中部の時はヒープメモリサイズを6Gバイトにして作業がうまくいきましたが、今回は6Gでもアウトオブメモリーのエラーが出ました。必要なメモリサイズは処理するデータの量に依存すると思うので、作成する地図のエリアが広いと多くのメモリーが必要になります。今のパソコンには48Gバイトのメモリが積んでありますので、思い切って24Gバイトにしました。まあ、そこまでは必要ないと思うのですが、8Gバイトから10Gバイトくらいは必要だったかと思います。
また、ヒープメモリの指定ですが、前回やったWindowsの環境変数で設定する方法ではエラーが出てうまくいきませんでした。そこで今回は、コントロールパネルからJAVAを選択し、JAVAのタブをクリック、表示をクリックし、ユーザータブのランタイムパラメータに、-Xmx24Gなどと記載します。ここではヒープメモリのサイズを24GBに設定しています。設定する値はそれぞれのマシンに搭載されているメモリーの量に依存しますのでメモリーの容量を確認してから設定してください。

JAVAのアウトオブメモリーのエラーも作業がある程度進んでから出るので、これが出るとがっくり来ます。余裕があるなら最初から沢山用意しておいた方がよいと思います。
詳細な手順
作成する地図の領域を決める。
まず、グーグルマップを使って領域を決めました。今回は北緯が34.6196から36.9512まで。東経が138.5069から140.8637までとしました。これで伊豆半島、房総半島から北関東エリア一体までを含む地図ができます。もちろん富士山も含まれています。
OSMOSISで日本のオープンストリートマップから今回決定したエリアを切り出します。
コマンドプロントで下記のコマンドを実行します。
Osmosis --rb file="japan-latest.osm.pbf" --bounding-box top=36.9512 left=138.5069 bottom=34.9196 right=140.8637 --wb file="kanto.osm.pbf"
等高線の切り出し。
同様にOSMOSISを使って下記のコマンドで等高線を切り出します。
Osmosis --rb file="honshu_dem10b.osm.pbf" --bounding-box top=36.9512 left=138.5069 bottom=34.9196 right=140.8637 --wb file="kanto_dem10b.osm.pbf"
海岸線の地図を切り出す
ogr2ogrで海岸線のデータを切り出します。海岸線のデータはシェイプファイル形式ですので、ogr2ogrを使います。
ogr2ogr -overwrite -progress -skipfailures -clipsrc 138.5069 34.9196 140.8637 36.9512 kanto_o1.shp land-polygons-split-4326/land_polygons.shp
できた海岸線は途中で切れていますので、修復します。
PaoloIsGreat.pyというPythonスクリプトを使います。
このPythonスクリプトはスクリプトの中にインプット、アウトプットファイル名が書かれていますので、スクリプトを編集して使います。編集はメモ帳とかでも可能ですが、私はPythonを動かすのにPyCharmを使っていますので、PyCharmを使って編集しました。
下記のリストはオリジナルのスクリプトの一部でファイル入出力に該当する部分です。インプットファイルはここで、'poly.shp'で、アウトプットファイルは'polys.shp'です。
in_ds = driver.Open('poly.shp', 0)
in_lyr = in_ds.GetLayer()
outputshp = 'polys.shp'今回はインプットファイルが先ほど作成したkanto_o1.shpで、アウトプットファイルは'kanto_o2.shp'としました。
次にshape2osmを使ってシェープファイルをOSM形式に変更します。こちらもPythonスクリプトです。前回はPython2.x系を使いましたが、今回はPython3.x系を使いました。
こちらのスクリプトはファイル名の指定は起動時の引数に記述します。出力ファイル名はkanto_o1_ns1.osmとしました。
shape2osm -l kanto_o1_ns1 -o 10000000 kanto_o2.shp
はじめ、今回うまくいかなかった理由は、ここで、Python3のスクリプトを使ったからだと思ったのですが、結果的にはPython3でも問題ありませんでした。
今回は下記のGitのサイトのスクリプトを使用しました。
github.com
Python3.x系か、Python2.x系か確認するには、スクリプトの冒頭のところを見て、#!/usr/bin/python3 とpython3と記載されていればPython3.x系です。
両方のスクリプトを見比べましたが、違いはPrintコマンドの所くらいでした。また、JOSMでできたOSM形式の海岸線地図をチェックしましたがちゃんとつながっていて問題ありませんでした。注意することは、前のブログの記事でも書きましたが、”changeset=-1"となっているとエラーになるのでメモ帳などで編集して”changeset=1"としました。
海の領域の地図を作る
これも、前回のブログに詳しく書きましたので詳細は書きませんが、同じようにメモ帳でも使って四角の領域を指定するだけです。
出来た地図はkanto_s.osmとしました。
そして、先ほどの海岸線の地図と合体します。
osmosis --rx file=kanto_s.osm --rx file=kanto_o1_ns1.osm --s --m --wx file=kanto_o1_sea.osm
3つの地図を合体する。
オープンストリートマップの切り出した地図、切り出した等高線、海岸線の地図をOSMOSISで合体します。
osmosis --rx file=kanto_o1_sea.osm --rb file=kanto.osm.pbf --s --m --rb file=kanto_DEM10b.pbf --s --m --wb file=kanto_o1c.pbf omitmetadata=true
omitmetadata=trueとする理由は相変わらずわかっていません。前回の例に従いました。ただ、ここで前回のブログの記事に間違いがあってそこではまりました。自分の書いた記事のせいではまるというのもドジなもんですが。最後の出力ファイルを指定するところで、本来なら--wbとしないといけないところを--wxとしてしまいOSM形式での出力を指定してしまっていました。OSMOSISはファイル形式とファイル名をチェックするのか--wxとして、ファイル名の拡張子に.pbfとしてしまうとファイルがうまく生成されず、容量が0KBになっていました。これがけっつまずいた最初の点です。
マップ形式への変換
最後にできたpbf形式の地図をマップファイルライターでmapsforgeで読めるマップ形式に変換します。
osmosis --rb file=kanto_o1.pbf --mw file=kanto_o1c.map bbox=34.6196,138.5069,36.9512,140.8637 tag-conf-file=tags.xml map-start-zoom=10 type=hd
途中でも書きましたが、OSMOSISのバージョンが新しすぎてもダメで、また、マップファイルライターのバージョンがOSMOSISのバージョンに適したのでないと動かないのでここで何度もやり直しをさせられました。
最後に動いたときの画面を載せておきます。延々とコマンドが表示されるので始めと終わりの部分だけで途中は省略しています。


字が小さくて申し訳ないですが、このように、エラーがなく、最後にトータルタイムが表示されれば成功です。ここの処理が一番長くかかります。4296759ミリ秒ですから、約1時間12分くらいでした。
富士山を表示させるとこんな感じになります。
