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
ベンチマークを測ったところ、それほど、どちらも変わらない感じがしたので、精度やお好みで使うといいのかも
参考リンク
- 中卒がだんだんプログラマーになっていくブログ: MySQLのgeometry型を扱う・・・geometryって何?
- ITC開発ブログ(仮): 位置情報(緯度、経度)をMySQLのGeometry型で保存する
- 第5回 位置情報を保存しよう(前編):位置情報サービスのはじめ方|gihyo.jp … 技術評論社
- Webサービスにおける外部APIの使用(その2) - MySQL Spatial Extensionsによる位置情報の検索 - O'Reilly Japan Community Blog
- MySQL TIPS 3 空間情報(geometry)を使って経度・緯度の検索を高速化する - イノベートな非日常
- MySQL :: MySQL 4.1 リファレンスマニュアル :: 10.4.4 空間情報カラムへのデータ入力