参考にさせていただいたサイト
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']})')"
);
書き換えたらエラーを表示せずにデータ登録できるようになりました。最後になりましたが、参考にさせていただいたサイトの管理人様方に感謝です。