はじめに
空間データを扱うGeometryを利用して、地点間の距離を求めます。
具体的には、複数の駅の位置情報のはいったレコードから、現在地までの距離をメートル単位で取得する方法を記します。
Geometryに関するリファレンスはこちら
https://dev.mysql.com/doc/refman/8.0/ja/gis-class-geometry.html
テーブルの作成
駅の緯度経度情報を扱う簡単なテーブルを作成します。
CREATE TABLE `test` (
`name` VARCHAR(30) NOT NULL,
`longitude` double NOT NULL,
`latitude` double NOT NULL,
`location` GEOMETRY NOT NULL
) ENGINE=InnoDB;
緯度経度の挿入
テストデータとして、東京駅・渋谷駅・新宿駅の位置情報データを挿入します。
INSERT INTO `test` (`name`, `longitude`, `latitude`, `location`)
VALUES ('東京駅', 139.766851323989, 35.680877404701704, ST_GeomFromText('POINT(139.766851323989 35.680877404701704)')),
('渋谷駅', 139.70140081816402, 35.658751305090604, ST_GeomFromText('POINT(139.70140081816402 35.658751305090604)')),
('新宿駅', 139.700891636702, 35.689808778606704, ST_GeomFromText('POINT(139.700891636702 35.689808778606704)'));
ちなみに、longitude, latitudeのカラムがなくても、以下のようにlocationから緯度経度を取り出すことも可能です。
mysql> SELECT X(location), Y(location) FROM `test` WHERE `id` = 1;
+---------------------+---------------------+
| X(location) | Y(location) |
+---------------------+---------------------+
| 139.766851323989 | 35.680877404701704 |
+---------------------+---------------------+
1 row in set, 2 warnings (0.01 sec)
また、既に緯度経度のデータが揃っている場合は、locationカラムを追加して以下のクエリを投げることで、Geometry型にアップデートすることができます。
UPDATE `test` SET `location` = ST_GeomFromText(CONCAT('POINT(',longitude,' ',latitude,')'));
現在地からの距離をメートル単位で取得する
現在地を恵比寿駅(緯度:35.6470578070246, 経度139.709803588426)と設定して、現在地からの距離を取得してみます。
SELECT
name,
ST_Distance_Sphere(
`location`,
ST_GeomFromText('POINT (139.709803588426 35.6470578070246)')
) AS distance
FROM `test`
ORDER BY distance;
距離をメートル単位で取得するための関数である、ST_Distance_Sphereを利用しています。
https://dev.mysql.com/doc/refman/8.0/ja/spatial-convenience-functions.html
結果
以下のように距離を取得することができました。
+-----------+--------------------+
| name | distance |
+-----------+--------------------+
| 渋谷駅 | 1505.6781085531732 |
| 新宿駅 | 4821.369631613222 |
| 東京駅 | 6379.846634040899 |
+-----------+--------------------+
3 rows in set (0.02 sec)
(参考までに、Google Mapで渋谷駅〜恵比寿駅の距離を測定してみました。)
参考
https://qiita.com/nkojima/items/bb21c72858606dedd817
https://qiita.com/tarokamikaze/items/c40f1cfe07ee3d5282ba