🌟

WebFOCUSでBODIKオープンデータカタログに接続する

に公開

はじめに

BODIKオープンデータカタログから自治体が公表しているデータを参照します。
XLSX,CSV,API等の形式が利用できます。

https://odcs.bodik.jp/

手順

BODIK ODCSサイトから目的のデータを探す

alt text

自治体やデータの種類から検索できます。
今回は、居住地である大阪堺市の**【第18表】 男女,居住期間別人口-町丁・字等**を利用します。

https://data.bodik.jp/dataset/271403_/resource/58f40401-59ca-472d-b397-6be7c118ff8c

API接続情報を得る

堺市のオープンデータカタログサイトでは、この位置にデータAPIボタンがあります。

alt text

ボタンを押すとこのようにクエリのサンプルがあります。
alt text

WebFOCUSでBODIK接続を作成する

  • クエリ例 (最初の5件)のURL
    https://data.bodik.jp/api/3/action/datastore_search?resource_id=58f40401-59ca-472d-b397-6be7c118ff8c&limit=5
  • limit無しでも問題ない件数なので全件取得するURLを使用する
    https://data.bodik.jp/api/3/action/datastore_search?resource_id=58f40401-59ca-472d-b397-6be7c118ff8c
  • WebFOCUSでデータの取得 > データに接続 からREST選択
    alt text
  • 新規接続を選択
    alt text
  • RESTの接続を追加(全自治体の全データカタログで共通)
    alt text
    • 接続名: BODIK
    • ベースURL: https://data.bodik.jp/api/3/action/
    • セキュリティ: なし
    • プロファイルの選択: edasprof
  • テストに成功したら構成
  • 接続名:BOCIKが作成できていることを確認

シノニムを作成する

作成済の接続名(BODIK)からシノニムを作成します。

  • サービスURL拡張子: datastore_search
  • サービスURLパラメータ: resource_id=58f40401-59ca-472d-b397-6be7c118ff8c
  • フィールド名の確認:
  • ユニークフィールドにする:
  • アプリケーション: 任意のフォルダ
  • シノニム名: BODIK_SAKAI_Population1

レポートを作成

alt text

RESTアダプタで作成したシノニムを読み解く

