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

Google Places APIを使用して特定のエリアのリストを取得し、CSVファイルに保存する方法について説明します。

必要な準備

  1. Google Maps APIキーの取得
  2. PHP環境の準備
  3. CSVファイルの書き込み権限の確認

指定可能なカテゴリ

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

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

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

コードの説明

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

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

// エリアの情報
$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";

// CSVファイルのパス
$csv_file = __DIR__ . '/places.csv';

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

// CSVファイルに書き込む
$fp = fopen($csv_file, 'w');
if ($fp === false) {
    die('ファイルを開けませんでした');
}

// ヘッダー行を書き込む
fputcsv($fp, ['name', 'address', 'lat', 'lng', 'rating', 'user_ratings_total', 'place_id', 'types', 'website', 'phone_number']);

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'];
                        fputcsv($fp, [
                            $place['name'],
                            $place['vicinity'],
                            $place['geometry']['location']['lat'],
                            $place['geometry']['location']['lng'],
                            $place['rating'] ?? 'N/A',
                            $place['user_ratings_total'] ?? 'N/A',
                            $place['place_id'] ?? 'N/A',
                            implode(", ", $place['types'] ?? []),
                            $website,
                            $phone_number
                        ]);
                    }
                }
            }

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

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

fclose($fp);

echo "全エリアのデータをCSVファイルに保存しました: $csv_file";
?>

関連記事

コメント

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