RICOH THETA m15で撮影した動画をOculus Rift DK2で楽しむ

RICOH THETAの新しいモデルでは、動画撮影ができるようになりました。この撮影した動画をOculus Riftで見ることができたので、手順を残しておきます。

1. 動画を撮影

RICOH THETAの電源ボタンを入れるときに、Wifiボタンを押しながら電源ボタンを入れると動画撮影モードで起動します。電源ボタンが点滅している状態であれば、動画撮影モードで正常に起動しています。
スマホのアプリでも撮影できます。アプリの表示からすると最大3分間撮影できるようです。

2. 動画を変換

撮影した動画は、そのままでは利用できないので、パソコン用のアプリで変換をする必要があります。カメラの動画はUSBケーブルで通常のデジカメと同じ方法でPCにコピーしておきます。

RICOH THETAビューアーアプリをダウンロードしてインストールします。
THETAアプリを起動したあと、動画をドラッグ&ドロップすると、動画の変換(.MOVから.mp4)が完了します。

3.Oculus Riftを接続

楽しく使うOculus Rift DK2を参考に、ドライバやランタイムをインストールして、Oculus Riftが使える状態にしておきます。

4.動画再生用アプリで再生!

LiveViewRiftというアプリがありますので、MAC版またはWindows版をインストールしておきます。

Type欄をVideoにして、変換してできたMPEGファイル(.mp4)を選択、Startボタンで開始します。

起動後に出るメニューで、「cam mapping」の項目をequirにすると360度表示のモードになります。
THETA m15の動画の画質は粗いので臨場感は足りないのですが、将来的に画質がいいモデルが出たらもっと楽しめると思います。

THETA m15をまだ持ってない!という場合は、theta360.comのギャラリーの動画でも楽しめるかも知れません。(ダウンロードしていいのかどうか分かりませんが、個人で楽しむ分にはいいのかな?)

株式会社ヤマレコになりました。

本日、会社登記の手続きが無事完了し、7/2付けで株式会社ヤマレコとしての活動を開始することになりました。
ヤマレコのサービス運営元も株式会社ヤマレコになりますが、今後もしばらくは一人でやっていく予定なので実質は特に変わりはありません。

折角なのでドメインも取得し、会社のHPも作ってみました。
今後ともよろしくお願いします!

ヤマレコの開発秘話と現状

昨日、会友として所属している山岳会「カモの会」の20周年記念イベントで、表題のような話をして欲しいとのことで、プレゼンをしました。
一部のスライドは外しましたが、その時のプレゼンの資料を公開しておきます。

より詳しい内容は、5周年の時に書いた記事を見てもらうとして、全体の流れや苦労の一部は見えるんじゃないかなと思います。

今後とも、ヤマレコ共々よろしくお願いします!

Wikipediaにカモの会が共産党系山岳会とかかれているようですが、共産党とは無関係です。(上位組織が関係しているようなネットの記事はあるようですが、カモの会としては少なくともそんな話は入っているときに聞いたことがありません)。
Wikipediaに「ヤマレコはカモの会の山行記録を公開するために作りはじめたシステム」とありますが、ヤマレコはカモの会で作った「山行記録を残す機能」を「一般の人が使えるようにゼロから作り直したシステム」で、公開後しばらくしてからカモの会の記録を移行しただけです。スライドにもそんなことは一言も書いていません。
Wikipediaのルールとして、本人が記事を書き換えるべきではないようなので、引用されているこの記事で言及をしておきます。この記事を見たどなたか、Wikipediaの記事を正しい内容に書き換えていただけると嬉しいです。

将来の登山スタイル

ヤマレコの将来像を考えるにあたって、趣味登山の情報通信技術(ICT)とのつながりが進んだ少し将来の登山スタイルを妄想してみました。

将来のイメージ

ヤマレコを作ってみて感じていることとして、山と登山におけるICTはあくまでも補助的なツールとして登場するもので、「人が山を登る」という活動をサポートするものでしかないということです。
登山を楽しむ活動の中で、上手にICTの力を借りることで、趣味として楽しめないような時間がかかる作業を排除して、安全登山のための情報がいつでも・どこでも手に入るようになると思います。

