おひさしぶりです。
前回更新から、ずいぶん時間が経ってしまいました。

今回のネタはタイトルの通りです。
プログラミング関係のことなので、興味ない人はスルーしてください。
Geometry型って何?というのは以下をご覧ください。
http://dev.mysql.com/doc/refman/5.1/ja/spatial-extensions.html

私は、GoogleMapsとかに表示するコンテンツに関して、座標やポリラインを格納するために使いたいと思っています。

今回、座標データを格納したいカラム名を'latlng'とし、型にはGeometryを使用しました。

テーブルの作成方法はおまかせするとして、問題はデータの格納をどうするかです。
通常は、モデルのsaveメソッドを使用すると思います。
saveメソッドでうまく出来ればよかったのですが、どうしてもうまくいかなかったので、今回はモデルの実装部分でafterSaveメソッドをオーバーライドして使うことにしました。

afterSaveメソッドはデータが保存された後に呼び出されるメソッドです。
このメソッドで以下のようなクエリを発行するようにしました。
"UPDATE $tablename SET `latlng` = GeomFromText('POINT($lng $lat)') WHERE id = $id"

$tablenameには保存したいテーブル名を、
$lng、$latにはそれぞれ緯度、経度を、
$idにはデータが保存されたidを設定してください。

1回保存するのに、DBに2回クエリが発行されるのがちょっと気に入らないのですが、今回は妥協しました。
いい方法をご存知の方がいれば教えてください。

次はデータの読み込みです。
GoogleMapsに表示したいのですから、表示範囲のデータだけ取り出したいですよね。

地図が表示されている範囲はNE(右上)、SW(左下)の座標データで取得可能です。
この辺はGoogleMapsAPIのお話なので今回は飛ばします。

今回はURLのGETパラメータを
ne=lat,lng&sw=lat,lng
という形式にして呼び出すことにしました。

CakePHPの処理側では以下のようにしてパラメータが受け取れると思います。
$ne = split(",", $this->params['url']['ne']);
$sw = split(",", $this->params['url']['sw']);

次にモデルの検索条件を設定する必要があります。
こちらは以下のようにしました。
"MBRContains(GeomFromText('LineString({$ne[1]} {$ne[0]}, {$sw[1]} {$sw[0]})'), latlng)"

これをconditionsに設定して、findメソッドを呼び出してください。
地図に表示されている範囲の座標データが取れると思います。

あ、大事なことを書き忘れるところでした。
latlngというカラムはGeometry型ですので、その値をそのまま使っても欲しい座標データは抽出できません。
SELECTする項目にX(latlng)、Y(latlng)と記載すれば座標データは抽出できるのですが、CakePHP1.3ではちょうどいい機能が追加されていました。

それがバーチャルフィールドという機能です。
モデルクラスの実装部分に以下を追加してみてください。
var $virtualFields = array(
    'lng' => 'X(latlng)',
    'lat' => 'Y(latlng)'
);

これで、Findメソッドで取り出されたデータにlngとlatというカラムが自動的に追加されます。

以上で、説明はおしまいです。
記事書くのに、あんまり時間をかけられないので、ものすごい駆け足ですが・・・。

個人的なメモ代わりに残しておきます。