オラクルで位置情報アプリを作ってみる

新井庸介氏(以下、新井):お集まりいただきましてありがとうございます。このセッションは、私、日本オラクルでクラウドのアーキテクトを務めております新井と、エンジニアとして一緒に動いている早川の2名でお届けします。

「Oracle GO!  私の位置情報アプリをクラウドで簡単に作ってみる」ということで、デモを中心に「こんなこともできるんだ」というのをみなさまにお見せします。

では早川くんは途中から手伝ってもらうので、いったんここで引っ込みます。

最初に少しだけ自己紹介をさせてください。改めまして、新井庸介と申します。日本のオラクルでクラウドアーキテクトを務めております。これは、オラクルクラウドの提案活動に関してさまざまな技術支援をご提供する役割です。

クラウドアーキテクトも何名かいるんですけれども、私の役割として得意な範囲は、インフラよりは少し上みたいな感じのところです。例えば、クラウドを使ったアプリケーション開発の方法論みたいな話ですね。MicroservicesですとかDevOpsみたいなお話をさせていただくことがあったりします。

あと、(スライドを指して)ここに長ったらしく「High-Productivity Application Platform as a Service」と書いてありますけど、簡単に高速にアプリケーションを開発できるようなクラウドサービスのご提案をしたり、ユーザーグループのマネジメントをしたりなどやっております。

最近は機械学習ですね。今日は機械学習のセッションがすごく人気みたいで、どこも大入りと聞いてます。そういった、機械学習に携わることも増えてまいりました。

クラウドというとPaaSやIaaSだけではなくて、オラクルはSaaSを絡めた提案もよく関わっています。

私は、オラクルでいうとフロント寄りのソーシャルリスニングやソーシャルエンゲージメントといった、SNSを活用したマーケティング活動やマーケティングオートメーションについてお話しさせていただくことがあります。

という感じで、最近はクラウドをやるようになってからどちらかというと上物系の仕事が多くなっています。しかし、クラウドをやる前はJavaやWebLogicにけっこうどっぷり浸かっていました。

この本についてです。Java EE 6の本としては当時これしかなかったので、見たことがある方もいらっしゃるのではないかと思います。僕と寺田佳央くんでやろうと作ったのは、けっこういい思い出になっています。

今はわりとクラウドな感じの仕事をしています。

観光振興としても注目されている位置情報

今日は「位置情報アプリを作ってみよう」というお話をさせていただくわけですが。

位置情報アプリと言われると、みなさんはどういったものを思い浮かべるでしょうか。中でも非常にわかりやすいのが、これなんじゃないかと思います。

今は最初の頃ほどの熱狂はないにせよ、まだまだプレイされている方はたくさんいらっしゃいるんじゃないかなと思います。僕も子どもに「モンスターボールがないんだ」と言われて日々困っていたりしたんですけれども。

位置情報を活かしたアプリケーションと言えば、非常にゲームが多いですよね。しかし、位置情報はゲームだけのものではなく、ほかにもいろんなアプリケーションがあるわけです。

例えば、見守りもそうですよね。お子さんやペットなど、カバンや首輪にタグをつけておいて、一定距離を離れたらアラートが鳴るようなものです。いろいろな製品がありますが、これにも位置情報がうまく活用されているアプリケーションであり、実装の1つといえるんじゃないかと思います。

これは観光庁のホームページです。位置情報は観光振興、とくに訪日外国人の方々がどういった行動をしているかを分析し、その後につなげていく部分でもけっこう注目されています。

そのため、みなさんもお仕事、あるいはちょっとした遊びで位置情報を扱ったり、地図上でいろいろなものを出すアプリケーションを作られたり、作ってみようと思っている方もけっこういるんじゃないかなと思います。

ところが、位置情報=オラクルと言われてもなかなかピンとこない。「結びつくの?」と思う方も多いかと思います。その上、クラウドと言われるとバラバラのことを言われているような気がしている方もまた多いかと思います。

実は、クラウドによってオラクルの位置情報機能を使えるという、いい関係ができつつあります。それを活用したアプリケーションを2つほど、今日はお目にかけます。

「半径700メートル内のIT企業を教えてくれる」アプリ

というわけで、デモ1が空間検索をするアプリケーションです。では、iPhoneのほうに画面を切り替えていただけますでしょうか。

