👶

(AIに手伝ってもらって)AEDマップをベースに子ども施設マップを作る

に公開

はじめに

シビックテック任意団体 Code for OYAMA (栃木県小山市) の石橋です。
前回作った「おやまAEDマップ」をベースに「おやま子ども施設マップ」を作ってみました。こちらも栃木県小山市が提供しているオープンデータを利用しています。

プロジェクト概要

開発背景

小山市がオープンデータカタログとして公開しているオープンデータのなかでおやまAEDマップで利用したもの以外にも緯度経度情報を含んだものがいくつもあります。そのうちの子ども施設情報(保育所、幼稚園、こども園など)を使ってマップアプリを作っていきます。

おやまAEDマップのプロジェクトはある程度のプログラミング知識があれば他のマップへの応用が容易にできるように構成されています。今回はAIを利用したバイブコーディングを念頭にその手順を説明します。
元のおやまAEDマップの機能や利用方法については前回の記事を参照して下さい。

移行手順

今回はAIエージェントを利用してコードを修正していきます。ここではClaude Codeを利用していますが、エージェント機能を持つのであればGitHub Copilotなど他の環境でも同じように移行作業をできるかと思います。

1. 全体ファイル構成

www/
├── index.php☆                   # 📍 メインページ
├── facility_detail.php☆         # 📄 施設詳細ページ
├── login.php☆                   # 🔐 管理者ログイン
├── admin.php★                   # 🛠️ 管理者ダッシュボード
├── admin_add.php★               # ➕ 新規施設登録
├── admin_edit.php★              # ✏️ 施設編集
├── admin_password.php☆          # 🔑 パスワード変更
├── admin_export_csv.php☆        # 📊 CSV エクスポート
├── auth_check.php☆              # 🔒 認証・セキュリティ
├── api_facilities.php★          # 🔌 施設情報API
├── init_db.php★                 # 🗄️ データベース初期化
├── facility_form_functions.php★ # 🔧 共通フォーム処理
├── css/
│   ├── common.css               # 🎨 共通スタイル
│   ├── admin.css                # 🎨 管理画面用CSS
│   └── main.css                 # 🎨 メインページ用CSS
├── license/                     # 📄 ライセンス情報
└── facility_images/             # 🖼️ 画像保存ディレクトリ(自動作成)

app_db/oyama_child_facilitation_map/★ # 🔒 Web外ディレクトリ
├── config.php★                  # ⚙️ 設定ファイル
└── facilities.db★               # 🗄️ SQLiteデータベース

(凡例)
★:構造的に異なる箇所があり、フィールドや項目数・内容が違うため変更時は注意が必要です。
☆:主にWeb表記や名称のみの差分で、構造やロジックはほぼ同じです。

全体のファイル構成は上記の通り。
これらのファイルをどのような手順で書き換えていけば良いのかを説明していく。

2. 設定ファイルの変更

