Geographicalビヘイビアでの緯度、経度のフィールドの精度
DoctrineのGeographicalビヘイビアは便利で好きなんだけど、
普通にschema.ymlで
Place: actAs: - Timestampable - SoftDelete - Geographical ....
とやるとbuildされるテーブルはこんな感じになる。
CREATE TABLE `place` ( (snip) `latitude` double(18,2) DEFAULT NULL, `longitude` double(18,2) DEFAULT NULL, `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL, `deleted_at` datetime DEFAULT NULL, PRIMARY KEY (`buillding_id`) ) ENGINE=InnoDB ;
この状態だとGoogleマップなんかを扱うと精度が不足してかなり残念な感じになってしまう。
小数点以下の桁があともう少し欲しい。
で、調べてみた。
actAsにGeographicalを指定したときに生成されるCREATE TABLE文のプロパティは
/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Template/Geographical.php
の
/** * Array of geographical options * * @var string */ protected $_options = array('latitude' => array('name' => 'latitude', 'type' => 'double', 'size' => null, 'options' => array()), 'longitude' => array('name' => 'longitude', 'type' => 'double', 'size' => null, 'options' => array()));
この辺で設定されている。
生成されるフィールドの精度が
`latitude` double(18,2) DEFAULT NULL,
になるのはDoctrineでフィールド型にdoubleを指定したときのデフォルトがそうなっているからなんだろう。
ここで
$_options['latitude']['type']
の値を変えると生成されるテーブルのフィールド型も変わる。
これを最初のyamlで指定するには
Place: actAs: - Timestampable - SoftDelete Geographical: latitude: type: double(10,7) longitude: type: double(10,7) ....
とする。
緯度は±90度まで、経度は±180度までの値しか入らないからこの辺でいいと思う。
validatorとかどうなるのかは未検証。これからやろう。
とりあえず、めでたし。
でも浮動小数点は丸めが入るので、本当はテキストの方が意図した値がちゃんと入って良かったりするのでは、とか思ったり。
これ、ちゃんと探したらまたどっかに書いてあったりするのかなぁ・・・