CakePHPでgeometry型のデータを追加する

電脳備忘録
MySQLは位置情報も扱えるようですね。知りませんでした。対象カラムの型をGeometryとすることで扱えるとのこと

参考にさせていただいたサイト

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

テーブルを作る

mysqlにログインしてデータベースを選択後テーブルを作成します。このときlatlngのカラム型を"GEOMETRY"と設定
CREATE TABLE  `areas` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`name` VARCHAR( 255 ) NOT NULL ,
`latlng` GEOMETRY NOT NULL ,
`created` DATETIME NOT NULL ,
PRIMARY KEY (  `id` )
) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_unicode_ci;

データの出し入れ

geometry型のカラムにデータを格納するにはGeomFromText関数を使う必要があるようです。
geometry型のカラムにデータを入れるためには、変換用に用意されている関数「GeomFromText」を使用します。
Google MapsとMySQLの連携より
ためしに松本城の情報を登録してみます。
INSERT INTO `areas` (`name`, `latlng`) VALUES ('松本城', GeomFromText('POINT(36.238634 137.968865)'));
格納したデータを確認します。
mysql> SELECT * FROM areas;
+----+-----------+---------------------------+---------------------+
| id | name      | latlng                    | created             |
+----+-----------+---------------------------+---------------------+
|  1 | 松本城    |        Y▒▒▒B@▒',▒ ?a@      | 0000-00-00 00:00:00 |
+----+-----------+---------------------------+---------------------+
1 row in set (0.00 sec)
latlngカラムのデータがおかしなことになっています。緯度経度を取り出すときは専用の関数を使う必要があるようです。
緯度経度を取り出すときには関数(X, Y, AsTextなど)を使用し、以下のように変換して取得することができます。
Google MapsとMySQLの連携より
ちゃんと表示できました。
mysql> SELECT id, name, X(latlng) as lng, Y(latlng) as lat, AsText(latlng) as geomtext FROM areas;
+----+-----------+-----------+------------+-----------------------------+
| id | name      | lng       | lat        | geomtext                    |
+----+-----------+-----------+------------+-----------------------------+
|  1 | 松本城    | 36.238634 | 137.968865 | POINT(36.238634 137.968865) |
+----+-----------+-----------+------------+-----------------------------+
1 row in set (0.00 sec)

cakePHPでデータを格納する

cakePHPで開発を進めているので、cakePHPでgeometry型にデータを格納する方法をgoogle先生に尋ねてみました。

環境はCakePHP1.3です。

参考にさせていただいたサイト

cakePHPでMySQLのgeometry型を使う

基本的には参考にさせていただいたエントリーの方法でデータを格納することが出来たのですが、下記のエラーメッセージの対応に時間を取られました。

エラーメッセージ

Notice (8): Undefined variable: db ...

Fatal error: Call to a member function expression() on a non-object in ...

やったこと

$db->expressionという記述を
$this->data['Area']['latlng'] = $db->expression(
"GeomFromText('POINT({$this->data['Area']['lat']} {$this->data['Area']['lng']})')"
);
DboSource::expressionと書き換えました。
$this->data['Area']['latlng'] = DboSource::expression(
"GeomFromText('POINT({$this->data['Area']['lat']} {$this->data['Area']['lng']})')"
);
書き換えたらエラーを表示せずにデータ登録できるようになりました。最後になりましたが、参考にさせていただいたサイトの管理人様方に感謝です。

広告

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