MySQLのgeometry型を使い、距離を出す

最近のMySQLは緯度経度が扱えるgeometry型がありますので、そちらを使い、2点間の距離を出してみました。

テーブル mygis の作成

気をつける点としては、ENGINEはMyISAM型がよいのと、最新のバージョンのMySQLでないとgeometry型は扱えないようです。

CREATE TABLE IF NOT EXISTS `mygis` (
  `id` int(11) NOT NULL,
  `geo` geometry NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

geometry型にデーターを挿入

GeomFromText と POINT を使うのがポイント

INSERT INTO mygis (
 id, geo
)values(
 '1', GeomFromText('POINT( 131.547546 33.229498 )')
);

福岡市(130.384369 33.590599)から、距離が近いもの順に表示

SELECT
 ROUND(
  GLENGTH(
    GEOMFROMTEXT( CONCAT( 'LineString( 130.384369 33.590599 , ', X( geo ) ,  ' ', Y( geo ) ,  ')' )
  )
 ) * 111000 ) AS distance
FROM
 mygis
ORDER BY
 distance

WHERE区で len <= 1000とすれば1km以内のデーターを表示できたります。
ちなみに、ガチな距離計算方法

select
 ((ACOS(SIN( 33.590599 * PI() / 180) * SIN( lat * PI() / 180) + COS( 33.590599 * PI() / 180)
* COS( lat * PI() / 180) * COS(( 130.384369 - lng ) * PI() / 180)) * 180 / PI()) * 60 * 1.1515) AS distance
FROM
 mygis
ORDER BY
distance

ベンチマークを測ったところ、それほど、どちらも変わらない感じがしたので、精度やお好みで使うといいのかも