Osmfilter は Osmosis のタグフィルタリング機能に近いものである。 pbfフォーマットよりはシンプルな o5m フォーマットが対象となる。 o5m ファイルは pbf より2倍以上の大きさであるが、処理が高速である。
pbf から o5m あるいはその逆変換は Osmconvert で行う。
Osmfilter は、現在実験段階にあるため、そのつもりで使ってみる。
pbf は osmosis が使ったファイル形式で、 それが現在は殆どのソフトでサポートするようになったようだ。
o5m の産みのツールソフトは何だろう。多分、osmfilter、osmconvert、osmupdate であろう。
Osmosis より数倍速い。うまくいくこともあるが、imposm3、osm2pgsql いずれでも、 インポート時にエラー(Killed)が起きることがある。 多分、出力されるファイルに何らかのエラーが混入しているのだろう。
一般の使用実績が増えれば、実用に供するようになるだろう。
最初に、pbf ファイルから o5m ファイルを作成しておく。
hatada@dell:/media/sf_world_osm$ osmconvert africa.osm.pbf -o=africa.o5m
まず、テストを行う。
hatada@dell:/media/sf_world_osm$ osmfilter ./central-america.o5m --keep="highway=primary =secondary" > streets.osm
これで highway=primary,secondary の relation, way およびその node が取り出される。 osmosis では下記のようになる。
osmosis --rbf ./central-america.pbf ^ --tf reject-relations ^ --tf accept-ways highway=primary,secondary ^ --used-node ^ ^ --rbf ./central-america.pbf ^ --tf accept-relations highway=primary,secondary ^ --used-way ^ --used-node ^ ^ --merge ^ --wx ./streets.osm
基本的なことは osmosis のタグ・フィルタリングよりもやさしい。そこで、 osmosis の
osmosis ^ --rbf e:/world_osm/north-america.osm.pbf ^ --tf reject-relations ^ --tf reject-ways ^ --tf accept-nodes place=country,state,province,city ^ ^ --rbf e:/world_osm/north-america.osm.pbf ^ --tf reject-relations ^ --tf accept-ways admin_level=2,3,4 ^ highway=motorway,trunk waterway=riverbank ^ --used-node ^ ^ --rbf e:/world_osm/north-america.osm.pbf ^ --tf accept-relations natural=wood,water landuse=forest admin_level=2,3,4 ^ highway=motorway,trunk waterway=riverbank ^ --used-way ^ --used-node ^ ^ --merge --merge ^ --wb c:/gis/osmosis_out/north-america.osm.pbfを、osmfilter に置き換えてみる。厳密には少し異なるところがある。
central-america は 40秒, 57MB、 south-america は 8分, 1GB、 north-america は 35分, 4GB、 europe は 74分, 7GBとなった。
osmfilter --hash-memory=2000 /media/sf_world_osm/europe.o5m \ --keep="place=country =state =province =city" \ --keep="admin_level=2 =3 =4" \ --keep="highway=motorway =trunk" \ --keep="natural=wood =water" \ --keep="landuse=forest" \ --keep="waterway=riverbank" \ -o=/media/sf_wo5m4lz/europe.o5m
osmfilter /media/sf_wo5m4lz/south-america.o5m --out-count 913760 natural 474177 source 226091 leaf_type 215854 leaf_cycle 172266 highway 172250 water 153961 name 145881 landuse 127286 ref 117840 surface 109365 oneway 93109 lanes 85500 maxspeed 70234 description 60566 intermittent 55975 created_by 50555 type 35466 produce 34317 genus 28536 source:date 24046 layer [以下略]
ファイルサイズが少々大きすぎる。抽出条件を絞ろう。 osmosis では natural=wood,water landuse=forest は relation, used-way, used-node としていた。 way, used-node は除外していた。osmfilter では、 --keep-relations では、--used-way, --used-node が含まれない。
osmfilter --hash-memory=2000 /media/sf_world_osm/south-america.o5m \ --keep-nodes="place=country =state =province =city" \ --keep="admin_level=2 =3 =4" \ --keep="highway=motorway =trunk" \ --keep="natural=wood =water" \ --keep="landuse=forest" \ --keep="waterway=riverbank" \ --drop-tags="source*= leaf_*=" \ --out-o5m \ > /media/sf_wo5m4lz/south-america.o5m
一部の不要タグを除いてみたがファイルサイズの減少は微々たるものであった。
ちょっと試した限りでは -keep= --keep-ways="natural=water" は osmosis の --tf --reject-relation --accept-ways natural=wood --used-node に相当し、 -keep= --keep-relations="natural=water" は --tf --accept-relations natural=wood --used-way --used-node に相当するようだ。
出力ファイルサイズからみて、これで osmosis とほぼ同等の結果が得られているものと思われる。
osmfilter --hash-memory=2000 /media/sf_world_osm/antarctica.o5m \ --keep= --keep-nodes="place=country =state =province =city" \ --keep= --keep-relations="admin_level=2 =3 =4" \ --keep= --keep-ways="admin_level=2 =3 =4" \ --keep= --keep-relations="highway=motorway =trunk" \ --keep= --keep-ways="highway=motorway =trunk" \ --keep= --keep-relations="natural=wood =water" \ --keep= --keep-relations="landuse=forest" \ --keep= --keep-relations="waterway=riverbank" \ -o=/media/sf_wo5m4lz/antarctica.o5m
実行時間はアフリカが14分、アジアが28分、ヨーロッパが67分、北米が31分、中米が1分、南米が 7分、 豪オセアニアが 2分、南極大陸が数秒である。
osm2pgsql の場合、o5m 形式もサポートしているが、imposm3 はサポートしていないので、 osmconvert で pbf 形式に変換する。 imposm3 でのインポート時に pipe で変換して渡してもよい。 いずれにせよ、ファイルサイズが比較的小さいため、変換時間は短い。
cd /media/sf_wo5m4lz osmconvert asia.o5m -o=asia.pbf osmconvert europe.o5m -o=europe.pbf osmconvert south.o5m -o=south.pbf osmconvert north-america.o5m -o=north-america.pbf