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

IT

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

投稿日:

スポンサーリンク

336×280




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型を使ってみてはいかがでしょうか♪

336×280




336×280




CATEGORIES & TAGS

IT, , , , , , ,

blogenist

Author: blogenist