MySQL と PHP を使ってハヴァーサイン公式で距離を計算する方法
MySQL と PHP を使ってハヴァーサイン公式で距離を計算
準備
このチュートリアルを始める前に、以下のものが必要です。
- PHP がインストールされた Web サーバ
- MySQL データベース
- MySQL に接続できる PHP スクリプト
データベースの準備
まず、2つの地点の緯度と経度を保存するテーブルを作成する必要があります。以下の SQL クエリを実行して、locations
テーブルを作成できます。
CREATE TABLE locations (
id INT AUTO_INCREMENT PRIMARY KEY,
latitude DECIMAL(10,6) NOT NULL,
longitude DECIMAL(10,6) NOT NULL
);
次に、いくつかのサンプルデータを挿入します。
INSERT INTO locations (latitude, longitude) VALUES (45.5236, -122.6750);
INSERT INTO locations (latitude, longitude) VALUES (37.7749, -122.4194);
PHP スクリプト
以下の PHP スクリプトは、locations
テーブルから2つの地点の緯度と経度を取得し、ハヴァーサイン公式を使用して距離を計算します。
<?php
// MySQL への接続
$db = new PDO('mysql:host=localhost;dbname=test', 'root', '');
// 2つの地点の ID
$id1 = 1;
$id2 = 2;
// 緯度と経度を取得
$stmt = $db->prepare('SELECT latitude, longitude FROM locations WHERE id IN (:id1, :id2)');
$stmt->execute([':id1' => $id1, ':id2' => $id2]);
$rows = $stmt->fetchAll();
// ハヴァーサイン公式による距離計算
$earthRadius = 6371.01; // 地球の半径 (km)
$lat1 = $rows[0]['latitude'];
$lon1 = $rows[0]['longitude'];
$lat2 = $rows[1]['latitude'];
$lon2 = $rows[1]['longitude'];
$dLat = deg2rad($lat2 - $lat1);
$dLon = deg2rad($lon2 - $lon1);
$a = sin($dLat/2) * sin($dLat/2) + cos($lat1) * cos($lat2) * sin($dLon/2) * sin($dLon/2);
$c = 2 * asin(sqrt($a));
$distance = $earthRadius * $c;
// 結果を表示
echo "距離: {$distance} km";
?>
このスクリプトを実行すると、2つの地点間の距離がキロメートル単位で表示されます。
応用
このチュートリアルで学んだ知識を使って、さまざまなアプリケーションを作成することができます。
- 2つの都市間の距離を計算する旅行プランナー
- 近くのお店やレストランを見つけるロケーションサービス
- 配送料を計算する e コマースサイト
このチュートリアルでは、MySQL と PHP を使ってハヴァーサイン公式に基づいて距離を計算する方法を説明しました。この知識を使って、さまざまなアプリケーションを作成することができます。
<?php
// MySQL への接続
$db = new PDO('mysql:host=localhost;dbname=test', 'root', '');
// 2つの地点の ID
$id1 = 1;
$id2 = 2;
// 緯度と経度を取得
$stmt = $db->prepare('SELECT latitude, longitude FROM locations WHERE id IN (:id1, :id2)');
$stmt->execute([':id1' => $id1, ':id2' => $id2]);
$rows = $stmt->fetchAll();
// ハヴァーサイン公式による距離計算
$earthRadius = 6371.01; // 地球の半径 (km)
$lat1 = $rows[0]['latitude'];
$lon1 = $rows[0]['longitude'];
$lat2 = $rows[1]['latitude'];
$lon2 = $rows[1]['longitude'];
$dLat = deg2rad($lat2 - $lat1);
$dLon = deg2rad($lon2 - $lon1);
$a = sin($dLat/2) * sin($dLat/2) + cos($lat1) * cos($lat2) * sin($dLon/2) * sin($dLon/2);
$c = 2 * asin(sqrt($a));
$distance = $earthRadius * $c;
// 結果を表示
echo "距離: {$distance} km";
?>
HTML ファイル
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>距離計算</title>
</head>
<body>
<h1>距離計算</h1>
<p>
<?php
// PHP スクリプトの呼び出し
include 'distance.php';
?>
</p>
</body>
</html>
実行方法
- 上記のコードを
distance.php
とindex.html
というファイル名で保存します。 - Web サーバを起動し、
index.html
ファイルを開きます。 - ブラウザに表示される結果を確認します。
結果
ハヴァーサイン公式以外で距離を計算する方法
球面三角法は、球面上での距離を計算する方法です。ハヴァーサイン公式よりも複雑な計算になりますが、より精度の高い結果を得ることができます。
Vincenty の公式は、球面上での測地線距離を計算する方法です。ハヴァーサイン公式よりも精度の高い結果を得ることができますが、計算がより複雑になります。
Google Maps API を使用すると、2つの地点間の距離を簡単に計算することができます。ただし、API キーが必要になります。
その他のライブラリ
PHP には、距離計算用のライブラリがいくつかあります。これらのライブラリを使用すると、簡単に距離を計算することができます。
どの方法を使うべきかは、必要な精度と計算の複雑さのバランスによって異なります。
- 高精度な距離計算が必要で、計算の複雑さを許容できる場合は、球面三角法や Vincenty の公式を使用します。
- 簡単な距離計算が必要で、精度はそれほど重要ではない場合は、ハヴァーサイン公式を使用します。
- 非常に簡単に距離計算を行いたい場合は、Google Maps API やその他のライブラリを使用します。
php mysql great-circle