格納した位置データを条件を指定して抽出する

電脳備忘録
データベースに格納したデータの抽出方法について調べています。参考にさせていただいたサイトの管理人様に感謝です。

"GPSで取得した位置から○m以内の施設を表示する"機能の実装を目指しています。MySQLから条件を指定して抽出する方法をいくつか試してみたのでとりあえず忘れないうちにメモしておこうと思います。

範囲指定

緯度は0.00027778度ずらすとおよそ31mずれるみたい。半径300m以内の施設を表示したい場合は、現在地の緯度に0.00027778をプラスマイナスすればいいみたいですね。

経度についても調べてみたけど算出が難しいみたい。"およそ半径○m以内にある施設を表示する"といった具合にわりきってもよいのなら参照サイトの方法でもいいような気がします。

指定した範囲にあるデータを抽出
SELECT name, Y(latlng), X(latlng) FROM areas
WHERE MBRContains(GeomFromText
('LineString(139.7800318 35.71654578, 139.7744762 35.71099022)'),latlng);
GPSで取得した値をcakePHPで計算して範囲を出して検索をかければ実現できそうな気がします。あくまで気がするだけですが・・・。

参考サイト

MySQLで指定した緯度経度から半径nメートル内検索っぽいのを実現するSQL

指定した位置からの距離を求める。
SELECT SQRT(POWER((35.711846 - lat) / 0.0111, 2) + power((137.964066 - lng) / 0.0091, 2)) AS distance FROM areas ORDER BY distance;

参考サイト

SQLで2点間の緯度経度から距離を測定する方法

指定した位置とデータベースに格納されているデータとを比較して距離を出せるようです。

指定した緯度経度からもっとも近い5件を抽出
SELECT name, Y(latlng) as lat, X(latlng) as lng, GLength(GeomFromText(CONCAT('LineString(139.72462102999998 35.687737006999996,', X(latlng), ' ', Y(latlng),')'))) AS len FROM areas ORDER BY len limit 5;
一番近い施設が10km離れてたりすることもありそうなので、この方法は使えないかな?

参考サイト

MySQL 位置参照データベースを作ってみる

位置情報を扱うのって結構しんどいですね。時間がかかりそうだ・・・。

広告

ブログの維持費に充てるでございます・・・。