将来的には、小型で持ち歩くことができてバッテリーが十分に長続きし、ネットワークに常時繋がる端末(いまのスマートフォンの進化なのか、Google Glass的なものの進化なのかは分かりませんが)ができあがって、人と人がシステムを介してつながることで、色々な事ができるようになる可能性があります。

例えば、近い将来だとこんな感じのことができるようにならないかなと考えてます。

  1. 行く場所を決める
    • 自分の今のスキルを踏まえたうえで、いまオススメの登山コースが提案してもらえる。
    • そこで見られる景色が、そのままの形で擬似体験できる(Glassや全方位プロジェクタなど)
  2. 計画を作る
    • 時間や場所などを加味して行きたい場所を選ぶと、コースタイムや危険箇所などを含む行程プランが自動的にできあがる。
    • 日程を決めると、その登山道の直近の状況や、ルート沿いの天気(天気図や予報)の情報を逐次報告してもらえる。
    • 無謀なプランを立てていないか、事前に最終チェックしてもらえる。
  3. 装備を整える
    • 自分の持っている装備になく、次の登山で買ったほうがいい装備が分かる。
    • ボタンを押すだけで、オンラインで発注できて、必要な装備・食べたい食材が登山日までに届く。
  4. アプローチ
    • 当日忘れ物がないか、家を出るときに確認・警告してもらえる。
    • 登山口までの行き方・見つけ方をナビゲーションしてもらえる。
    • 入山したことが、家族や友人に自動的に伝わる。
  5. 登山中の情報発信
    • いまどこにいるのか?が、自分が確認できるだけじゃなくて、家族や友人にもリアルタイムに伝わる。
    • いつどこを通過したのかが自動的に記録される。
    • 登山で感動したこと(文章)、見たこと(映像)をリアルタイムに記録できる。
    • 友人にもリアルタイムに共有できる。
  6. 登山中の安全確保
    • ルート上の危険箇所が近づいてくると、通知してくれる。
    • 危険な雨雲が発生した場合、行動中に警告してくれる。
    • 自分の足りないスキルを学びながら歩ける(読図、歩行技術、etc)。
    • 登山道から外れると、引き返すように警告を出してくれる。
    • 遭難発生時の対処をリアルタイムにサポートしてもらえる。
  7. 下山後
    • 安全な場所まで下りたことが、家族や友人に自動的に伝わる。
    • 自分の好みに応じた、下山後の温泉や打ち上げ場所の情報がもらえる。
    • 自分の見た・感動した景色を、そのままの形で共有できる。

書いてみると、単に機能を作るだけなら既存のシステムを組み合わせて、今のスマートフォンがあれば作れるような気もします。
しかし、実際に作ろうとするとコストもかかるし、(少なくとも登山だけだと)ニッチな領域で収益も見込めないから、どこかの企業が構築してくれる可能性も低い。でもすでにシステム&コミュニティが融合しているヤマレコとしてなら、こういう世界を少しづつでも創っていけるはずです。


あとはオマケです。

登山技術の向上について

昔とは違って、いまは山岳会などのコミュニティに所属していない登山者の割合が多くなっています。その場合、今まで得られてきたコミュニティの中で相互に教えあうという仕組みができない、独学でやるしかない状態になっていると思います。
独学に委ねられると、自主的に登山技術を磨いて山に行く、ということができない人も出てきてしまいます。もちろん独学でも必要な技術分野の本を買って勉強して、講習会に出て、山に行って実践して、という人も多くいると思います。

いま行きたい山があるけれど、その山が自分が持っている登山技術を超える場合にどうするか?というと、

  1. ツアーに参加して連れていってもらう
  2. 友人・先輩に連れていってもらう(山岳会はこれ)
  3. 独学で自分のレベルを上げて行く
  4. 技術が不足していることを知らずに行ってしまう

のどれかになると思います。

ヤマレコを通じて、4の状況を排除して1〜3の強化ができるようにしたいと考えています。可能性としては、ヤマレコ参加者のコミュニティを土台として「暗黙知化されている知識や技術」を文章・映像化して相互に教えあう仕組みを作ったり、自分の登山技術レベルを可視化してレベルアップをサポートする仕組みを作るというのもあると思います。


