🎱

TypeScriptでRESAS-APIの都道府県データを利用する。

2024/07/21に公開

以前、TypeScriptでRESAS-APIを利用する方法について書きました。

https://zenn.dev/uruhayato373/articles/611aa2c7ffe51c

この記事では、RESAS(地域経済分析システム)APIからデータを取得し、e-Stat APIで使用できる形式に変換する方法について書きます。

1. 基本構造

まず、モジュールの全体構造を見てみましょう。

import regionsData from 'utils/prefecture/regions.json'
import handleResasAPI from 'utils/resas'

// インターフェース定義
export interface ResasPrefectureType { ... }
export interface PrefectureType { ... }
export interface RegionPrefectureType { ... }

// メイン関数
const handlePrefecture = () => { ... }

// ヘルパー関数
const fetchItems = async (): Promise<PrefectureType[]> => { ... }
const findItem = async (prefCode: string): Promise<PrefectureType | undefined> => { ... }
const fetchRegions = async (): Promise<RegionPrefectureType[]> => { ... }

export default handlePrefecture

このモジュールは、都道府県データの取得、検索、地方ごとの整理などの機能を提供します。

2. インターフェースの定義

3つの主要なインターフェースを定義しています:

export interface ResasPrefectureType {
  prefCode: number
  prefName: string
}

export interface PrefectureType {
  prefCode: string
  prefName: string
}

export interface RegionPrefectureType {
  name: string
  prefectures: PrefectureType[]
}
  • ResasPrefectureType: RESAS APIから直接取得するデータの形式
  • PrefectureType: アプリケーション内で使用する都道府県データの形式(都道府県コードを5桁の文字列として扱う)
  • RegionPrefectureType: 地方と所属する都道府県のデータ形式

注目すべき点は、ResasPrefectureTypeprefCodenumber型であるのに対し、PrefectureTypeprefCodestring型になっていることです。これは、e-Stat APIで使用されるareaCodeが文字列形式(例:'28000')であるためです。

3. メイン関数:handlePrefecture

const handlePrefecture = () => {
  return {
    fetchItems: async () => await fetchItems(),
    findItem: async (prefCode: string) => await findItem(prefCode),
    fetchRegions: async () => await fetchRegions(),
  }
}

この関数は、都道府県データを操作するための3つの非同期関数を提供するオブジェクトを返します。

4. データ取得と変換:fetchItems

const fetchItems = async (): Promise<PrefectureType[]> => {
  try {
    const resasParams = { url: 'api/v1/prefectures' }
    const { fetchAPI } = handleResasAPI<ResasPrefectureType[]>(resasParams)

    const prefectures = await fetchAPI()

    return prefectures.map((d) => ({
      prefCode: String(d.prefCode).padStart(2, '0') + '000',
      prefName: d.prefName,
    }))
  } catch (error) {
    console.error('都道府県データの取得中にエラーが発生しました:', error)
    throw error
  }
}

この関数は以下の手順で動作します:

  1. RESAS APIのエンドポイントを指定
  2. handleResasAPI関数を使ってAPIリクエストを行う
  3. 取得したデータをPrefectureTypeの形式に変換
    • ここで重要なのは、prefCodeの変換です。RESAS APIから取得した数値型のprefCode(例:28)を、e-Stat APIで使用される文字列型のareaCode(例:'28000')に変換しています。
    • String(d.prefCode).padStart(2, '0') + '000'という処理で、2桁の数字を5桁の文字列に変換しています。
  4. エラーハンドリングを行い、エラーメッセージを日本語で出力

5. データ検索:findItem

const findItem = async (
  prefCode: string
): Promise<PrefectureType | undefined> => {
  try {
    const prefectures = await fetchItems()
    return prefectures.find((f) => f.prefCode === prefCode)
  } catch (error) {
    console.error('都道府県の検索中にエラーが発生しました:', error)
    throw error
  }
}

この関数は、指定された都道府県コード(e-Stat API形式)に一致する都道府県データを検索します。

6. 地方ごとのデータ取得:fetchRegions

const fetchRegions = async (): Promise<RegionPrefectureType[]> => {
  try {
    const prefectures = await fetchItems()
    const prefectureMap = new Map(prefectures.map((p) => [p.prefName, p]))

    return regionsData.map((region) => ({
      name: region.name,
      prefectures: region.prefectures
        .map((prefName) => prefectureMap.get(prefName))
        .filter((pref): pref is PrefectureType => pref !== undefined),
    }))
  } catch (error) {
    console.error('地方データの取得中にエラーが発生しました:', error)
    throw error
  }
}

この関数は、regionsDataを使用して地方ごとの都道府県データを生成します。regionsDataは以下のような構造になっています:

[
  {
    "name": "北海道・東北",
    "prefectures": ["北海道", "青森県", "岩手県", "秋田県", "宮城県", "山形県", "福島県"]
  },
  {
    "name": "関東",
    "prefectures": ["東京都", "神奈川県", "埼玉県", "千葉県", "茨城県", "栃木県", "群馬県"]
  },
  // ... 他の地方のデータ ...
]

この構造により、日本の都道府県を6つの主要な地方にグループ化しています。fetchRegions関数は、このデータを利用して地方ごとの都道府県リストを生成します。

まとめ

このモジュールを使用することで、RESAS APIから取得した都道府県データをe-Stat API用に変換し、効率的に管理できます。主な特徴は以下の通りです:

  1. TypeScriptの型システムを活用したコードの安全性と可読性の向上
  2. RESAS APIからのデータ取得とe-Stat API用のデータ形式への変換
  3. 都道府県コードによる検索機能
  4. 地方ごとの都道府県グループ化
  5. エラーハンドリングの実装と日本語でのエラーメッセージ出力

このモジュールは、RESAS APIとe-Stat APIを併用する地域データ分析アプリケーションの開発に特に有用です。例えば、地域経済分析、人口統計調査、選挙結果分析など、幅広い分野で活用できるでしょう。

運用中のサイト

実際に、RESAS APIとe-Stat APIを利用したサイトを開発・運用しています。

https://statistics-japan.com/population/total-population/prefecture/28000

Discussion