2011年5月24日火曜日

位置情報(緯度、経度)をMySQLのGeometry型で保存する

こんばんは。BS事業部隊員です。

今回は、大好評(!?)「灰皿なう」にて採用している位置情報(緯度、経度)の保存方法を紹介します。

---Ads by ITC -----------------------------------------------------------------------------------------------------------------------------------------------------------------
ここでちょこっと宣伝です。
灰皿なう→近くの灰皿を検索するスマートフォン向け(特にiPhone)Webアプリ。舞浜にある有名テーマパーク内の喫煙所にも対応しています。喫煙所を登録することもできます。ぜひ、一度見に来てください。
灰皿なうFacebookファンページ→更新情報や、FAQなど載せてます。今後もパワーアップさせていきますので、乞うご期待です。
灰皿なうの付属品か中の人かどっちか(@smokerbot On Twitter)→こちらは、新しい喫煙所の情報やたばこに関する情報なんかをつぶやいています。とりあえず、フォロワー1000人が目標です。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

これもまた得意のググりで見つけたものです。
位置情報サービスのはじめ方
Google MapsとMySQLの連携
※先輩方ありがとうございます。参考にさせていただきました。

MySQL(v5.0)のGeometry型.... 便利そう!とういうことで使ってみることにしました。
....
くわしいことは、先輩方のサイトを参考にしてください。詳しく載ってます。

ここでは、ポイントだけ。※ 例の位置情報は適当です。

1.Geometry型とは
MySQL4.1以降で用意されている空間情報を扱うデータ型

2.テーブル定義
対象カラムの型をGeometryとするだけ。
CREATE TABLE points (
  point_id INT NOT NULL
 ,latlon GEOMETRY NOT NULL
 ,PRIMARY KEY (point_id)
 ,SPATIAL KEY (latlon)
) Engine=MyISAM;
latlonカラムをSPATIAL INDEXとするため、MyISAMで使用します。

3.データの挿入
INSERT INTO points (
  point_id
 ,latlon
) VALUES (
  1
 ,GeomFromText('POINT(137.111 35.222)')
);
GeomFromTextはGeometry型に変換するMySQLの関数です。

4.データの取得
① 位置情報を取得する
SELECT
  point_id
 ,X(latlon) as lon
 ,Y(latlon) as lat
 ,ASTEXT(latlon) as geomtext
FROM points;
Xは経度、Yは緯度、ASTEXTは文字表現を返す関数です。

② 指定した範囲内の位置情報を取得する
SELECT
  point_id
 ,X(latlon) as lon
 ,Y(latlon) as lat
FROM points
WHERE MBRContains(GeomFromText('LINESTRING(140.00 36.00, 139.20 35.55)'), latlon);
MBRContains、LINESTRING関数については、このサイトに詳しく載ってます。

③ 2点間で一番近い位置情報を取得する
SELECT
  point_id
 ,X(latlon) as lon
 ,Y(latlon) as lat
 ,GLength(GeomFromText(CONCAT('LineString(137.111 35.222,', X(latlon), ' ', Y(latlon),')'))) AS len
FROM points
ORDER BY len
LIMIT 0 , 1
GLength関数は、2点間の距離を取得します。

かなり、省略してしまいましたが、こんな感じです。
足りない情報は、追記していきます。では。

0 コメント:

コメントを投稿