これは自分の現在地から半径何百メートルを検索対象にして、それにひっかかったロケーション情報をひっぱってくるというものです。

いろいろポイントしてますけれど、今回は自分のデフォルトが700メートル設定なので、今いるところから半径700メートルにあるITっぽい会社を一覧で出してくれるアプリを作ってみました。「就職活動とかで役に立つのかな?」と思って作ってみました。

ここから半径700メートルですと、品川駅方面で4つぐらい見つかっていますね。1つピッと出してみると、はい、マイクロソフトさんがありますね。

例えばマイクロソフトさん、それからISIDさんもこの700メートル圏内にあるみたいですね。それから、NTTさんとかもあるみたいですね。

こういった感じで「NTTがあるから行ってみようか」「チェックインしようか」とできる。カメラを立ち上げて「NTTへ行きました」みたいな感じで写真を撮ってチェックインしてみる……。

この写真はそこにも保存されませんので、ご安心ください。単なるデモです。「チェックインしていますか?」「はい」という感じで、自分の行った所が登録されていく。そういったアプリケーションなんですね。

半径700メートルですと、4社ほど検索対象に引っかかりましたね。この半径をさらに1キロ広げてみると……けっこうたくさん引っかかりましたね。少し遠いところをみてみると、ドコモさんのオフィスがあるんですね。

「ここにもチェックインしようかな」と、はい、ドコモさんにチェックイン。という感じで、自分がいろんなIT会社に訪問している履歴がたまっていきます。「自分がどれくらい歩いているのか」がわかっていく。そんなアプリケーションですね。

位置情報を管理し、分析するOracle Spatial

今見ていただいたデモは「生まれて初めて見た」という方はそれほどいないと思います。「ありそうな感じのデモだね。GoogleマップのAPIを使うとあんなことができるんでしょう?」と思われている方もいるかもしれません。中身は、こんな感じになっています。

フロントから順にご説明します。フロントエンドはOracle JETというオラクルが出しているJavaScriptのフレームワークで、HTML5で書いています。地図はGoogle マップを使ってますけれど。

バックエンドとのつなぎは、オラクルが持っているmobile Backend as a ServiceのMobile Cloud ServiceでAPIを出しています。ビジネスロジックは、JavaScript、Node.jsで書いて、PaaSでホストしています。

実際に空間検索をやらせているのは、Oracle Database Cloud Serviceが持っているSpatialという機能でやっています。

そのため、このアプリケーションでGoogle マップを使っているのは、サーバから持ってきたスポット・ロケーションの情報をポイントしているものだけです。検索などは一切、Google マップのAPIは使っていません。「自分のいる位置から半径1キロ」みたいな検索はすべてデータベースでやっています。

データベースで空間検索というと、ピンと来ない方がほとんどなんじゃないかなと思います。実はこのOracle Database Cloud Serviceに入っているこの「Spatial」でけっこうおもしろいことができるのです。今日はそこに絞って「こんなことできちゃうんですよ」をご紹介したいなと思います。

Oracle Spatialですが、正式な機能名はOracle Spatial and Graphです。これはOracleのクラウドのために作られた機能ではなく、Oracle Databaseにもともと備わっている機能です。オンプレではオプションとして提供しています。

地理空間……今お話ししたような緯度経度のような位置情報、それからグラフ、オブジェクトとオブジェクトの関係性みたいなものを管理して分析するための機能です。

「こういうのが流行っているから最近作ったんでしょ?」と思いきや、かなり長い歴史を持っている機能です。Oracle7からもう20年以上にわたって継続的に機能追加し、改善を加えてきた歴史のある機能なのです。

20年超というと、だいたいJavaと同じぐらいの年齢なわけですね。Javaは少し前に20歳を迎えましたけど。それくらい古くから作られて、ブラッシュアップされている機能です。「聞いたことないな」という方がほとんどじゃないかと思います。しかしながら、北米およびヨーロッパを中心に、かなり多くの活用事例をいただいている機能です。

業種はわりと偏っています。まずユーティリティ系、エネルギー系。電力、水道、ガス。「どういったパイプラインを通すか」みたいな分析に使うなど。あとは通信。輸送・運輸。これがまさにロジスティクスで「どう配送するのが一番効率的か」みたいな計算が必要になるようなインダストリですよね。そして、自治体とか国とかです。国もとくに硬めの地理や治水など「ダムどうする」みたいな話などがあります。