そもそも山に行く活動って、どんなことをしているのか?

「山に行く」と決めたら、やることは多岐に渡ります。とりあえず思いつく範囲で、粒度にとらわれずに目的と行動パターンを書きだしてみると・・・

  1. どこに行くか?を決める
    • ハイキングガイドなどの本で探す
    • 友人におすすめの山を聞く
    • ネットで探す
  2. 必要な装備を知り、準備する
    • 雑誌や本で知る
    • 友人の進めで知る
    • ネットで知る&買う/レンタルする
    • 店舗に行って知る&買う/レンタルする
    • 知らない&買わない
  3. 知識・技術を習得する(歩行技術、登攀技術、読図、天気、無線、リーダースキル、撮影技術、など)
    • 本を読む
    • ネットの記事を読む
    • 友人・先輩から教えてもらう
    • なにもしない
  4. 必要な技術を習得する
    • 本を読んで自分で実践してみる(独学)
    • 講習会に参加する
    • 友人・先輩から教えてもらう
    • なにもしない
  5. 登山口までのアクセス情報を調べる
    • 本で探す
    • ネットで探す
    • なにもしない
  6. 予約をする
    • 交通機関(飛行機、電車、船など)
    • 宿、山小屋
    • なにもしない
  7. いまの山の情報を調べる
    • 電話で聞く: 役場・山小屋
    • ネットで探す(ブログ、ヤマケイオンラインなど)
    • 調べない
  8. 天候を調べる
    • 天気予報を見る(ネット/TVなど)
    • 天気図を見る
    • 天気図を描く
    • 空を見る
    • なにもしない
  9. 装備分担
    • 体力を加味して、共同装備を振り分ける
    • 必要ないからやらない
  10. 登山計画書の提出
    • 現地に登山ポストがあったら、用紙に記入する
    • ネットで提出する
    • 家族に○○山に行ってくる、と言う
    • 作成するが提出しない
    • 作成しない
  11. パッキング
    • 軽量化してつめる
    • バランスを確認する
    • 適当につめる
  12. 入山連絡
    • 家族に「行ってきます」と言う
    • しない
  13. 行動記録
    • 写真を撮る
    • 動画を撮る
    • コースタイムやコース状況、感想のメモをノートに書く
    • GPSログを取る
    • なにもしない
  14. 予定変更(行動判断)
    • 計画書に案が複数あり、その中から状況に応じて選択
    • 計画で決めた予定を遵守する
    • ある程度漠然と考えておいてその場で適当に判断する
    • そもそも予定がない
  15. ペース配分
    • パーティの体力を見ながら調整
    • 予定に合うように調整
    • 何も考えない(自分のペースで行く)
  16. 食事
    • 行動食を持っていく
    • 山小屋で買う
    • 食事用の準備をして現地で作る
    • なにもしない
  17. 宿泊
    • テントを設営する
    • 山小屋に宿泊する
    • 宿泊しない
  18. 山中からの連絡/情報発信
    • 電話で連絡を取る
    • 無線で連絡を取る
    • メールする
    • ネットで書き込む
    • なにもしない
  19. 下山連絡
    • 家族や友人にメール
    • 家族や友人に電話
    • しない
  20. 下山後
    • 風呂に行く
    • 打ち上げをする
    • 直接帰る
  21. 登山の記録を作る
    • 行動記録をもとにまとめる
    • 記憶を頼りに書き起こす
    • 写真やログをPCに取り込む/アルバムを作る
    • なにもしない
  22. 登山の記録を公開する
    • ブログに書く
    • 山岳会の会報に書く
    • なにもしない

分類はめちゃくちゃですが、書き出したらいくらでも出てきますねー。自分の責任できちんと準備して山に行きたい(でも何をしたらいいか分からない)と思ったとき、ヤマレコがサポートできる範囲をどんどん広げておいて、「なにもしない」の項目をなくせるようにしていきたいと考えています。
もちろんヤマレコで全部はできないので、今あるシステム・組織とも連携させてもらいながら。

まあ、要するに頑張ろうかなと。

Plag & Play Expo

