2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【MySQL】Geometry型を利用して、スポット間の距離をメートル単位で取得する

Last updated at Posted at 2021-09-29

はじめに

空間データを扱う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で渋谷駅〜恵比寿駅の距離を測定してみました。)
スクリーンショット 2021-09-29 21.26.21.png

参考

https://qiita.com/nkojima/items/bb21c72858606dedd817
https://qiita.com/tarokamikaze/items/c40f1cfe07ee3d5282ba

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?