2011年1月9日日曜日

MySQLのgeometry型を扱う・・・geometryって何?

今作りはじめているサービスで位置情報を扱うことになった。
geometry型を扱うらしいんだけど、MySQLはinsertとselectくらいしかやったことのないズブ素人なので一つ一つ潰しながら勉強していきます。
今回の目的はある位置から最も近い距離のデータを取得するというもの。


参考にしたサイトは
http://blog.asial.co.jp/473

このサイトにたどり着いたとき
「よっしゃそのまんまのがあるじゃーん。コピペコピペ。」
と思ったのだが、やはり理解しないとエラーばかり出て使えずorz

というわけで下記の分を一つ一つ見ていきます。

2点間の距離の近い順に5件取得する。(ここではアシアルの緯度経度から近い順)
  1. mysql> SELECT 
  2.     -> id, name, X(latlng) as lng, Y(latlng) as lat, zoom, 
  3.     -> GLength(GeomFromText(CONCAT('LineString(139.762522 35.706752,', X(latlng), ' ', Y(latlng),')'))) AS len 
  4.     -> FROM spot ORDER BY len;

GLength(GeomFromText(CONCAT('LineString(139.762522 35.706752,', X(latlng), ' ', Y(latlng),')'))) AS len

GLength? CONCAT? 'LineString? GeomFromText?

はい、一つずついきましょう。

【GLength】
GLenghは
http://dev.mysql.com/doc/refman/4.1/ja/linestring-property-functions.html
に載ってる通り
関連する空間参照における LineString  ls の長さを倍精度の数値として返す。」
だそうです。いやー納得。。
・・・しねーよ?

まず倍精度ってなんだ?
倍精度
ググった↓
http://lunatilia.spaces.live.com/blog/cns!5DF534254BD4E94C!1060.entry

なるほどね!float型の2倍の精度だからdouble型=倍数になるのか。納得。

んじゃ、LineStringは?

LineString
http://technet.microsoft.com/ja-jp/library/bb895372.aspx
上記によると、
一連の点とそれらの結ぶ線分を表す1次元のオブジェクト
らしい。
つまり一連の点との距離、長さがわかるわけだと思う。

というわけでGLenghは、
「LineStringで取得した距離を倍数型にして精度を高めたもの」
ってことになりますね。

【CONCAT】
http://dev.mysql.com/doc/refman/4.1/ja/string-functions.html
CONCAT(str1,str2,...)
引数を連結した結果の文字列を返す。いずれかの引数が NULL のときは NULL を返す。3 つ以上の引数の指定が可能。 数値型の引数は同等の文字列形式に変換される。
mysql> SELECT CONCAT('My', 'S', 'QL');
        -> 'MySQL'
mysql> SELECT CONCAT('My', NULL, 'QL');
        -> NULL
mysql> SELECT CONCAT(14.3);
        -> '14.3'

文字列をくっつけることができる。NULLを夫君でたら全部NULLだよ。
って関数かな?

LineString
GLenghのところで説明したので、割愛。

【GeomFromText】
http://blog.livedoor.jp/hamichamp/archives/51483625.html
どうやら
GeomFromText('POINT($lng $lat)') 
で指定すると経度緯度をジオメトリー型に直してくれる関数らしい。

ここまでくるとようやく理解できた!・・・がCONCATを使う意味がよくわからない。教えてアシアルの人。

無事これを参考に書き換えて動作しました。

引き続き頑張るぞー!

0 件のコメント:

コメントを投稿