せっかくこっちに来たので、色々見て回ってます。
昨日はPlug & Play Expoに参加してきました。

全体所感

スタートアップのプレゼンは初めて見ましたが、プレゼンのポイントを押さえているかどうかで、印象がかなり違います。内容がいいものは、解決しようとしている問題と、対応する機能や特徴がハッキリしていて分かりやすい。いくつか面白いサービスも見ることができました。


コンシューマを対象にしたコミュニティ系のサービスは、利用者がどの程度集まるかで価値が決まってしまいます。例えば独自に開発したコミュニケーションアプリに特徴的な機能があっても、それを使う人が少なければ何の価値もなくなってしまう。そこが意識されているデモ・プレゼンが少なくて違和感を感じました。


休み時間やイベント後に、会場をぐるぐる回りながらデモや話を聞いてみました。もっと投資家が興味を持って積極的にコミュニケーションを取るのかと思っていましたが、積極的に見えなかったのは、直接議論する場ではなく単なるイベントだからなのか単に自分が見えていないだけなのか。


ピッチのプレゼンでは、学生たちがオリジナルで立ち上げたばかりです、というサービスもあれば、実際に導入してこれだけ今稼いでます、というサービスもあって面白いです。


何度もキーワードが出てくるアントレプレナーインキュベーター、インベスターなどの立場や、スタートアップが投資のステージを重ねて段階的に規模を拡大して行くプロセスなど、基本的なところも抑えた上で話を聞いているともっと面白いはず。

各サービスが希望する金額もプレゼンによって異なっていて、$100Kとか$10M集めたいとか。
上記のステージやビジネス自体の事業規模に依存するのだと思います。
定期的に開催されているようなので、次回もできれば参加したいです。



興味を引いたサービス


kloudless

メールやEvernotefacebookdropboxなど、いろんなWebサービスにデータが分散されるようになった現状で、どうやって横断的に情報をさがすのか?を解決するサービス。

自前のサーバに、インデックスだけを保存する。インデックスサイズはデータの1%程度らしい。実際にデモを見せてもらったが、添付ファイル(の中身)も含めて30秒程度でインデックスができるらしい。(できはじめる、かもしれない)

各サービスとの認証は毎回パスワードを入れ、セッションが切れたらやり直しになるので、その部分は今後の課題だということ。いまもClosedでデモを構築しているから問題ないだろうが、ユーザが増えたときに性能を維持できるかどうかもこれから。

ただ、複数の情報源を横断的に検索する機能は自分も使いたいサービスであるし、面白いと思う。



spool

InstapeperやRead It Laterのように、ブラウジングしている情報を、スマートフォンからあとで見ることが出来るサービス。学生が作っている。

バイスの中にキャッシュを作って、オフラインアクセスできるようにしている。また、過去のその人の振る舞いから、良く行くニュースサイトなどの情報をもとに記事をプリフェッチする機能を持っている。

主に認証が要らないインターネット公開の記事のみになっているが、単なる既存技術の焼き直しではなく、オフラインと事前キャッシュという技術が入っている点が面白い。



Snackr

ニュースを30秒程度の音声にまとめて読み上げてくれるアプリ。iPhoneアプリがリリースされている。読み上げソフトを使っているようで、少し違和感がある程度で普通に聞くことができる。

アメリカではオーディオブックもそうだが、なぜか音声による情報取得の文化があるようだ。最終的にはリアルタイムにパーソナライズされたaudio platformを目指すとのこと。

ダウンロードして聞いているが、結構いいかも。



C4SA

日本のビジネスをアメリカに展開しようとしているベンチャー

IaaSのインフラの導入やサーバの増減やバックアップを簡単にするインフラをサービスとして提供している。アクセスの増減に応じてサーバ台数を自動的に増減させられるため、利用者のコストを削減できることがウリ。AWS意外にも、複数のIaaSインフラを導入することで、1つのIaaSに縛られることも防げると主張している。

運用管理のサービスなので、自社で仕組みを作る場合と比較したコストバランス次第だが、
スケールを制御するノウハウがない企業に対しての価値は高いと思う。

その他

MediaFunnel
企業向けのソーシャルメディアの利用サポートサービス