さらに国防ですね。陸軍、空軍でけっこう使ってもらっているらしいです。こういうものを出せるアメリカはすごいなと思いますが……。軍関係でかなり引きが強い機能のようです。

このように、一般市民の生活にそこまで近いわけじゃないですが、地理や位置に関して非常に複雑なことをしなければいけないようなお客さまに支えられて、この製品はブラッシュアップを重ねてまいりました。そのため、はっきり言ってかなり高機能です。

単純な空間検索からカーナビゲーションまで

Spatialでできることは、冒頭で申し上げましたようにかなり多岐にわたっております。単純な空間検索から、カーナビゲーションのような経路の検索・経路の最適化、それからグラフというノード同士の位置関係の分析。かなりたくさんのことができるのですが、今回の実装ではSpatialをどんなふうに使ったかを少しご紹介したいと思います。

先ほどのアプリケーションでは、自分が現在いる緯度経度から半径700メートルや半径1キロにあるスポットの、つまりマイクロソフトさんというスポットの名前と緯度経度を一覧で取得して地図の上にマッピングするという実装をしました。(スライドを指して)それはSQLではこう書いています。

まず、検索対象の表はこの「STAFFS表」なんですけど。これは簡単ですね。名前、マイクロソフトなどが入っていて、位置の情報は全部この「geom」というカラムに入っています。

geomというカラムは、別にnumber型でもvarchar型でもなくて、SDO_GEOMETRYという構造体でデータを保持しています。

この構造体がどうなっているかというと、こういう構造になっています。中のエレメントを1つずつお話しすると、まず最初のここでSDO_GTYPEでデータのタイプを指定します。

今回はスポット情報なので2次元の点を設定してます。ほかにも2次元の線……これ2002ですね。あと3次元の点。3001。2次元の面とか3次元の立方体、ポリゴンなど、いろいろデータを指定できます。

次のエレメントでは測地座標系の指定をしています。測地系もいろいろあるみたいで、ぜひ検索していただければその深淵の世界が覗き見られるかなと思います。今回は世界測地系を使っています。

次のSDO_POINT_TYPEは、点オブジェクトで使う座標を示すエレメントです。x,y,zで示す点オブジェクトの座標を示しています。経度と緯度と高さを設定していますね。2次元の点の場合には高さはありません。

SDO_ELEM_INFOとORDINATESは、この場合は使いません。

こういう感じで「マイクロソフトさん、緯度経度ここ」「ISIDさん、緯度経度ここ」と表には入っています。

高速道路と街の情報をSQLに入れる

WHEREでどう書いているかというと、このSDO_WITHIN_DISTANCEという空間検索関数を使っています。これは、検索対象のgeomカラムですね。それとここの情報が……ちょっと拡大しましょうかね。

ここの情報 (注:geom)とここの情報が (注:SDO_GEOMETRY)が半径何キロメートル以内なのかを書いているわけですね。geom表は先ほどお見せしたように、マイクロソフトさんの緯度経度、ISIDさんの緯度経度です。

そこに書いてあるSDO_GEOMETRYうんぬんかんぬんは、自分のいる場所を表しています。スマホから自分のいる場所の経度と緯度を送っているんですけど、それをこう書く。これが自分のいる場所ですとなっているわけですね。

STAFFS表の中のgeomカラムと自分の現在地が半径1キロや0.7キロだったらデータを引っ張ってくる、と書いています。

僕はGoogle マップも実装したことがあるんですけど、こんな感じでSQLで3行4行でやってしまうという、けっこうおもしろい機能がこのOracle Spatialです。SQLで書けるとなにがうれしいのか。いくつかありますけど、まず1つは業務データと絡めた検索がとても簡単というのがありますね。

別の例で説明します。これはとある高速道路から15マイル以内に存在する……15マイル北でも南でもなんでもいいんですけど、そこに存在する30万人以上の人口を持つ都市の検索をSQLで書いてみたところです。3行で書いていますね。

これはどう書いているのかといいますと、今回は表を2つ使います。都市の情報が入っているCITIES表と、高層道路の情報が入っているINTERSTATES表ですね。都市はいいですね。先ほど同じように都市の名前があります。例えば、府中や三鷹、調布、そんな街の名前があって「人口何万人です」がここに入っているというものです。