このプロジェクトには 設定ファイル(config.php があり、アプリの名称や表示に関する部分、DBのテーブル構成、CSVインポート構成など基本的な部分はこのファイルを書き換えることで対応できるようになっています。

config.php データベース設定例抜粋
    // データベース設定
    'database' => [
        'path' => __DIR__ . '/facilities.db',
        'tables' => [
            'facilities' => [
                'columns' => [
                    'id' => 'INTEGER PRIMARY KEY AUTOINCREMENT',
                    'csv_no' => 'TEXT',  // CSVの識別番号
                    'name' => 'TEXT NOT NULL',  // 名称
config.php アプリケーション設定例抜粋
    // アプリケーション設定
    'app' => [
        'name' => 'おやま子ども施設マップ',
        'version' => '1.0.0',
        'timezone' => 'Asia/Tokyo',
        'facility_name' => '子育て支援施設',  // 施設の呼称
        'categories' => [
            '認可公立保育所',
            '認可私立保育所',

そのため、まずこのファイルを概要としてまとめ、AIにこれを参照してもらいながらその他のファイルを更新していくと不整合が起きにくいと思います。
とはいえ、このファイルをきちんと書いていくのは骨が折れます。ですが今回のように元々あるCSVデータを用意できるのであれば簡単にAIに更新を依頼できます。

  1. 小山市が提供しているオープンデータ(CSVファイル)をダウンロードして、プロジェクトに加えます。(今回は「子育て施設_小山市オープンデータ_UTF-8.csv」というファイル名にしました)
  2. AIに次のように依頼します。
AI Script
現在のoyama_aed_map(おやまAEDマップ)をベースに
oyama_child_facilitation_map(おやま子ども施設マップ)を作成していきます。
まずapp_db/oyama_child_facilitation_map/config.phpを修正してdbのテーブル構成やアプリの全体像を
カスタマイズしてください。他のファイルは変更しないでください。
「子育て施設_小山市オープンデータ_UTF-8.csv」を参照してください。
カテゴリについてはcsvの「種別」フィールドを元に作成するつもりです。

わりと雑な指示だとは思いますが、これだけでかなりいい感じに修正を加えてくれます。最後のカテゴリというのは、マップ表示の際にマーカーの色や表示/非表示を切り替えるためのものなのですが、今回はCSVファイルに「種別」フィールドあるのでそれをそのまま使います。
ちなみにおやまAEDマップの時にはCSVインポート時に施設名称からカテゴリを自動生成する特殊な処理が入っていました。

3. データベース生成部の変更

次にデータベースを生成するinit_db.phpを変更します。こちらは以下の3つの機能を持ったファイルです。

  1. データを残したままテーブル構成を変更
  2. データを全削除してサンプルデータを書き込む
  3. データを全削除してCSVファイルをアップロードしてインポートする

これらをあらためて明確に指示します。そうしないと勝手に機能を省かれたり、要らない機能を追加されてしまったりしたことがありました。

AI Script
このconfig.phpの構成に基づいてinit_db.phpを書き換えてください。
機能はこれまで通り以下の3つ。
1. データを残したままテーブル構成だけを変更する。
2. データを全て削除してサンプルデータを格納する。
3. データを全て削除してアップロードされたCSVファイルを読み込む。

4. データベースから読み出し

この時点でデータベースの生成までできるのですが、入れたデータを読み出さなくては確認出来ません。api_facilities.phpを呼び出すと以下のようにデータベースの内容を読み出すことができるのでここを実装しておくことで書き込みと読み出しの整合性をAIに確認してもらえます。

api_facilities.php実行結果
[
    {
        "id": 1,
        "csv_no": "0107000001",
        "name": "やはた保育所",
        "name_kana": "ヤハタホイクショ",
        "lat": 36.308707,
        "lng": 139.797489,
        "address": "栃木県小山市八幡町2-8-8",
        "address_detail": "",
        "installation_position": "",
        "phone": "(0285)21-2725",
        "phone_extension": "",
        "corporate_number": "",
        "organization_name": "",
        "available_days": "満2か月から",
        "start_time": "07:30",
        "end_time": "19:30",
        "available_hours_note": "日曜・祝祭日・年末年始はお休み。",
        "pediatric_support": "有",
        "website": "",
        "note": "",
        "category": "認可公立保育所",
        "images": []
    },
    {
        "id": 2,
        "csv_no": "0107000002",
        "name": "桑保育所",
        "name_kana": "クワホイクショ",
AI Script
構成したデータベースからデータを読み出すapi_facilities.phpを更新してください。

これでデータベースの格納データが読み出せます。ただしデータベース内に公開できない情報(個人情報など)がある場合にはそれらを除くようにする必要があります。

5. データベースの書き込み読み出し確認

ターミナルからPHPサーバーを起動してローカルで動作確認をします。

terminal PHPサーバー起動
oyama_child_facilitation_map % php -s localhost:8000

ブラウザからlocalhost:8000/login.phpでログインします。ログインパスワードはconfig.phpに記述してあるadmin123(初期値)です。
ログインすると管理画面であるadmin.phpが表示されますがこのファイルはまだ修正していないので表示が乱れたりしていると思います。一旦無視してください。
次にブラウザからlocalhost:8000/init_db.phpでデータベース初期化機能を表示します。ここでCSVファイルをアップロードして読み込みます。正常に完了すればCSVファイルを元にしたデータベースファイル(app_db/oyama_child_facilitation_map/facilities.db)が生成されています。

AI Script
api_facilities.phpを利用し生成されたDBと元のCSVを比較して問題がないか確認してください

上記のようにAIに指示して問題のないことを確認します。

6. マップ表示

ここまでくればあとはマップ表示に関する部分を修正するだけで一般ユーザー向けの実装が完成します。

AI Script
index.phpとfacility_detail.phpを修正してマップ表示をしてください。

とても雑な指示ですがここまでであらかた必要な構成や情報は組み上がっているので、これだけの指示でもいい感じに仕上げてくれます。
一般ユーザが利用する場面なので実際にブラウザから localhost:8000/index.php と表示して不整合などないかよく確認する必要があります。問題があれば手作業でコードを修正するかAIに細かく依頼しましょう。

7. 管理者機能

これまでの構成に問題がなければ、管理者機能についても簡単な指示で修正できるはずです。

AI Script
管理者機能に関する部分で必要な修正をしてください。

こんな感じでいけると思いますが、不整合がでるようであればいったん修正を元に戻してもらってから修正するファイルを細かく刻んで指示いくと良いと思います。
極個人的な印象ですがAIによるバイブコーディングの場合、ある程度の構成が決まってくるまでは細かく刻んで指示を出して、あらかた概略が決まってきたらわりと雑な指示でも上手いことやってくれる気がします。

まとめ

本記事では、既存の「おやまAEDマップ」をベースに、オープンデータを活用して「おやま子ども施設マップ」を効率的に構築する手順を紹介しました。
設定ファイルやデータベース構成のカスタマイズ、AIエージェントを活用したバイブコーディングによる移行作業、マップ表示や管理機能の修正など、実践的なノウハウをまとめています。
同様のマップシステムを作成したい方や、AIを活用した開発プロセスに興味がある方の参考になれば幸いです。


プロジェクト情報:

Discussion