Twitterなどの外部システムに情報を流す際のインフラを提供する。
ソーシャルフローの流れをMonitorして、アラートを上げたり、投稿する日時をスケジューリングできるような機能を持っている。

管理が楽になるという意外に、ガバナンスを守るという点も主張していたが、どこで保証しているのかはプレゼンだけでは分からなかった。


carbonlighthouse
企業のエネルギー消費を抑えるためのコンサルティング的な活動をする会社。

技術は既存の組み合わせのようだが、建物丸ごとのデータを可視化したり、ピークのエネルギーをカットしたり、発電機器を使ったりすることで、消費エネルギーをカットしていく。


Pangia
ビルそのままを可視化する。水や電気、ガスなどをまとめて可視化、管理して
実際にビル1つでコスト削減が実現できた事例を紹介していた。

エコ関連のものはソリューションが作り易いのか、こちらに来てからも何度か目にしている。


inbenta
Enterprise向けの検索システム。

Natural Language Searchが特徴。いわゆる文章で検索する技術、Wordベースよりも効果が高いらしい。

日本語だと文章を書くのもめんどくさいが、英語だと書きやすいんだろうか。


Spendgo
POSのシステムを改良。精算時に相手のデバイスに電子的な領収書を発行するサービス。
クーポンなどの仕組みとも連動している。POSレジごとに月$50のモデル。


StyleTech
メガネに特化した、コーディネートサービス。

大量のメガネの中から、Web Camを使って仮想的にメガネを掛けて、自分に合うメガネを選べる。
人の顔の向きに応じてメガネも動く。ちょっとニッチすぎると思うが、面白い。


ZeroMail
今までのメールクライアントの使い勝手を良くするためのフロントエンドアプリ。

FacebookのようなUI/UXで、メール以外のニュース等も含めて見やすくなるらしい。
いまいち共感はできなかった。


WishExpress
家族向けのSNSSNSである必要をあまり感じない。


TVAnytime
3G Streamingはコストもかかるし遅い。各サービスを仲介して
より高速にコンテンツを見せるフロントエンドサービス。

Freemium でサービスをすると言っていたが、ライセンスの関係がイマイチよく分からなかった。
単にデータをキャッシュするだけかもしれない。


ActiveBuzz
データのストレージサービス。

プラットフォームを使ってB2B向けの解析サービスを提供するモデルらしい。


Narvalous Inc.
SecondLife風の3D仮想空間で交流するサービス。

なぜ同じものを作るのかが理解できなかった。


eThor
レストラン等に対して、コンシューマーとの橋渡しをするサービス。

詳細はよくわからなかった。


Yatown
近所の人向けの地域SNS

こういったサービスは利用者が集まらないと意味が無いが、
範囲をローカルに絞ると使う人がほとんどいない様な気がするのは気のせいだろうか。


iKwest
位置情報を利用したゲームプラットフォーム。

指定された場所に行って、クイズを解くデモをやっていたが、利用シーンが思い当たらなかった。


naptra
昼間などにちょっとうたた寝するための睡眠カプセル。

アメリカだと需要があるんだろうか。日本じゃちょっと使えそうにないけど。


EMOVE
オブジェクトの動きを電気に変えるデバイスのようなもの。

詳細はよくわからない。


UserZoom
アプリケーションの使いやすさなどのテストを行うソリューションの提供。

利用者との仲介を行うらしい。


MyBantu.com
Personal Recommendationと企業向けの広告提供サービスプラットフォーム。


Vixlo
アンケートや統計の情報をまとめて表示してくれるプラットフォーム。


AgoraTechnologies
データ共有のプラットフォーム。いわゆるテレビ電話会議。

複数のサービスと繋がって、1つの画面に人の顔と画像データを表示する。
共同作業などに使えるとのこと。


RouterShare
利用者から利用料金をもらって、企業などのネットワークを使い、仲介料をもらうシステム。

企業側のセキュリティをそう簡単に使わせてもらえないと思うのだが・・・。


Ixion
アバターを作ってグッズなどを売るサービス。

どう考えても盛り上がらないような気がするのだが。


