BODIK APIに自治体ポリゴンを追加

いろいろな情報を分析、可視化するとき、地図に表示することがあります。

BODIK APIで取得した情報を可視化する場合、公共施設や指定緊急避難場所などの位置情報ならば地図にマーカーを立てることができます。
自治体ごとの状況を可視化しようとすると、自治体の境界情報(ポリゴン)が欲しくなります。この自治体ポリゴンってどこにあるんだろう?

調べてみると、国勢調査の情報が「e-Stat」サイトで公開されているらしい。
ここにポリゴン情報もあり、APIで取得できるようだけど、ダウンロードするとshapefileが入手できた。このままでは使いにくいなぁ。。。

ということで、e-Statから自治体のポリゴン情報をあらかじめダウンロードしておいて、APIで「geojson」を提供する仕組みをBODIK APIの中に組み込んでみました。

事前準備としてやることは、

  • e-Statから自治体のポリゴン情報をダウンロードし、geojsonに変換する。
    • shapefileをダウンロードする。
    • shapefileがZIP圧縮されているので、解凍して「shp」を取り出す。
    • e-Statのポリゴンは「町」レベルの境界線になっているので、都道府県別、自治体別に境界線を統合する。
  • 国勢調査のタイミング(5年ごと)でポリゴンが更新されるので、今後も定期的に取得・更新できるように処理を自動化する。
  • 政令指定都市は、「区」を扱えるようにする。

自治体の境界情報を提供するエンドポイントを用意する。

  • 自治体コードをパラメータにしてgeojsonを返す。

shapefileのダウンロードからデータ加工までをオンメモリで実施。ポリゴンの境界線を加工(統合[dissolve]、簡略化[simplify])するところでは、GeoPandasを使いました。便利ですね。

諸々の処理を自動化することで、約1時間で日本の自治体(2024年1月時点で1788自治体)の境界データを取得・作成することができるようになった。以前は手作業でやっていたということなので、かなり楽になったと思う。次回は2025年に国勢調査があり、そのデータが公開されるのは2027年くらいかしら。そのときにまた、この機能が役に立つはずです。

e-Stat境界データ加工の課題

ポリゴンを加工するところで、どうにもうまく処理できないところがありました。それは「海部分」の除外。

  • e-Statで公開されているデータで「海」を特定する仕組みがない。
  • 地域名(S_NAME)がそれらしき名称になっている場合もあるけど統一されていない
     '水面', '水面調査区', '海面', '公有水面調査区', '公有水面',・・・
     「〜〜湾」「〜〜港」「〜〜湖」???
      ・・・このあたりで諦めました・・・
  • 完全に海を除外するには、個別対応が必要と判断した
    海と陸地が区別されていないケースもある。
    BODIKとしては「自動化」したいので、対応が難しい。

BODIK APIが提供する自治体境界のポリゴンに「海」が含まれている場合がありますので、ご了承ください。

自治体ポリゴン

BODIK APIでは、e-Statからダウンロードしたshapefileを加工して、geojsonとして記録しています。

このポリゴンAPIは、境界データをgeojson形式で返します。その「properties」には次のような情報がセットされています。


        "properties": {
            "KEY_CODE": "01000",      // 5桁の自治体コード
            "PREF": "01",             // 都道府県ID
            "CITY": "",               // 市区町村ID
            "S_AREA": "",             // 地域ID
            "PREF_NAME": "北海道",    // 都道府県名
            "CITY_NAME": "",          // 市区町村名
            "S_NAME": ""              // 地域名
        }

自治体ポリゴンを提供するAPI

BODIK APIの中に、自治体の境界データを取得できるエンドポイントを組み込みました。ぜひご利用ください。
BODIK APIのSwaggerをご覧ください。https://wapi.bodik.jp/docs/

下の方に「estat」というセクションがあります。ここにe-Stat関連のエンドポイントを用意しました。

BODIK APIのSwagger

/estat/polygon

「organ_code」で指定した自治体のポリゴンをgeojsonとして返します。
「organ_code」は6桁(5桁もOK)の自治体コードを指定してください。

