PHP | Google Places APIを利用してリストを取得しMySQLに保存する方法

Google Places APIを使用して特定のエリアのリストを取得し、MySQLデータベースに保存する方法について説明します。

必要な準備

  1. Google Maps APIキーの取得
  2. PHP環境の準備
  3. MySQLデータベースの設定

指定可能なカテゴリ

Google Places APIでは、さまざまなカテゴリの場所を検索することができます。以下は指定可能なカテゴリの一部です。

  • restaurant (レストラン)
  • park (公園)
  • store (店舗)
  • atm (ATM)
  • bank (銀行)
  • cafe (カフェ)
  • hospital (病院)
  • school (学校)
  • shopping_mall (ショッピングモール)

詳細なカテゴリリストについては、Google Places APIのドキュメントをご参照ください。

コードの説明

以下のコードを get-places.php というファイルに保存し、実行します。

MySQLテーブルの設定

まず、以下のようにMySQLデータベースにテーブルを作成します。

CREATE TABLE places (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    address VARCHAR(255) NOT NULL,
    lat DOUBLE NOT NULL,
    lng DOUBLE NOT NULL,
    rating DOUBLE,
    user_ratings_total INT,
    place_id VARCHAR(255) NOT NULL UNIQUE,
    types VARCHAR(255),
    website VARCHAR(255),
    phone_number VARCHAR(50)
);

PHPコード

次に、PHPコードを以下のように記述します。

<?php
define('GOOGLE_MAPS_API_KEY', 'YOUR_API_KEY_HERE'); // APIキー

// MySQL接続設定
$servername = "localhost";
$username = "your_username";
$password = "your_password";
$dbname = "your_database";

try {
    $pdo = new PDO("mysql:host=$servername;dbname=$dbname;charset=utf8", $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die("接続に失敗しました: " . $e->getMessage());
}

// エリアの情報
$locations = [
    'example1' => ['title' => 'エリア1', 'lat' => 34.701909, 'lng' => 135.510016, 'zoom' => 16],
    'example2' => ['title' => 'エリア2', 'lat' => 35.689487, 'lng' => 139.691711, 'zoom' => 16],
    'example3' => ['title' => 'エリア3', 'lat' => 35.011564, 'lng' => 135.768149, 'zoom' => 16],
];

// 取得するカテゴリ
$types = ['restaurant', 'park', 'store']; // 適宜変更してください

// Google Places APIエンドポイント
$endpoint_url = "https://maps.googleapis.com/maps/api/place/nearbysearch/json";

// 重複チェック用の配列
$unique_places = [];

foreach ($locations as $key => $location) {
    foreach ($types as $type) {
        $next_page_token = null;
        do {
            // APIリクエストのパラメータ
            $params = [
                'location' => "{$location['lat']},{$location['lng']}",
                'radius' => 1500,  // 半径(メートル)
                'type' => $type,
                'language' => 'ja',  // 日本語での情報を取得
                'key' => GOOGLE_MAPS_API_KEY,
                'pagetoken' => $next_page_token
            ];

            // パラメータをURLに付加
            $url = $endpoint_url . '?' . http_build_query($params);

            // APIにリクエストを送信
            $response = file_get_contents($url);
            $places = json_decode($response, true);

            // 結果からデータを抽出
            $places_results = $places['results'];

            // 詳細情報の取得
            foreach ($places_results as $place) {
                // place_idを使って重複をチェック
                if (!in_array($place['place_id'], $unique_places)) {
                    $place_id = $place['place_id'];
                    $details_url = "https://maps.googleapis.com/maps/api/place/details/json?placeid=$place_id&key=" . GOOGLE_MAPS_API_KEY;
                    $details_response = file_get_contents($details_url);
                    $details = json_decode($details_response, true);
                    $website = $details['result']['website'] ?? 'N/A';
                    $phone_number = $details['result']['formatted_phone_number'] ?? 'N/A';

                    // 指定したカテゴリに該当するかチェック
                    $found_type = false;
                    foreach ($place['types'] as $place_type) {
                        if (in_array($place_type, $types)) {
                            $found_type = true;
                            break;
                        }
                    }

                    if ($found_type) {
                        $unique_places[] = $place['place_id'];

                        // データベースに保存
                        $stmt = $pdo->prepare("INSERT INTO places (name, address, lat, lng, rating, user_ratings_total, place_id, types, website, phone_number)
                                                VALUES (:name, :address, :lat, :lng, :rating, :user_ratings_total, :place_id, :types, :website, :phone_number)");
                        $stmt->execute([
                            ':name' => $place['name'],
                            ':address' => $place['vicinity'],
                            ':lat' => $place['geometry']['location']['lat'],
                            ':lng' => $place['geometry']['location']['lng'],
                            ':rating' => $place['rating'] ?? null,
                            ':user_ratings_total' => $place['user_ratings_total'] ?? null,
                            ':place_id' => $place['place_id'],
                            ':types' => implode(", ", $place['types'] ?? []),
                            ':website' => $website,
                            ':phone_number' => $phone_number
                        ]);
                    }
                }
            }

            // 次のページのトークンを取得
            $next_page_token = $places['next_page_token'] ?? null;

            // APIの制限のため、次のリクエストの前に少し待つ
            if ($next_page_token) {
                sleep(2);
            }
        } while ($next_page_token);
    }
}

echo "全エリアのデータをデータベースに保存しました。";
?>

コードのポイント

  1. APIキーの定義: define('GOOGLE_MAPS_API_KEY', 'YOUR_API_KEY_HERE'); でGoogle Maps APIキーを定義します。
  2. エリアの設定: $locations 配列で取得したいエリアの緯度経度とズームレベルを設定します。この記事では、例として日本の主要な都市を設定しています。
  3. カテゴリの設定: $types 配列で取得するカテゴリを指定します。この記事では、レストラン、パーク、ストアを例に挙げていますが、適宜変更可能です。
  4. MySQL接続: PDO を使ってMySQLデータベースに接続し、エラーハンドリングを行います。
  5. APIリクエスト: file_get_contents($url) でGoogle Places APIにリクエストを送り、取得したデータを処理します。
  6. 重複チェック: if (!in_array($place['place_id'], $unique_places)) で重複を避けるためにチェックを行います。
  7. データベースの書き込み: PDO::prepare を使って取得したデータをMySQLデータベースに保存します。

関連記事

コメント

タイトルとURLをコピーしました