2004年12月21日

Class::DBIでMySQL4.1の空間拡張を使う (CREATE編)

Posted by nene2001 at 14:31 / Tag(Edit): / 0 Comments: Post / View / 0 TrackBack このエントリーを含むはてなブックマーク

アンテナ奪取での近隣アンテナ検索に、MySQL4.1の空間拡張を使う事に決めました。
ところが、MySQL4.1の空間拡張は、空間データ列がBLOB扱いで、SQL上での独自関数経由でないと内容が書き込めない/読み取れないのでClass::DBIと非常に相性が悪いです。
PostGISならまだSQL上では文字列扱いなので何とかなりそうなんですが…。
そこで、とりあえず次のような形でCREATEはできるようにしました。

Class::DBIのWikiページのCookbookを見ると、CREATE時にデフォルト値を設定する方法が紹介されてます。
これを応用して、次のような形でCREATE時の発行SQLを上書きしました。

__PACKAGE__->set_sql(MakeNewObj => <<'SQL');
INSERT INTO __TABLE__ (%s, pt)
VALUES (%s, PointFromWKB(Point(`lng`,`lat`),4326))
SQL

ここで、ptは空間データ列、lng/latは経緯度のスカラー値を突っ込む列としてます。
同じデータを空間データとスカラーで2重持ちする事になりますが、どうせSELECT時も空間データの値にAsText等の関数をSQL上で通してやらないと経緯度データが取れずに困る事になるので、それならもう別に持たせてやって、空間データは空間インデックスでの検索用途だけに使えばええやん、という発想です。
また、4326というのは世界測地系のSRIDです。
これで、lng/lat列に経緯度を突っ込んでClass::DBIをCREATEしてやれば、同時に空間データも計算されて挿入される、という事が実現できます。

注意しないといけないのは、Class::DBI::mysql等を用いてテーブル構造を自動取得させてやったりすると、そちら側で位置データ列ptを取得してSQL文に自動追加されてしまうので、pt列の2重指定になりエラーになってしまう事です。
空間インデックスを張るためには空間データ列はNOT NULL制約が必要になるので、テーブル環境の自動設定を行った場合、INSERTのSQLが発行されると必ずpt列は必ず指定されてしまい、回避できません。
面倒くさいですが、この場合はpt列を除いた列名リストを地道に__PACKAGE__->columnsで追加していってやってください。

後は、set_sql等で設定した独自のSQLで、pt列ベースの空間インデックスで検索した後、lng/lat列の値から経緯度を読み取ってやれば、SELECT部分も問題なしです。
残されるのはUPDATEだけですが、とりあえずうちの要件ではUPDATEは必要ないので、またおいおい調べていきたいと思います。

[composed and posted with ecto]

Related query words in Google & Yahoo
Related Books from Amazon
Trackback to this entry
TrackBack URL :
Trackbacks
トラックバックはありません。
Comments
コメントはありません。
Post a comment












Remember personal info? 
2004年12月
Su Mo Tu We Th Fr Sa
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

About Me

Navigation

Search
Google
Web
kokogiko.net
Archives
Recent Entries
Recent Comments
Recent Trackbacks
『共通善は共有してはいけない』に一部解毒され、一部またもやもやした(ここギコ!)
右翼はアイヌや沖縄を包摂する論理を構築すべきではないのか
『共通善は共有してはいけない』に一部解毒され、一部またもやもやした(ここギコ!)
確信犯より無関心・無神経の方が根が深い大問題
"「次世代交通情報を考える」ブロガーミーティング"に参加(チミンモラスイ?)
AMNブロガーミーティング「ユビークリンク/全力案内!」に行ってきました。
Google未オルソ衛星画像にぶった切られた我が母校(ここギコ!)
未オルソ画像が生むジョジョの世界&MSNの航空写真はオルソされている?
AMNブロガーミーティング「ユビークリンク/全力案内!」に行ってきました。(ここギコ!)
あいまいな個人認証の技術ってないんだろうか
ジオメディア忘年会2008に行ってきた(近江商人JINBLOG)
ジオメディア忘年会行ってきました
ジオメディア忘年会 2008 を終えて(Cirius Lab. ブログ)
ジオメディア忘年会行ってきました
ジオメディア忘年会行ってきました(ここギコ!)
ジオメディア忘年会 新年会から始まり東京1、2、関西と続いたジオメディア2008の締めくくり
ジオメディア忘年会行ってきました(ここギコ!)
モーバイルインフォサーチ実験から続く想いの系譜
「Web 2008 Expo」行って来ました(ここギコ!)
コンテキストを検知できないモバイルWebなどあり得ない
Hatena bookmarked
My del.icio.us

Banners

Syndication
Powered by
Get it!!