Google Places APIを使用して特定のエリアのリストを取得し、CSVファイルに保存する方法について説明します。
必要な準備
- Google Maps APIキーの取得
- PHP環境の準備
- 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";
?>
コメント