これが高速道路の情報が入っているINTERSTATES表です。高速道路の番号と、それから位置情報が入っています。

高速道路の位置情報はこうやって管理しています。今回は、高速道路の2次元の線です。2002ですね。高速道路の場合、2次元の線なので、別に緯度経度の1点がわかるわけではない。そのため、SDO_POINT_TYPEは使わないです。代わりにSDO_ORDINATESとSDO_ELEM_INFOという要素を使います。

SDO_ORDINATESは、線の屈曲点の配列をすべて格納しておく場所です。ちょっと固く書いていますけど、例えば中央高速だと、高井戸から始まって調布あたりで1回ぐにょってなって、インターが別にあって……みたいな感じですけれども。その線の屈曲点のポイントをすべて緯度経度でカンマ区切りで持たせるのがSDO_ORDINATESです。

SDO_ELEM_INFOで、このORDINATESの解釈情報。2つのポイント間は直線なのか円弧なのか、円弧の半径はどんなものなのか。そういった情報をここに入れる感じになります。

こんなふうに、高速道路の情報と街の情報を入れておいてSQLを書けるわけです。

内接、外接、交錯をすべてSQLで表現

このSQLは、街のポイント情報と道路の2次元の線の情報がdistance 15マイル以内だったら検索対象にするというクエリです。とてもシンプルに書いていますよね。かつ、人口が30万人以上だったらという感じです。

こんな感じで、空間検索と普通のRDBにおけるいろいろなデータの検索を絡めてぽーんとできるのはけっこう便利なんじゃないかなと思います。

このSpatialはさまざまな検索ができるようになっていて、ほかの例をあと2つご紹介します。

まず例2は、ある都市から15マイル以内に存在するすべての高速道路の検索です。先ほどは高速道路から15マイル以内に存在するすべての都市でしたが、これは逆パターンですね。ある都市から15マイル以内に存在するすべての高速道路の検索です。

これはインターチェンジをどこかに作ったらいいんじゃないかと考えるような方にとっては、なかなか魅力的な検索なんじゃないかなと思います。こういうものも先ほどと入れ替えるだけで簡単にできます。

それからあと例の3番ですね。「とある高速道路に最も近い5都市と、高速道路からそれらの各都市までの最短距離マイル」という、少し長い名前になっておりますが。

これもここにあるように、SDO_NNと書いてますが、最も近くにある位置情報を引っ張ってくる空間演算子ががあらかじめ定義されていて、これに各カラムを当て込むと簡単にこういう検索ができます。

要は、これが街の場所ですね。拡大してみますと、これが街のロケーション、点情報ですね。これが高速道路の線の情報。上位5個を持ってきましょうね、という感じですね。

検索して上位5個を持ってきて、「distance_in_miles」とやるとその距離まで出てしまう。空間検索を可能する空間演算子を多く積んでいるSpatial。これはおもしろい機能です。

2つのオブジェクトの位置情報の関係性を検索するための空間演算子を、Oracle Spatialは多く提供しています。

点と点でも、点と線でも、点と面でも、面と面でも、なんでもいいんですけれども。例えば、左から内包している、内接している、外接している、交錯しているなど、こういったものをすべてSQLで表現することができます。

Spatialが持っている「経路検索機能」

道路同士の交錯や、ある土地に対してこのスポット情報が接しているのか、内包しているものをすべてSQLで表現できる。多くの空間演算子を提供しているのがこのSpatialです。

Oracle Databaseというと、普通に業務データをためて検索したりすると思われるかもしれません。しかし、実は位置情報を扱う機能がこんなに豊富にあって、モバイルアプリが簡単に扱えるのは、みなさんにとっても発見なんじゃないかなと思い、少しご紹介をしています。

さて、いい感じに進んでいますので、デモ2ができそうです。

ここまででOracle Spatialとはなんなのか、それからOracle Spatialが持っているたくさんの機能のうちの1つ、空間検索についてご紹介をしました。

ただSpatialはほかにもさまざまな機能を持っております。これもけっこうおもしろい機能です。Spatialが持っている機能その2、経路検索について、またデモでご紹介をしたいと思います。