このプロジェクトは、学校の授業の自由制作として開発した Web アプリケーションです。地図アプリケーション上でバス停の位置が不正確である問題を解決するために、交通局から配布されている公式の GTFS-JP(General Transit Feed Specification for Japan)データを活用し、全国の市営バス停の正確な位置情報をデジタルマップ上に表示します。
GTFS-JP は国土交通省が推奨する標準フォーマットであり、正確な停留所座標、路線情報、時間情報などが含まれています。このアプリケーションからユーザーはバス停の詳細情報を確認でき、各バス停に対してコメントを投稿・閲覧することで、より良いバス利用体験をサポートします。
問題起点:
- 既存の地図アプリケーションではバス停の位置が時々不正確である
- ユーザーが正確な停留所位置を把握しにくい
- 複数の非公式データソースを参照する必要がある
解決方法:
- 交通局から配布される公式の GTFS-JP データを直接インポート
- Leaflet & OpenStreetMap を使用したインタラクティブ地図表示
- ユーザーレビュー機能で停留所の詳細情報を共有
期待される効果:
- 正確なバス停位置情報の提供
- ユーザーの利用体験向上
- 地方交通システムのデジタル化推進
- ✅ ユーザー管理:ログイン・ログアウト機能
- ✅ バス停表示:バス停一覧と詳細ページ
- ✅ 地図表示:OpenStreetMap と Leaflet によるインタラクティブ地図表示
- ✅ GTFS-JP インポート:交通局の公式データを自動インポート
- ✅ コメント投稿:バス停ごとのコメント投稿機能
- ✅ コメント管理:コメント削除(投稿者のみ)
- ✅ セッション管理:ユーザーのセッション管理
- ✅ 入力検証:express-validator による入力値検証
- ✅ レスポンシブデザイン:モバイル対応 UI
- バックエンド:Node.js + Express.js
- データベース:SQLite + Prisma ORM
- テンプレートエンジン:EJS
- 認証:express-session
- 検証:express-validator
- 地図表示:Leaflet + OpenStreetMap(無料 API)
- CSS:カスタムスタイルシート
- フロントエンド:Vanilla JavaScript
{
"dependencies": {
"@prisma/client": "~6.0.1",
"cookie-parser": "~1.4.6",
"csv-parse": "^5.5.0",
"debug": "~4.3.4",
"ejs": "~3.1.9",
"express": "~4.18.2",
"express-session": "^1.18.2",
"express-validator": "^7.3.1",
"http-errors": "~2.0.0",
"morgan": "~1.10.0",
"prisma": "~6.0.1",
"sqlite": "^5.1.1",
"sqlite3": "^5.1.7"
}
}cd Final-issue
npm installGTFS-JPデータを使用してバス停データを自動インポートする場合:
- 名古屋市交通局の公式サイトからGTFS-JPデータをダウンロード
- ダウンロードしたZIPファイルを展開して
gtfs-jp/ディレクトリに配置 stops.txtファイルがgtfs-jp/stops.txtに存在することを確認
# ファイルが正しく配置されたか確認
ls -la gtfs-jp/stops.txt# Prismaマイグレーション実行
npx prisma migrate dev --name init
# GTFS-JPデータをインポート(gtfs-jp/stops.txt が配置されている場合)
node prisma/seed_gtfs.js# 開発環境での起動(nodemonを使用)
npm run dev
# または
npm startサーバーは http://localhost:3000 で起動します。
Final-issue/
├── app.js # メインアプリケーション
├── package.json # 依存関係定義
├── .env # 環境変数
├── bin/
│ └── www # サーバー起動スクリプト
├── prisma/
│ ├── schema.prisma # データベーススキーマ
│ ├── dev.db # SQLite データベースファイル
│ └── seed_gtfs.js # GTFS-JPデータインポートスクリプト
├── gtfs-jp/
│ └── stops.txt # GTFS-JPバス停データ
├── routes/
│ ├── index.js # ホームページルート
│ ├── users.js # ユーザー認証ルート
│ └── bus-stops.js # バス停・コメント管理ルート
├── views/
│ ├── error.ejs # エラーページ
│ ├── users/
│ │ └── login.ejs # ログインページ
│ └── bus-stops/
│ ├── list.ejs # バス停一覧ページ
│ └── detail.ejs # バス停詳細ページ
└── public/
├── stylesheets/
│ └── style.css # スタイルシート
└── javascripts/
├── map.js # 地図表示用スクリプト
└── comments.js # コメント処理スクリプト
現在、このアプリケーションはユーザー登録機能がなく、ログイン機能から始まっています。データベースへのユーザーの直接登録または管理ツールを使用してユーザーを追加する必要があります。
| カラム名 | 型 | 説明 |
|---|---|---|
| id | Int | 主キー(自動採番) |
| name | String | ユーザー名(ユニーク) |
| pass | String | パスワード |
| カラム名 | 型 | 説明 |
|---|---|---|
| id | Int | 主キー(自動採番) |
| stop_id | String | GTFS-JP の停留所 ID(ユニーク) |
| stop_name | String | 停留所名 |
| stop_lat | Float | 緯度 |
| stop_lon | Float | 経度 |
| stop_code | String? | 停留所コード(オプション) |
| stop_desc | String? | 説明(オプション) |
| platform_code | String? | のりば番号(オプション) |
| stop_url | String? | 停留所 URL(オプション) |
| createdAt | DateTime | 作成日時(自動生成) |
| updatedAt | DateTime | 更新日時(自動更新) |
| カラム名 | 型 | 説明 |
|---|---|---|
| id | Int | 主キー(自動採番) |
| userId | Int | ユーザー ID(外部キー) |
| busStopId | Int | バス停 ID(外部キー) |
| content | String | コメント内容 |
GET /- ホームページ表示
GET /users/login- ログインページPOST /users/login- ログイン処理GET /users/logout- ログアウト
GET /bus-stops- バス停一覧(地図表示付き)GET /bus-stops/:stop_id- バス停詳細(地図表示付き)POST /bus-stops/:stop_id/comments- コメント投稿DELETE /bus-stops/:stop_id/comments/:comment_id- コメント削除
このアプリケーションは完全に無料の APIを使用しています:
- OpenStreetMap:オープンソースの地図データ(ライセンス自由)
- Leaflet:軽量で無料の JavaScript 地図ライブラリ
✅ API キー不要 - 登録やクレジットカードなしで使用可能
✅ オフライン対応可能 - 将来的にキャッシュ機能の追加が可能
✅ 軽量 - 約 40KB の JS ライブラリ
✅ 高機能 - マーカー、ポップアップ、ズーム機能など完全装備
-
バス停一覧ページ - 全バス停を地図上に表示
- 全てのバス停がマーカーで表示
- マーカーをクリックで詳細ページへリンク
- 自動ズーム・パン機能で全バス停を表示
-
バス停詳細ページ - 個別バス停の地図表示
- バス停位置を中心に表示
- ポップアップでバス停情報を表示
- ズーム 15 倍のレベルで表示
- ホームページで「ログイン」ボタンをクリック
- ユーザー名とパスワードを入力
- 「ログイン」をクリック
- 「バス停一覧」をクリック
- バス停カードをクリックして詳細ページへ
- バス停詳細ページでコメントを入力
- 「投稿」ボタンをクリック
- コメントが表示されます
- 自分のコメント右側の「削除」ボタンをクリック
- 確認ダイアログで「OK」をクリック
npx prisma studio# マイグレーション履歴を表示
npx prisma migrate status
# 新しいマイグレーションを作成
npx prisma migrate dev --name <migration_name>このプロトタイプは開発学習目的のものです。本番環境での使用前に以下を実施してください:
⚠️ パスワードのハッシュ化(bcrypt など)⚠️ SQL インジェクション対策の強化⚠️ XSS 対策の実装⚠️ CSRF 保護の追加⚠️ HTTPS の使用⚠️ 環境変数の適切な管理
PORT=3001 npm start# 全データを削除して再初期化
npx prisma migrate resetnpx prisma generate❌ GTFS-JPインポートエラー: CSV parsing error
原因: ファイルのエンコーディングが UTF-8 でない
対応: テキストエディタで UTF-8 に変換して保存
原因: GTFS-JP ファイルが見つからない
対応: gtfs-jp/stops.txt が正しく配置されているか確認してください
- Express.js Documentation
- Prisma Documentation
- EJS Documentation
- GTFS-JP Specification
- Leaflet Documentation
- OpenStreetMap
このプロジェクトは学習目的で作成されました。
最終更新: 2026 年 3 月 10 日