第2章:PostGIS 空間データベースと AI SQL 生成

もしキャンプ場が10箇所しかないなら、緯度経度をコードに直接書けば済みます。しかし、私たちには数百、数千もの車泊スポットがあります!ここではデータベースが必要です。しかも**「座標を処理できるデータベース」**が。 Supabaseでは、強力な PostGIS 拡張機能を有効にできます!

🎯 本章の目標

  1. SupabaseでPostGISを有効にする方法を学ぶ
  2. Vibe Promptを使ってAIにgeography形式を含むSQLスキーマを生成させる
  3. SQLで「範囲検索(例:半径50km以内の検索)」を実行する方法を理解する

🛠️ ステップ1:SupabaseでPostGISを有効化

  1. Supabase管理コンソールにログインし、プロジェクト(例:car_camping_db)を開く
  2. 左メニューの Database をクリック
  3. 上部の Extensions を��リック
  4. postgisを検索
  5. postgisのトグルを ON に切り替える

たったこれだけ!あなたのデータベースは強力な空間計算能力を手に入れました。

![PostGISを有効化]([SCREENSHOT_PLACEHOLDER: Supabase Extensions画面でpostgisを有効にするスクリーンショット])


🧠 ステップ2:Vibeで地理データテーブルスキーマを生成

次に、AIにテーブル作成を依頼します。Course 1とは異なり、PostGISを使用することを明確に伝えます。

[!TIP] Vibe Prompt(コピーしてAIに送信): 車泊マップアプリを開発中で、バックエンドにSupabaseを使用しています。PostGIS拡張は既に有効化済みです。 Supabase SQL Editorで実行できるテーブル作成SQLを書いてください: テーブル名:campsites 必要なカラム: 1. id (UUID、主キー) 2. name (テキスト、キャンプ場名) 3. description (テキスト、キャンプ場説明) 4. location (PostGISのgeography(Point, 4326)形式、緯度経度を保存) 5. created_at テストデータをINSERTする例(緯度経度をlocationカラムに変換する構文を含む)も教えてください。

AIは以下のような専門的なSQLを生成します:

-- テーブル作成
CREATE TABLE public.campsites (
  id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
  name TEXT NOT NULL,
  description TEXT,
  -- ここが重要!PostGISのgeography形式を使用
  location geography(Point, 4326) NOT NULL,
  created_at TIMESTAMPTZ DEFAULT NOW()
);

-- 空間検索を高速化するためGISTインデックスを作成
CREATE INDEX campsites_location_idx ON public.campsites USING GIST (location);

-- テストデータ挿入の例(ST_Pointは経度が先、緯度が後)
INSERT INTO public.campsites (name, description, location)
VALUES (
  '武陵農場キャンプ場', 
  '桜の名所として超有名', 
  ST_SetSRID(ST_Point(121.314, 24.364), 4326)::geography
);

[!WARNING] 緯度経度の順序に注意! AIは通常、PostGISのST_Point関数ではパラメータ順が(経度 Longitude, 緯度 Latitude)であり、一般的な「緯度経度」の順序ではないことを教えてくれます。これはよくあるミスですが、AIのリマインダーがあれば一発で正しく書けます!

![SQL実行]([SCREENSHOT_PLACEHOLDER: Supabaseで上記SQLを実行するスクリーンショット])


🔍 ステップ3:「近くのキャンプ場」を検索する方法

これがPostGISの真価を発揮する場面です。ユーザーの現在地が台北市中心部にある場合、50km圏内のキャンプ場だけを抽出するにはどうすればよいでしょうか? バックエンドで数学的な計算を書く必要はなく、AIとデータベースに任せればよいのです!

[!TIP] Vibe Prompt(AIへの質問): 上記のcampsitesテーブルがある場合、Supabase JS ClientまたはSQLで「特定の緯度経度(例:121.5, 25.0)から50km以内の全てのキャンプ場」を検索するクエリはどう書けばよいですか?

このクエリは将来のアプリケーションの中核機能となるため、まずはデータベース側で構文が正しいことを確認しましょう。

✅ 本章のまとめ

あなたは最先端の地理情報データベース(PostGIS)の設定を学び、たった2つのプロンプトで完了させました! 次の章では、これらのデータベース内の座標をSupabase APIでフロントエンドに取得し、地図上に美しいマーカーとして表示する方法を学びます!

章のまとめ

  • コアコンセプトと原理を理解
  • 実装方法とテクニックを習得
  • 一般的な問題と解決策に精通
  • 実際のプロジェクトに適用可能

さらに読む

  • 公式ドキュメントとAPIリファレンス
  • GitHubのオープンソース例
  • 技術書とオンラインコース
  • コミュニティディスカッションと技術ブログ

完全なチュートリアルをロック解除

このチャプターは有料コンテンツです。プロジェクトに参加して、10以上の神レベルのPromptや実際のソースコード例を含む、5000字以上の深い分析をロック解除してください!