ModelWalk
インターネット上での服の購入について、その背景にあるストーリーも何もなく、単にカタログを並べているのが現状であり、そこにデザイナーならではの情報を載せたり、直接提案・サポートできるサービスを目指すらしい。

中抜きの考え方は面白いが、デザイナーからの押し付けになってしまう気がする。
デザイナー側の問題意識は分からなくもないが、利用者が求めてるのかどうか微妙。


InboxFever
メールを送って関連する情報をもらうシステム。

なんでメールなのかよく分からない。


CardFlick
business cardをフリックするだけで交換できるプラットフォーム。
フリックして相手に名刺を投げ込むデモを見たが、見た目は面白い。

でもみんなが使わないと意味が無いので微妙・・・。


gripNote.com

Infinica

Tubaloo

あまり聞いてないので省略。

MySQL5.6で新しく追加された地理空間データ(GIS)の検索を実装してみた

MySQL 5.6登場!!新機能速攻レビュー - 漢(オトコ)のコンピュータ道
を見ていたら、MySQL5.6の新機能の1つとして、こんな紹介が。

OpenGIS
ジオメトリデータの比較において、これまではMBR(minimum bounding rectangle ≒ 近似的な長方形)に基づいた比較しか出来なかったのだが、ジオメトリの正確な形に基づいた比較ができるバージョンの関数が追加された。例えばMBRバージョンのContains()に対して、ST_Contains()というように、ST_というプレフィックスのついたものが正確な比較をするバージョンとなる。

つまり、(私が使ったことがない)postGISをわざわざ使わなくても、使い慣れたMySQLだけで「この部分の記録を探したい!」という要求に簡単に答えられそうです。さっそく機能を作ってみました。
実際は4/22から検討開始して、今日やっとリリースできました。



簡単に説明すると、クリックして範囲を選んで、「記録検索」アイコンをクリックすれば、その範囲を通るルートをすべて検索する、という機能です。
これに以前から作りこんでいる「全ルート表示」機能を合わせこんで作っています。

全体でやるべきこと(目次)

簡単に言うと、以下の3つをやれば実現できます。

  1. MySQL5.6が動くサーバを準備する
    • メインのサーバでは違うバージョンのMySQLが動いているので、別のサーバを準備してMySQLをインストールします。
  2. GPXのトラックログMySQLのデータに変換して登録する
  3. GoogleMap上から検索できるようにする

これを順番に説明していきます。

1. MySQL5.6が動くサーバを準備する

自宅にあるバックアップサーバが遊んでいる状態だったので、そのサーバ上にデータベースをインストールします。
今回は、CentOS5.5のサーバ上に、MySQL5.6 + php + Apacheの環境を構築しました。

まず、既にインストール済みのものがあれば削除しておきます。apacheはそのまま使いました。

# yum remove mysql-server
# yum remove mysql
# yum remove php
# yum remove php-cli

MySQL5.6のダウンロードサイトからLinuxRPMをダウンロードします。
うちのサーバは64bit版のCentOSなので、該当するパッケージを選びました。

インストールはrpmコマンドで1発。

# rpm -Uvh MySQL*

my.cnfを準備します。サーバースペックがいいのでmy-large.cnfを利用しました。

# cp /usr/share/mysql/my-large.cnf /etc/my.cnf

これだけで、MySQLにはアクセスできるようになります。

# mysql
mysql> SET PASSWORD FOR root@localhost=PASSWORD('新しいパスワード');
mysql> exit
# mysql -u root -p

ついでにテーブルを作ってしまいます。

mysql> create database mytest;
Query OK, 1 row affected (0.02 sec)

mysql> use mytest
Database changed

mysql> create table geom_test (
    -> id int(10) unsigned,
    -> g multilinestring NOT NULL,
    -> primary key (id),
    -> spatial key (g)
    -> )  ENGINE=MYISAM;
Query OK, 0 rows affected (0.11 sec)

mysql> describe geom_test;
+---------+------------------+------+-----+---------+-------+
| Field   | Type             | Null | Key | Default | Extra |
+---------+------------------+------+-----+---------+-------+
| id      | int(10) unsigned | NO   | PRI | 0       |       |
| g       | multilinestring  | NO   | MUL | NULL    |       |
+---------+------------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

