Animal Incident Reporting System
獣害通報から管理・分析まで、AIで一気通貫に自動化する自治体向けプラットフォーム
2023年度のクマによる人身被害は219件と過去最悪を記録し、住宅地への出没も増加しています。 Tokyo OSS Party 2023 で獣害通報LINEアプリを開発・総合優勝したことをきっかけに、奥多摩町・青梅市・東京都環境局(大島キョン通報)への導入が実現しました。
導入先の自治体へのヒアリングから、電話通報だけでは解決できない 3つの壁 が浮かび上がりました。
| 壁 | 課題 |
|---|---|
| 1 | 電話通報の限界 -- 24時間対応が困難。聞き取りの質が担当者の経験に依存 |
| 2 | 通報管理の煩雑さ -- 紙ベースの管理、誤報の修正・削除作業 |
| 3 | 分析の困難 -- Excelで手動集計。傾向の把握に時間がかかる |
AIRS はこの悪循環を断ち切るために開発されました。
AIが判断を代替するのではなく、「判断の土台を整える」ことに徹する。
| AIが主導する領域 | 人間が主導する領域 |
|---|---|
| LINE対話形式の通報受付 | 対応方針の最終判断 |
| 画像解析・誤報フィルタリング | 現場対応(罠設置・パトロール) |
| データ分析・傾向把握 | 住民コミュニケーション |
住民がLINEから通報すると、AIが対話形式で状況を聞き取り、画像解析まで自動処理します。
flowchart LR
A["🐻 獣種選択 + 写真"] -->|獣種一致| B["🕐 日時入力"]
A -->|獣種不一致| A1["📷 再投稿"] --> A
B --> C["📍 位置情報"]
C -->|管轄内| D["💬 AI聞き取り"]
C -->|管轄外| C1["📌 再入力"] --> C
D --> E["✅ 確認・送信"] --> F["🔗 編集リンク送付"]
- Agentic Vision (Gemini 3 Flash) が写真をズーム・クロップして獣種を判定
- ジオフェンシングで管轄外の通報を自動フィルタリング
- 送信後にLINEへ編集リンクを送付(JWT認証でログイン不要)
通報受信から「判断の土台」が整うまでの自動処理:
flowchart LR
A["📩 通報受信"] --> B["📍 通報グループ\n近接通報を自動グループ化"]
B --> C["👤 担当者自動アサイン"]
C --> D["📊 管理画面で確認"]
- Spatial Intelligence: PostGISで半径500m以内 × 過去60分の通報を自動グループ化
- 担当者の地図上の担当地域ポイントから最近傍の職員を自動アサイン
- 通報の編集・削除、位置情報の修正、獣種の変更に対応
- 統計ダッシュボードで獣種別割合・通報推移・時間帯別傾向をリアルタイム表示
GIS空間分析とAIエージェントの統合:
| レイヤー | 用途 |
|---|---|
| Cluster | 通報マーカーの個別確認、密集エリアの自動クラスタリング |
| Heatmap | 通報密度をグラデーションで俯瞰 |
| Timeline | 時間軸スライダーで出没パターンをアニメーション再生 |
AI分析エージェント: チャットで質問するだけで、AIが地図のフィルター操作・SQLクエリ実行・周辺施設マッピングを自動実行します。
flowchart LR
A["💬 質問入力"] --> B["🤖 AI判断"]
B --> C["🔧 ツール実行"]
C --> D["📡 カスタムイベント"]
D --> E["🗺️ 地図更新"]
E -->|現在のフィルター状態| B
| Tool | 機能 |
|---|---|
searchReports |
通報の検索・フィルタリング。地図フィルターを更新し、場所指定時は地図も移動 |
runSql |
集計・統計クエリ (GROUP BY, COUNT等)。結果をテーブル表示 |
searchLandmarks |
Overpass API経由で周辺施設を検索し、地図上にマーカー表示 |
| 機能 | 概要 |
|---|---|
| システム設定 | ジオフェンシング、自動グループ化条件、対象獣種の追加・削除 |
| 職員管理 | 職員登録と担当地域ポイントの地図設定 |
| 施設管理 | 周辺の学校・公園を検索・登録。AI地図操作にも連携 |
| CSV一括インポート | 過去データの非同期一括取り込み |
| ヘルプチャットボット | 管理者・一般利用者向けの生成AIチャットボット |
同一のNext.jsコードベースから、環境変数 ADMIN_MODE の切り替えで2つのCloud Runサービスをデプロイしています。
| Category | Technology |
|---|---|
| Framework | Next.js 16 (App Router, Server Actions, React 19) |
| Language | TypeScript 5 |
| AI | Vercel AI SDK + Google Gemini (Agentic Vision) |
| Database | PostgreSQL + PostGIS, Prisma ORM |
| State | TanStack Query v5 (server), Jotai (client), nuqs (URL) |
| UI | Tailwind CSS 4, Digital Agency Design System, HeroUI |
| GIS | Leaflet + React Leaflet (Cluster / Heatmap / Timeline) |
| Messaging | LINE Messaging API |
| Infra | GCP (Cloud Run, Cloud SQL, Cloud Storage, Secret Manager) |
| IaC | OpenTofu |
| Dev Tools | Storybook 10, ESLint 9, Prettier, Husky |
- Node.js 24.11.0
- pnpm 10+
# Clone
git clone https://github.com/fooqoo/airs.git
cd airs
# Install dependencies
pnpm install
# Configure environment
cp .env.example .env
# Edit .env with your DATABASE_URL, GOOGLE_GENERATIVE_AI_API_KEY, etc.
# Generate Prisma client
pnpm run db:generate
# Start dev server
pnpm run devhttp://localhost:3000 でアプリケーションにアクセスできます。
macOS (nodenv)
brew install nodenv node-build
echo 'eval "$(nodenv init -)"' >> ~/.zshrc
source ~/.zshrc
nodenv install
nodenv rehashWindows (fnm)
winget install Schniz.fnm
# Add to PowerShell profile:
fnm env --use-on-cd | Out-String | Invoke-Expression
fnm install
fnm usecorepack enableOr via package manager: brew install pnpm (macOS) / winget install pnpm (Windows)
| Command | Description |
|---|---|
pnpm run dev |
Development server (localhost:3000) |
pnpm run build |
Production build |
pnpm run lint |
ESLint |
pnpm run storybook |
Storybook (localhost:6006) |
pnpm run db:generate |
Prisma client generation |
pnpm run db:push |
Push schema to database |
pnpm run db:studio |
Prisma Studio |
src/
├── app/ # Next.js App Router
│ ├── admin/ # 管理画面 (report, staff, facility, settings)
│ ├── ai-report/ # AI聞き取りシミュレーター
│ ├── help/ # ヘルプページ
│ ├── line/ # LINE連携ページ
│ ├── map/ # 地図ページ
│ ├── report/ # 通報ページ
│ └── api/ # Route Handlers (LINE webhook, analysis, health)
│
├── features/ # 機能モジュール
│ ├── admin/ # 管理画面ロジック
│ ├── admin-chatbot/ # 管理者向けチャットボット
│ ├── ai-report/ # AI聞き取り(ステップ式入力)
│ ├── analysis/ # AIデータ分析
│ ├── common/ # 共通ユーティリティ
│ ├── dashboard/ # 統計ダッシュボード
│ ├── event/ # 通報グループ管理
│ ├── facility/ # 施設検索・登録
│ ├── help-chatbot/ # ヘルプチャットボット
│ ├── line-bot/ # LINE連携
│ ├── map/ # GIS地図(レイヤー/拡張)
│ ├── report/ # 通報CRUD・一括操作
│ ├── staff/ # 職員管理
│ └── system-setting/ # システム設定
│
├── atoms/ # グローバル Jotai atoms
├── config/ # 設定ファイル
├── constants/ # 定数定義
├── styles/ # グローバルスタイル
├── types/ # 型定義
│
├── components/ # 共有UIコンポーネント
│ ├── ui/ # デザインシステムコンポーネント
│ └── layout/ # AppLayout, Sidebar
│
├── hooks/ # カスタム React フック
│ ├── mutations/ # TanStack Query mutations
│ ├── queries/ # TanStack Query queries
│ └── forms/ # Jotai フォームフック
│
└── server/ # バックエンド(DDD)
├── domain/ # エンティティ, 値オブジェクト, リポジトリI/F
├── application/ # ユースケース, DTO
└── infrastructure/ # Prismaリポジトリ, AI統合, LINE, Geo
prisma/ # データベーススキーマ
infra/ # GCP / OpenTofu 定義
PostgreSQL + PostGIS で空間データを管理しています。
主要テーブル: reports / events / event_reports / staffs / staff_locations / facilities / line_sessions / system_settings
Report, Event, StaffLocation, Facility は PostGIS の geometry(Point, 4326) カラムを持ち、ST_DWithin / ST_Distance による空間検索に対応しています。
一般向けのデモ環境を公開しています。京都府クマ目撃情報 (CC BY 4.0) のオープンデータを使用。
Web: https://airs.demo.dx-junkyard.com/
LINE: 以下のQRコードから友だち追加して通報を体験できます。
管理画面のデモを利用されたい方は、fooqoofooqoo56@gmail.com までご連絡ください。
dx-junkyard モンキーハンターチーム — Tokyo OSS Party 2023 総合優勝 → 奥多摩町・青梅市・東京都環境局への導入
| Name | Contributions | |
|---|---|---|
![]() |
FooQoo | プロジェクトリード、通報管理、インフラ |
![]() |
mutsu-6 | LINE聞き取りAI |
![]() |
yamamoto-ryuzo | AIマップ |
![]() |
Puchio | ロゴ作成、動画作成 |
![]() |
urashin | ビジョン・戦略 |
本リポジトリの main ブランチは、セキュリティ上の理由により、全履歴を squash した単一コミットで再構成しています。
本ソフトウェアを利用・再配布する際は、dx-junkyard の著作権表示を保持してください。詳細は LICENSE をご確認ください。





