素敵なサムシングを独断と偏見で一方的に紹介するブログ(´・ω・`)

投稿日: 2019年9月2日
最終更新日:

【位置情報】MySQLのgeometry型を使って緯度経度の2点間距離をkmで計算・算出する方法【ST_GEOMFROMTEXT】

YouTubeも見てね♪

ねこじゃすり

created by Rinker
PEPPY(ペピイ)
¥3,850 (2024/03/15 19:03:46時点 Amazon調べ-詳細)

猫を魅了する魔法の装備品!

Anker PowerCor

created by Rinker
Anker
¥4,990 (2024/03/15 15:06:44時点 Amazon調べ-詳細)

旅行には必須の大容量モバイルバッテリー!

【最新機種】GoPro hero11 Black

created by Rinker
GoPro(ゴープロ)
¥62,000 (2024/03/15 19:06:06時点 Amazon調べ-詳細)

最新機種でVlogの思い出を撮影しよう!

レッドブル エナジードリンク 250ml×24本

created by Rinker
Red Bull(レッドブル)
¥4,080 (2024/03/15 19:03:47時点 Amazon調べ-詳細)

翼を授けよう!

モンスターエナジー 355ml×24本 [エナジードリンク]

created by Rinker
モンスター
¥4,748 (2024/03/15 19:03:48時点 Amazon調べ-詳細)

脳を活性化させるにはこれ!

ドラゴンクエスト メタリックモンスターズギャラリー メタルキング

created by Rinker
スクウェア・エニックス(SQUARE ENIX)
¥3,250 (2024/03/15 19:03:48時点 Amazon調べ-詳細)

みんな大好き経験値の塊をデスクに常備しておこう!

Bauhutte ( バウヒュッテ ) 昇降式 L字デスク ブラック BHD-670H-BK

created by Rinker
Bauhutte(バウヒュッテ)
¥13,861 (2024/03/15 15:06:46時点 Amazon調べ-詳細)

メインデスクの横に置くのにぴったりなおしゃれな可動式ラック!

MySQLのgeometry型を使ってみよう

double型でも実現は可能

先日、緯度経度を用いた近隣検索を実現する際に、MySQLのdouble型に緯度経度をそれぞれ保存して実現する方法をご紹介しました。

しかし、せっかく位置情報を取り扱いやすくするためのgeometry型が用意されているのであれば、せっかくなので使ってみよう!という事で、試してみようと思います。

やり方

前提

今回はMySQL5.7を使用し、前回使用した県庁所在地テーブルpointというgeometryカラムを追加し、操作を行ってみようと思います。

geomety型から取得したデータの比較のために、前回のlatitudelongitudeのカラムは残しています。

サンプルデータはこんな感じ。

GEOMFROMTEXTは非推奨

INSERTする際に、GEOMFROMTEXT('POINT(xxx yyy)')を使いように記載されているブログがあると思いますが、現在は非推奨となっており、ST_GEOMFROMTEXTを使うように警告が出ると思います。

これから新しく実装する方はST_GEOMFROMTEXTを使うようにしましょう。

SQL

geometry型から緯度経度を取得

まずはgeometry型から緯度経度をそれぞれ取得してみましょう。

取得するにはX関数とY関数を利用します。

関数名 関数名
X関数 経度
Y関数 緯度

気をつけるべきは、Xが経度(longitude)、Yが緯度(latitude)なので緯度経度という呼び方と混乱して逆にならないように気をつけましょう!

しっかりと同じ値が関数経由でも取得出来ていますね♪

2点間距離の取得

次は2点間距離を算出してみましょう。

試しに東京タワーからの距離を出してみます。

実行結果の単位が違う

ここで注意すべきは、doubule型から取得した結果の単位がkmである事に対し、GLENGTH関数の結果はである事です。

これは、地球の外周の1/360となっています。

km単位で取得する

そこで利用するのがST_Distance_Sphere関数です。

こちらを利用する事で2点間距離をメートルで簡単に算出する事が出来ます。

あとはこちらの結果を1000で割ればkmに変換する事が出来ますね。

これでdouble型から算出した距離(km)にかなり近づきましたね!

多少の差異は出ていますが、誤差の範囲と考えて良いでしょう。

終わりに

以上のように、double型を利用するよりもSQLがスッキリしました。

皆さんも、緯度経度をMySQLで管理する際はgeometry型を使ってみてはいかがでしょうか♪

CATEGORIES & TAGS

IT