MySQL と PHP を使ってハヴァーサイン公式で距離を計算する方法

2024-04-02

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>

実行方法

  1. 上記のコードを distance.phpindex.html というファイル名で保存します。
  2. Web サーバを起動し、index.html ファイルを開きます。
  3. ブラウザに表示される結果を確認します。

結果




ハヴァーサイン公式以外で距離を計算する方法

球面三角法は、球面上での距離を計算する方法です。ハヴァーサイン公式よりも複雑な計算になりますが、より精度の高い結果を得ることができます。

Vincenty の公式は、球面上での測地線距離を計算する方法です。ハヴァーサイン公式よりも精度の高い結果を得ることができますが、計算がより複雑になります。

Google Maps API を使用すると、2つの地点間の距離を簡単に計算することができます。ただし、API キーが必要になります。

その他のライブラリ

PHP には、距離計算用のライブラリがいくつかあります。これらのライブラリを使用すると、簡単に距離を計算することができます。

どの方法を使うべきかは、必要な精度と計算の複雑さのバランスによって異なります。

  • 高精度な距離計算が必要で、計算の複雑さを許容できる場合は、球面三角法や Vincenty の公式を使用します。
  • 簡単な距離計算が必要で、精度はそれほど重要ではない場合は、ハヴァーサイン公式を使用します。
  • 非常に簡単に距離計算を行いたい場合は、Google Maps API やその他のライブラリを使用します。

php mysql great-circle


【データベース管理者向け】SHOW PROCESSLIST でデータベースのパフォーマンスを最適化する

MySQL の SHOW PROCESSLIST コマンドは、現在実行中のすべてのスレッドに関する情報を表示します。この情報は、パフォーマンスの問題を診断したり、長時間実行されているクエリを特定したりするのに役立ちます。問題SHOW PROCESSLIST はデフォルトではクエリの一部しか表示しません。詳細な情報を見るには、いくつかの方法があります。...


データベースチューニングで迷ったら?MySQLとMariaDB、それぞれの長所と短所を徹底解説!

それぞれの長所と短所を理解し、状況に合わせて最適なデータベースを選択することが重要です。パフォーマンスベンチマークテストでは、MariaDBの方がMySQLよりも高速な結果が出る場合が多いです。しかし、実際の性能は、ワークロードやハードウェア、設定などによって大きく左右されます。...


NoSQLデータベースとNewSQLデータベースにおけるシャード化とパーティショニング

データベースの規模が大きくなると、パフォーマンスやスケーラビリティの問題が発生する可能性があります。これらの問題に対処するために、データベースシャード化とデータベースパーティショニングという2つの技術があります。データベースシャード化とは、データを複数の独立したデータベースサーバー(シャード)に分散させる技術です。一方、データベースパーティショニングとは、データを論理的に複数のグループ(パーティション)に分割し、同じサーバー上に保存する技術です。...


Docker AlpineでDjango + MySQL: エラー「No module named 'MySQLdb'」を解決する

Docker Alpine環境でDjangoアプリケーションを実行する際に、MySQLdbモジュールの読み込みエラーが発生することがあります。これは、Alpine Linuxが軽量化のためにデフォルトで一部の開発ツールやライブラリを含んでいないことが原因です。...