Google Places APIを使用して特定のエリアのリストを取得し、MySQLデータベースに保存する方法について説明します。
必要な準備
- Google Maps APIキーの取得
- PHP環境の準備
- 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 "全エリアのデータをデータベースに保存しました。";
?>
コードのポイント
- APIキーの定義:
define('GOOGLE_MAPS_API_KEY', 'YOUR_API_KEY_HERE');
でGoogle Maps APIキーを定義します。 - エリアの設定:
$locations
配列で取得したいエリアの緯度経度とズームレベルを設定します。この記事では、例として日本の主要な都市を設定しています。 - カテゴリの設定:
$types
配列で取得するカテゴリを指定します。この記事では、レストラン、パーク、ストアを例に挙げていますが、適宜変更可能です。 - MySQL接続:
PDO
を使ってMySQLデータベースに接続し、エラーハンドリングを行います。 - APIリクエスト:
file_get_contents($url)
でGoogle Places APIにリクエストを送り、取得したデータを処理します。 - 重複チェック:
if (!in_array($place['place_id'], $unique_places))
で重複を避けるためにチェックを行います。 - データベースの書き込み:
PDO::prepare
を使って取得したデータをMySQLデータベースに保存します。
コメント