トップOpenStreetMap > Osmfilter

Osmfilter

はじめに

Osmfilter は Osmosis のタグフィルタリング機能に近いものである。 pbfフォーマットよりはシンプルな o5m フォーマットが対象となる。 o5m ファイルは pbf より2倍以上の大きさであるが、処理が高速である。

pbf から o5m あるいはその逆変換は Osmconvert で行う。

Osmfilter は、現在実験段階にあるため、そのつもりで使ってみる。

pbf は osmosis が使ったファイル形式で、 それが現在は殆どのソフトでサポートするようになったようだ。

o5m の産みのツールソフトは何だろう。多分、osmfilter、osmconvert、osmupdate であろう。


Osmosis より数倍速い。うまくいくこともあるが、imposm3、osm2pgsql いずれでも、 インポート時にエラー(Killed)が起きることがある。 多分、出力されるファイルに何らかのエラーが混入しているのだろう。

一般の使用実績が増えれば、実用に供するようになるだろう。

Osmfilterを使ってみる

最初に、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

リファレンス

[1] Osmfilter