BODIK_SAKAI_Population1.masの全文
BODIK_SAKAI_Population1.mas
FILENAME=M6ILO, SUFFIX=REST    , $
  SEGMENT=M6ILO, SEGTYPE=S0, $
   GROUP=HEADER, ALIAS=Header, ELEMENTS=1, $
    FIELDNAME=RESOURCE_ID, ALIAS=resource_id, USAGE=A36, ACTUAL=A36, ACCESS_PROPERTY=(NEED_VALUE),
      XDEFAULT='58f40401-59ca-472d-b397-6be7c118ff8c', $
    FIELDNAME=__RESPONSE, USAGE=TX80L, ACTUAL=TX, ACCESS_PROPERTY=(INTERNAL), $
  SEGMENT=RESPONSE, SEGTYPE=S0, SEGSUF=JSON    , PARENT=M6ILO, POSITION=__RESPONSE, $
    FIELDNAME=JSON_DUMMY_EL, ALIAS=JSON_DUMMY_EL, USAGE=A1, ACTUAL=A1, ACCESS_PROPERTY=(INTERNAL),
      PROPERTY=ELEMENT,  $
    FIELDNAME=HELP, ALIAS=help, USAGE=A66, ACTUAL=A66,
      REFERENCE=JSON_DUMMY_EL, PROPERTY=ELEMENT,  $
    FIELDNAME=SUCCESS, ALIAS=success, USAGE=A55, ACTUAL=A55,
      REFERENCE=JSON_DUMMY_EL, PROPERTY=ELEMENT,  $
    FIELDNAME=RESULT, ALIAS=result, USAGE=A1, ACTUAL=A1, ACCESS_PROPERTY=(INTERNAL),
      REFERENCE=JSON_DUMMY_EL, PROPERTY=ELEMENT,  $
    FIELDNAME=INCLUDE_TOTAL, ALIAS=include_total, USAGE=A55, ACTUAL=A55,
      REFERENCE=RESULT, PROPERTY=ELEMENT,  $
    FIELDNAME=LIMIT, ALIAS=limit, USAGE=P32, ACTUAL=A32,
      REFERENCE=RESULT, PROPERTY=ELEMENT,  $
    FIELDNAME=RECORDS_FORMAT, ALIAS=records_format, USAGE=A55, ACTUAL=A55,
      REFERENCE=RESULT, PROPERTY=ELEMENT,  $
    FIELDNAME=RESOURCE_ID1, ALIAS=resource_id, USAGE=A55, ACTUAL=A55,
      REFERENCE=RESULT, PROPERTY=ELEMENT,  $
    FIELDNAME=TOTAL_ESTIMATION_THRESHOLD, ALIAS=total_estimation_threshold, USAGE=A55, ACTUAL=A55,
      REFERENCE=RESULT, PROPERTY=ELEMENT,  $
    FIELDNAME=_LINKS, ALIAS=_links, USAGE=A1, ACTUAL=A1, ACCESS_PROPERTY=(INTERNAL),
      REFERENCE=RESULT, PROPERTY=ELEMENT,  $
    FIELDNAME=START, ALIAS=start, USAGE=A79, ACTUAL=A79,
      REFERENCE=_LINKS, PROPERTY=ELEMENT,  $
    FIELDNAME=NEXT, ALIAS=next, USAGE=A90, ACTUAL=A90,
      REFERENCE=_LINKS, PROPERTY=ELEMENT,  $
    FIELDNAME=TOTAL, ALIAS=total, USAGE=P32, ACTUAL=A32,
      REFERENCE=RESULT, PROPERTY=ELEMENT,  $
    FIELDNAME=TOTAL_WAS_ESTIMATED, ALIAS=total_was_estimated, USAGE=A55, ACTUAL=A55,
      REFERENCE=RESULT, PROPERTY=ELEMENT,  $
  SEGMENT=RECORDS, SEGTYPE=S0, PARENT=RESPONSE, $
    FIELDNAME=RECORDS, ALIAS=records, USAGE=A1, ACTUAL=A1, ACCESS_PROPERTY=(INTERNAL),
      REFERENCE=RESULT, PROPERTY=ELEMENT,  $
    FIELDNAME=_ID, ALIAS=_id, USAGE=P32, ACTUAL=A32,
      REFERENCE=RECORDS, PROPERTY=ELEMENT,  $
    FIELDNAME=男女, ALIAS=男女, USAGE=A55, ACTUAL=A55,
      REFERENCE=RECORDS, PROPERTY=ELEMENT,  $
    FIELDNAME=市区町村コード, ALIAS=市区町村コード, USAGE=P32, ACTUAL=A32,
      REFERENCE=RECORDS, PROPERTY=ELEMENT,  $
    FIELDNAME=町丁字コード, ALIAS=町丁字コード, USAGE=P32, ACTUAL=A32,
      REFERENCE=RECORDS, PROPERTY=ELEMENT,  $
    FIELDNAME=地域階層レベル, ALIAS=地域階層レベル, USAGE=P32, ACTUAL=A32,
      REFERENCE=RECORDS, PROPERTY=ELEMENT,  $
    FIELDNAME=秘匿処理, ALIAS=秘匿処理, USAGE=A55, ACTUAL=A55,
      REFERENCE=RECORDS, PROPERTY=ELEMENT,  $
    FIELDNAME=秘匿先情報, ALIAS=秘匿先情報, USAGE=A55, ACTUAL=A55,
      REFERENCE=RECORDS, PROPERTY=ELEMENT,  $
    FIELDNAME=合算地域, ALIAS=合算地域, USAGE=A55, ACTUAL=A55,
      REFERENCE=RECORDS, PROPERTY=ELEMENT,  $
    FIELDNAME=都道府県名, ALIAS=都道府県名, USAGE=A55, ACTUAL=A55,
      REFERENCE=RECORDS, PROPERTY=ELEMENT,  $
    FIELDNAME=市区町村名, ALIAS=市区町村名, USAGE=A55, ACTUAL=A55,
      REFERENCE=RECORDS, PROPERTY=ELEMENT,  $
    FIELDNAME=大字・町名, ALIAS=大字・町名, USAGE=A55, ACTUAL=A55,
      REFERENCE=RECORDS, PROPERTY=ELEMENT,  $
    FIELDNAME=字・丁目名, ALIAS=字・丁目名, USAGE=A55, ACTUAL=A55,
      REFERENCE=RECORDS, PROPERTY=ELEMENT,  $
    FIELDNAME=総数, ALIAS=総数, USAGE=A55, ACTUAL=A55,
      REFERENCE=RECORDS, PROPERTY=ELEMENT,  $
    FIELDNAME=出生時から, ALIAS=出生時から, USAGE=A55, ACTUAL=A55,
      REFERENCE=RECORDS, PROPERTY=ELEMENT,  $
    FIELDNAME=1年未満, ALIAS=1年未満, USAGE=A55, ACTUAL=A55,
      REFERENCE=RECORDS, PROPERTY=ELEMENT,  $
    FIELDNAME=1年以上5年未満, ALIAS=1年以上5年未満, USAGE=A55, ACTUAL=A55,
      REFERENCE=RECORDS, PROPERTY=ELEMENT,  $
    FIELDNAME=5年以上10年未満, ALIAS=5年以上10年未満, USAGE=A55, ACTUAL=A55,
      REFERENCE=RECORDS, PROPERTY=ELEMENT,  $
    FIELDNAME=10年以上20年未満, ALIAS=10年以上20年未満, USAGE=A55, ACTUAL=A55,
      REFERENCE=RECORDS, PROPERTY=ELEMENT,  $
    FIELDNAME=20年以上, ALIAS=20年以上, USAGE=A55, ACTUAL=A55,
      REFERENCE=RECORDS, PROPERTY=ELEMENT,  $
    FIELDNAME=居住期間「不詳」, ALIAS=居住期間「不詳」, USAGE=A55, ACTUAL=A55,
      REFERENCE=RECORDS, PROPERTY=ELEMENT,  $
  SEGMENT=FIELDS, SEGTYPE=S0, PARENT=RESPONSE, $
    FIELDNAME=FIELDS, ALIAS=fields, USAGE=A1, ACTUAL=A1, ACCESS_PROPERTY=(INTERNAL),
      REFERENCE=RESULT, PROPERTY=ELEMENT,  $
    FIELDNAME=ID, ALIAS=id, USAGE=A55, ACTUAL=A55,
      REFERENCE=FIELDS, PROPERTY=ELEMENT,  $
    FIELDNAME=TYPE, ALIAS=type, USAGE=A55, ACTUAL=A55,
      REFERENCE=FIELDS, PROPERTY=ELEMENT,  $
  1. M6ILOセグメント
    サービスURLパラメータを含む、リクエスト部分。
    アクセスファイル定義の情報と合わせてリクエストを生成しています。

    resource_idの初期値が"8f40401-59ca-472d-b397-6be7c118ff8c"に設定されていますが、
    このシノニムを利用する際にWHERE RESOURCE_ID EQ '別のリソースID'と指定することで他のパラメータを送信できます。
    クエリとしてselect文を送信する場合は、これを利用します。

  2. RESPONSEセグメント
    通常は利用しないデータです。
    データの取得が失敗した場合などはここに情報が現れますが直接レスポンスのJSONを確認した方が早いと思います。
    成功していればSUCCESSに"true"の文字が入ります。

  3. RECORDSセグメント
    データの欲しい部分ですね。
    フィールド名が使いにくい場合は、FIELDNAME=を変更しましょう!
    また、総数以下の項目は数字を文字型で表示しています。
    USAGE=を変更して数値として演算できるようにしておきましょう!

    - FIELDNAME=総数, ALIAS=総数, USAGE=A55, ACTUAL=A55,
    + FIELDNAME=総数, ALIAS=総数, USAGE=P20, ACTUAL=A55,
      REFERENCE=RECORDS, PROPERTY=ELEMENT,  $
    
  4. FIELDSセグメント
    項目IDと文字タイプを持っています。
    データ内容は以下のようになっていました。

    ID TYPE
    _id int
    男女 text
    市区町村コード numeric
    町丁字コード text
    地域階層レベル numeric
    秘匿処理 text
    秘匿先情報 text
    合算地域 text
    都道府県名 text
    市区町村名 text
    大字・町名 text
    字・丁目名 text
    総数 text
    出生時から text
    1年未満 text
    1年以上5年未満 text
    5年以上10年未満 text
    10年以上20年未満 text
    20年以上 text
    居住期間「不詳」 text

おわりに

自治体からAPIで公表されているデータも多く、折角公表してくれているので活用したいですね!
残念ながらAPIで公表されていなくてもCSVでダウンロードできるデータが多いので、http経由のシノニムを作成しましょう!

カタログサイトを探索中に市が作ってくれている詳細な市内のGeoJSONを見つけたので人口ヒートマップも作ってみたいですね!

Discussion