例えば、「福岡市(自治体コード=401307)」のポリゴンは次のAPIで取得できます。

https://wapi.bodik.jp/estat/polygon?organ_code=401307

JavascriptでこのAPIを利用する場合は、次のようなコードになります。

        let url = "https://wapi.bodik.jp/estat/polygon?organ_code=401307";
        fetch(url)
        .then(response => response.json())
        .then(data => {
            // dataにgeojsonのデータがセットされる
            // show_geojson(data);
        });

通常の自治体コードの他に、2つの特別な「organ_code」が定義されています。

 japan     47都道府県の境界を指定する
 all_organ   日本の全自治体(2024年1月時点で1788自治体)の境界を指定する

/estat/organ

BODIK APIの「estat」で利用できる自治体情報の一覧を返します。
この中には日本の全自治体と政令指定都市の「区」の情報が含まれています。

/estat/organのサンプル

それぞれの自治体に関して、次のような情報を提供します。

    "dateAt": 2020,         // 国勢調査の実施年
    "organ_code": "010006",          // 自治体コード  
    "organ_name": "北海道",          // 自治体名称 
    "pref_name": "北海道",           // 都道府県名
    "is_pref": true,                 // 都道府県の場合、true
    "filename": "010006.geojson",    // ポリゴンのファイル名
    "downloaded": true,              // e-Statからダウンロードされている場合、true
    "kubun": "main"                  // 自治体の種別
                                     //  main  全国の自治体を表します。
                                     //  sub   政令指定都市の「区」を表します。

/estat/organ_code

自治体コードには5桁のものと6桁のものがあります。
6桁の場合、先頭5桁の数値から計算したチェックデジットが6桁目についています。

このエンドポイントは、指定した「organ_code」が5桁の場合、チェックデジットを計算して、6桁に整形して返します。

API利用サンプル:自治体ポリゴンのジグソーパズル

BODIK APIの自治体ポリゴン(/estat/polygon)の利用サンプルとしてジグソーパズルを作ってみました。
データがあればこんなこともできるんだ!というサンプルですね。お楽しみください。

自治体ポリゴンのジグソーパズル:https://wapi.bodik.jp/mapjigsaw_estat

  1. 起動すると、日本地図が表示されます。初期状態を「マップ」モードと呼びます。マップモードでは自治体のレベルを変更することができます。
  2. このアプリは3つのレベルで自治体境界を表示します。
    • 日本レベル
      アプリ起動時の日本地図。都道府県の境界を表示します。
    • 都道府県レベル
      日本レベルで任意の都道府県をクリックしてください。
      クリックされた都道府県にクローズアップし、その都道府県の自治体境界が表示されます。
    • 自治体レベル
      都道府県レベルで任意の自治体をクリックしてください。
      クリックされた自治体にクローズアップし、自治体の地域境界が表示されます。
      政令指定都市の場合、「区」境界が表示されます。「区」を選択すると、地域境界が表示されます。
  3. それぞれのレベルで自治体境界は「薄い青色」のポリゴンで表現されます。
    ポリゴンをクリックすると、下のレベルに遷移します。
      日本→都道府県→自治体
    ポリゴン以外をクリックすると、1つ前のレベルに戻ります。
      自治体→都道府県→日本
  4. それぞれのレベルで左上にある「パズル」ボタンを押すと「パズル」モードになります。
    表示中の自治体ポリゴンを「薄い赤色」のパーツとして、ジグソーパズルが始まり、タイマーがスタートします。
    面積が小さな領域は、(難しすぎたので)パズルの対象外として固定しています。
    「パズル」ボタンは「マップ」ボタンに変わります。
  5. ポリゴンパーツはマウスでドラッグすることができます。
    正しい場所にドラッグし、近くに来たらドロップしてください。ある程度近くで離すと、「カチッ」とハマります。
  6. 「マップ」ボタンを押すと、ジグソーパズルを終了し、マップモードに戻ります。

ひらの