GEOMETRY型を使うにはMYISAMをENGINEとする必要があり、GPSトラックログは複数の線の組み合わせなのでmultilinestring型を使いました。
データは入れていませんが、これでとりあえずテーブルはできました。


次はPHPのインストールです。
PHPyumでインストールしようとすると、php-mysqlのインストールでエラーになるため、ソースからコンパイルしました。


makeの途中でコケるので、事前に下記の2つを入れておきました。

# yum install httpd-devel
# yum install libxml2-devel


まずPHPのサイトからphp5.3.6.tar.gzをダウンロードします。

configureのオプションはいろいろ入れないといけないのですが、今回は下記で作りました。

# tar xvfz php-5.3.6.tgz
# cd php-5.3.6
# ./configure \
--with-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-apxs2=/usr/sbin/apxs \
--enable-mbstring \
--enable-mbregex \
--enable-zend-multibyte \
--with-zlib \
--with-libxml-dir=/usr \
--enable-xml
# make
# make test
# make install
# php --version
PHP 5.3.6 (cli) (built: May  6 2011 00:30:41) 
Copyright (c) 1997-2011 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies

これできちんと入ったようです。


下記のコードを作ってコマンドライン実行して、エラーがでないのでとりあえずOK.

<?php
$db1 = mysql_connect("localhost","root","pass") or die("Could not connect database");
mysql_select_db("mytest",$db1) or die("Could not connect database");

2. GPXのトラックログMySQLのデータに変換して登録する

GPX(XML形式)のファイルを読み込んで、latitude, longitudeに該当する箇所を抜き出し、MULTILINESTRINGとして格納します。説明は省略しますが、その代わりに簡略化したスクリプトのソースを貼り付けておきます。

<?php

// Geometry検索のためにルート情報をDBに格納するプログラム。
// $db1が記録一覧があるサーバ
// $db2が今回立ち上げたサーバ

$db1 = mysql_connect("server1_IP","user","pass") or die("Could not connect database");
mysql_select_db("mytest",$db1) or die("Could not connect database");
$db2 = mysql_connect("server2_IP","user","pass") or die("Could not connect database");
mysql_select_db("mytest",$db2) or die("Could not connect database");

date_default_timezone_set("Asia/Tokyo");

// 記録のIDを取得して、GPXファイルを1つずつ格納する。
$sql = "SELECT id FROM record_data";
$result = mysql_query($sql,$db1) or die('Query failed:'.$sql);
while ($dbdat = mysql_fetch_array($result, MYSQL_ASSOC)){
	insert_trkdata($dbdat['id']);
}

// ---------------------------------------------------------------------------------------
// functions
// ---------------------------------------------------------------------------------------

function insert_trkdata($id){
	global $db1,$db2;

	$mls="";
	
    // IDごとにディレクトリが切ってあり、その中にログファイルが格納されている前提。
	$uploaddir = '/path-to-gpx/'.$id;
	if(is_file($uploaddir . '/track.gpx')){
		$xml = simplexml_load_file($uploaddir . '/track.gpx');
		$i=0;
		$init=1;
		foreach($xml->trk as $trk) {
			$j=0;
			$mlstmp="";
			foreach($trk->trkseg->trkpt as $trkpt) {
				if($j>0){
					$mlstmp.=",";
				}
				$mlstmp.=floatval($trkpt->attributes()->lon)." ".floatval($trkpt->attributes()->lat);
				$j++;
			}
			if($j>=2){
				if($init == 0){
					$mls.=",";
				}
				$mls.="(".$mlstmp.")";
				$init = 0;
			}
			$i++;
		}
		$xml=null;
	}else{
		echo "cannot find file:".$id."\n";
		return;
	}
	if(empty($mls)){
		echo "error: no trakdata:".$id."\n";
		return;
	}

	// DB格納
	$sql = "INSERT INTO geom_test
			(id, g)
			VALUES (
			'".$id."',
			GeomFromText('MultiLineString(".$mls.")')
			)";
	$result = mysql_query($sql,$db2) or die('Query failed:'.$sql);
}

mysql_close($db1);
mysql_close($db2);

3. GoogleMap上から検索できるようにする

