はつねの日記

Kinect, Windows 10 UWP, Windows Azure, IoT, 電子工作

Windows Azure Mobile Servicesで位置データを扱う(その1)

Windows Azure Mobile Servicesは、スマートフォンタブレットなどモバイル系ネイティブアプリのバックエンドを支える目的で提供されているBaaS (Backend as a Service) です。 

BaaSで必要な機能としては、認証、通知、データストアなどが想定されますが、モバイル系、つまり、MBaaS (Mobile Backend as a Service) として考えて場合にWindows Azure Mobie Servicesに不足していると思える機能があります。
それが位置情報の取り扱いです。

 

SQL Serverには「geography」型があるのでWindows Azure Mobile Servicesでもサポートしてもよさそうなのですが、実装されそうな予定はまだなさそうです。

そこで、カスタムAPIを使ってWindows Azure Mobile Servicesで位置情報を扱う方法を紹介していきたいと思います。
いろいろ複雑な要素も絡むので、シリーズとして何回かに分けて投稿しますので、よかったらお付き合いください。

 

それではまずは、Windows Azure Mobile Servicesを使えるようにして、カスタムAPIも使えるようにしてみましょう。

このあたりは、


を見てください(順序が前後して申し訳ありません)。

 

準備ができてたら本題である位置情報を格納するテーブルをWindows Azure Mobile Servicesが使っているSQL Serverスキーマに作成してみましょう。
テーブルの作成は、Windows Azure SQL Server管理ポータルからもできますし、Visual StudioWindows Azure SQL Serverに接続してもできます。

GUIでも設定できますが、説明しやすいのでDDL文で説明します。

CREATE TABLE hogehoge.Geo (
    Id       INT NOT NULL IDENTITY(1,1),
    Location GEOGRAPHY NOT NULL,
    Geo_Lat  AS (Location.Lat)  PERSISTED NOT NULL, 
    Geo_Lon  AS (Location.Long) PERSISTED NOT NULL, 
    Address  NVARCHAR(50),
    Name     NVARCHAR(50),
    Remarks  NVARCHAR(50),
    PRIMARY KEY CLUSTERED (
        Geo_Lat ASC,
        Geo_Lon ASC,
        Id ASC
    )
)

クラスタ化インデックスのために位置情報を緯度と経度に分けてIndexを張っていますが、このあたりは
SQL Server 2012 での空間ポイントデータクエリのチューニング (ja-JP)
を参考しています。

 

それではここにデータを入れてみましょう。

INSERT aedsos.AedGeo (Location,Address,Name) VALUES (geography::Point(35.75025, 139.710778, 4326),'東京都板橋区板橋2-60-15','板橋警察署');

 

次に検索してみましょう。単純に検索してもつまらないので別の位置を与えて距離を求めてみましょう。

-- 志村警察署からの直線距離(m)
DECLARE @g geography;
SET @g=geography::Point(35.772778, 139.699361, 4326); 
SELECT ROUND(@g.STDistance(Location),0) AS DIST FROM aedsos.AedGeo WHERE ID=2;

2704

-- 板橋消防署からの直線距離(m)
SET @g=geography::Point(35.750080,139.711105, 4326); 
SELECT ROUND(@g.STDistance(Location),0) AS DIST FROM aedsos.AedGeo WHERE ID=2;

35

どうですか?簡単に直線距離が求まってしまいましたね。

 

今回はここまで。
次回はカスタムAPIを使ってこのテーブルを検索する方法をご紹介します。