OpenStreetMapのデータをosmiumを使用して指定した範囲で抽出する方法

作成日
キーワード
GIS OpenStreetMap osmium

OpenStreetMapからダウンロードした大きなデータを、市区町村の行政区域の範囲や、自分で決めた任意の範囲で切り出したい場合があります。Osmiumを使用すると、GeoJSONで指定した範囲でOpenStreetMapのデータを抽出して新しいosm.pbfデータを作成することができます。

例えば、geofabrikの関東地方のーデータのページから最新のOpenStreetMapのデータをkanto-latest.osm.pbfとしてダウンロードし、東京中心部の範囲を抽出してみます。

ここでは、東京中心部を、次のようなGeoJSONで定義し、tokyo.geojsonというファイルに保存します。

{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "properties": {},
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [
            [
              139.757080078125,
              35.79553849799263
            ],
            [
              139.6739959716797,
              35.776043045943254
            ],
            [
              139.65682983398438,
              35.73648044300146
            ],
            [
              139.65133666992188,
              35.651158980402315
            ],
            [
              139.67193603515625,
              35.60818490437746
            ],
            [
              139.67262268066406,
              35.569656046317796
            ],
            [
              139.6739959716797,
              35.54060755592023
            ],
            [
              139.72412109375,
              35.509871738383964
            ],
            [
              139.7625732421875,
              35.50204619633058
            ],
            [
              139.84909057617188,
              35.504282143299655
            ],
            [
              139.88067626953125,
              35.553457224935244
            ],
            [
              139.93972778320312,
              35.610417892730496
            ],
            [
              139.94247436523438,
              35.6517169333161
            ],
            [
              139.9321746826172,
              35.71920046208453
            ],
            [
              139.90745544433594,
              35.77102915686019
            ],
            [
              139.90264892578125,
              35.80500599209946
            ],
            [
              139.757080078125,
              35.79553849799263
            ]
          ]
        ]
      }
    }
  ]
}

kanto-latest.osm.pbfから上のGeoJSONの範囲でOpenStreetMapのデータを抽出するには、次のようにosmiumコマンドを実行します。

osmium extract \
    --strategy complete_ways \
    --set-bounds --polygon tokyo.geojson \
    -o tokyo.osm.pbf \
    kanto-latest.osm.pbf

pbfファイルをパースする際に、ツールによっては"Can’t read shapefiles unless a bounding box is provided.“などと警告されることがあります。これは作成したpbfのヘッダーにbounding boxが書かれていないためです。 ヘッダーにbboxを追加するために、osmiumコマンドに--set-boundsオプションを追加することを忘れないようにします。

抽出後のtokyo.osm.pbfからベクトルタイルを作成し、maplibre-glで表示すると図1のようになり、期待した範囲でOpenStreetMapのデータを抽出できていることが確認できました。

図1: OpenStreetMapのkanto-latest.osm.pbfから東京中心部を表すgeojsonの範囲を指定して抽出したosm.pbfをベクトルタイルとしてmaplibre-glで表示した様子

より複雑なGeoJSONを使用して抽出範囲を指定することもできます。

例えば、Geoshapeリポジトリ - 地理形状データ共有サイトで公開されている東京都品川区 (13109A1968) | 歴史的行政区域データセットβ版から品川区の行政区域のGeoJSONをダウンロードし、GeoJSONのMultiPolygonのジオメトリとして指定されている範囲でOpenStreetMapのデータを抽出することなどができます。

OpenStreetMapのjapan-latest.osm.pbfのデータに対して、ダウンロードした品川区の行政区域をshinagawa.geojsonとして指定し、次のようにosmiumコマンドを実行します。

osmium extract \
    --strategy complete_ways \
    --set-bounds --polygon shinagawa.geojson \
    -o shinagawa.osm.pbf \
    japan-latest.osm.pbf

抽出結果のshinagawa.osm.pbfをQGISを使用して表示すると、図2のようになります。

図2: OpenStreeetMapのjapan-latest.osm.pbfから品川区の行政区域のgeojsonの範囲を指定して抽出したosm.pbfをQGISを使用して表示した様子