サーバ側に対して、経度・緯度で指定したパラメータを渡すと、その範囲のデータを検索して一覧表示させます。
検索はmultilinestring(GPSログ)とpolygon(検索範囲)の重なるすべてのデータになります。


検索用のメソッドはいろいろあり、Equal, Disjoint, Intersects, Touch, Overlap, Cross, Within, Containsなどがあるようです。
こちらのサイトでそれぞれの関係を詳しく説明してくれています。今回は重なるものなら何でもひっかけたいので、Intersectsを使えばよさそうです。


最初の引用元にも書いてありましたが、ST_を付けると正確な比較をしてくれます。MySQL5.6のマニュアルにも記載してあります。

Note
MySQL originally implemented these functions such that they used object bounding rectangles and returned the same result as the corresponding MBR-based functions. As of MySQL 5.6.1, corresponding versions are available that use precise object shapes. These versions are named with an ST_ prefix. For example, Contains() uses object bounding rectangles, whereas ST_Contains() uses object shapes.

As of MySQL 5.6.1, there are also ST_ aliases for existing spatial functions that were already exact. For example, ST_IsEmpty() is an alias for IsEmpty()

上記を見る限り、"ST_"を付けなくてもよさそうですが、念のため付けておきます。


ちなみに、CentOS5.5にインストールされているMySQL5.0のマニュアルを見ると、MBRベースの近似検索しかできないことが明記されています。

Note
Currently, MySQL does not implement these functions according to the specification. Those that are implemented return the same result as the corresponding MBR-based functions.


実際のサーバ側プログラムはPHPで作りました。
簡略化してポイントだけ抜き出すと、例えばこんな感じで作ります。

<?php
$lat1=floatval($_GET['lat1']);
$lon1=floatval($_GET['lon1']);
$lat2=floatval($_GET['lat2']);
$lon2=floatval($_GET['lon2']);

$db2 = mysql_connect("server2_IP","user","pass") or die(json_encode(array()));
mysql_select_db("mytest",$db2) or die(json_encode(array()));

$query = "SELECT id from geom_test ".
	"WHERE ST_Intersects(GeomFromText('Polygon((".
	$lon1." ".$lat1.", ".
	$lon1." ".$lat2.", ".
	$lon2." ".$lat2.", ".
	$lon2." ".$lat1.", ".
	$lon1." ".$lat1." ".
	"))'), g)";
$result = mysql_query($query,$db2) or die(json_encode(array()));
$idlist=array();
while ($dbdat = mysql_fetch_array($result, MYSQL_ASSOC)){
	$idlist[]=$dbdat['id'];
}
mysql_close($db2);

実際はこのIDから記録のタイトルや写真などを引っ張って、json形式で応答させます。


最後にGoogle Maps APIでPolygonを書いて、「記録検索」ボタンを押すと結果が表示されるようにすれば完了。ポップアップで検索結果を表示させるために、jQueryInterface elementsを利用しました。


全ルート表示の機能は、1000以上のルートを、ユーザごとの地図に投影する方法Google Maps API v3対応のソースに変更して実現しています。


詳しくは実装したページソースコードをのぞいてみてください(というか説明が大変なので、サボってるだけですが・・・)

最後に

実際に動かしてみたところ、6万のGPSトラックデータに対して検索しても、すぐに応答が返ってきます。
富士山や丹沢あたりの人気のあるエリアを検索すると、最初は少し重く応答に時間がかかりました。しかし、しばらくするとメモリキャッシュに載ったのか、検索をかけてもHDDアクセスすらなく即座に応答が返ります。

自分の日曜大工的なプログラミングでは、ここまで高速な検索はできません。
最初は、四角と線が交差するかどうかをどう判定するのか?から考え始めようとしていましたが、そこからスタートすると性能は出ないし作るのも大変です。これがMySQLを活用するだけでこんなに簡単&高速に実現できます。

こんな素晴らしい機能を作っていただいたMySQLデベロッパーの方々に感謝します。

ブログパーツ機能を強化

以前まであったブログパーツの機能を強化してみました。

以下のようなルート図に加えて、標高グラフもブログに簡単に張ることができるようになりました。

ぜひ使ってみてください!