MySQLには空間を扱うための仕組みがあります。これを使うとグラフ情報(点、ベクトル)からでは計算が必須になる距離等の空間情報についてもインデックスをはれたり空間情報を扱う際、何かと便利です。
MySQL :: MySQL 5.6 リファレンスマニュアル :: 11.5.1 空間データ型
MySQL :: MySQL 8.0 Reference Manual :: 11.4 Spatial Data Types
MySQL :: MySQL 5.6 リファレンスマニュアル :: 12.15.1 空間関数のリファレンス
MySQL :: MySQL 8.0 Reference Manual :: 12.16.1 Spatial Function Reference
単に空間を扱った場合、MySQL上では平面の空間を想定して計算がなされます。例えば、次の様になります。
// レコード INSERT INTO MY_TABLE(id, `ST_X(latlng)`, `ST_Y(latlng)`) VALUES (7964, 137.71666666667, 34.733333333333); // クエリ select id, ST_X(latlng), ST_Y(latlng), st_distance(POINT(137.725, 34.725), latlng) as distance from geoid_points // 結果 id, ST_X(latlng), ST_Y(latlng), distance 7964, 137.71666666667, 34.733333333333, 0.011785113017182585;
カラム名の通り緯度経度を元に距離の計算を行いました。しかしこの距離は平面上における距離、つまり
distance = sqrt( (x1-x2)^2 + (y1-y2)^2 )
で算出されています。現実に地球は楕円体であり、この式による計算は誤差を多分に含みます。また、この式で導かれた距離の単位は緯度と経度の合成された度でありよく使われるメートル単位に正しく変換することは難しいです。あらかじめ楕円体を想定して距離を計算する方法が望まれます。
MySQLはこの要望に応えられます。地球を表現する楕円体WGS84上を想定した計算ができます。
測地系 – Wikipedia#WGS84
地球楕円体 – Wikipedia#WGS84楕円体
特によく使い便利なのはST_Distance_Sphere関数です。これを用いると次の例の様に緯度経度からメートル単位の距離を求めてくれます。
MySQL :: MySQL 8.0 Reference Manual :: 12.16.12 Spatial Convenience Functions#ST_Distance_Sphere
// レコード INSERT INTO MY_TABLE(id, `ST_X(latlng)`, `ST_Y(latlng)`) VALUES (7964, 137.71666666667, 34.733333333333); // クエリ select id, ST_X(latlng), ST_Y(latlng), st_distance_sphere(POINT(137.725, 34.725), latlng) as distance from geoid_points // 結果 id, ST_X(latlng), ST_Y(latlng), distance 7964, 137.71666666667, 34.733333333333, 1199.4102600956444
国土地理院の距離計算プログラムとの比較は次です。WGS84(GPSで使うような計算を高速にできる楕円体)だからか少々ずれています。とはいえ60cm程度なので無理に計算プログラムを自作するより良さそうです。