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