前回の記事で、MSE の REST API を使ってクライアントの位置情報を JSON で取得し、Python の構造体に変換しました。今回は、これをマップへと反映させていきます。マップ情報を表示する処理のために、画像処理ライブラリのPillowをインストールしておいてください。
そして、前回のブログ記事で紹介したコマンドを「cmx1.py」という名前のスクリプトに入力して保存しておきます。シェル(Windowsの場合、コマンドプロンプト)で「python -i cmx1.py」と入力すれば、前回の続きからインタラクティブ モードを開始できます。(もちろん、インタラクティブモード開始後、コピー&ペーストしても構いません。)
(以下、すべて大文字の単語は環境に合わせた値、イタリック体はレスポンスです)
mse_url = ‘https://<MSE>/api/contextaware/v1/’
username = ‘USERNAME’
password = ‘PASSWORD’
import requests
get_clients = requests.get(mse_url + 'location/clients/', auth=(username, password), headers = {'Accept': 'application/json'})
get_clients_json = get_clients.json()
for 文で参照したい値を取得
マップ情報を取得する方法はいくつかありますが、JSON の配列を Python のリストに変換してありますので、これを for 文を使って取得していきます。
>>> print {i['MapInfo']['mapHierarchyString'] for i in get_clients_json['Locations']['entries']}
set([u'CAMPUS>BUILDING>FLOOR', ...])
これで、クライアントが位置しているマップの一覧が取得できます。
マップ情報を処理
次に取得したマップの一覧からヒートマップを作成したいフロアを選択し、前回のクライアントの位置情報の処理と同様に JSON の情報を変換していきます。
>>> get_maps_info_json = requests.get(mse_url + 'maps/info/CAMPUS/BUILDING/FLOOR', auth=(username, password), headers = {'Accept': 'application/json'}).json()
>>> print get_maps_info_json
{u'Floor': {u'GPSMarker': ..., u'Image': {u'imageName': u'DOMAIN_0_1234567890123.PNG'}, u'Exciter': ..., u'Dimension': {u'offsetX': ..., u'width': 234.5, u'length': 98.7, u'unit': u'FEET'}, u'LocationFilterRail': ...}}
ここからフロアのサイズと画像を取得します。
>>> floor_width = get_maps_info_json['Floor']['Dimension']['width']
>>> floor_length = get_maps_info_json['Floor']['Dimension']['length']
>>> print floor_width, floor_length
234.5 98.7
>>> get_maps_imagesource = requests.get(mse_url + 'maps/imagesource/' + get_maps_info_json['Floor']['Image']['imageName'], auth=(username, password))
Pillow の Image モジュールと StringIO モジュールをインポートして画像を読み込み、サイズを表示します。
>>> from PIL import Image
>>> from cStringIO import StringIO
>>> map = Image.open(StringIO(get_maps_imagesource.content))
>>> print map.size
(1234.5, 678.9)
これでフロア画像を処理するための情報の取得と画像の読み込みが完了しました。
これは補足となりますが、最後に読み込んだ画像を保存してみてください。
>>> map.save('floor.png')
保存した画像をみると、MSE 上のフロア画像 (https://<MSE>/api/contextaware/v1/maps/imagesource/DOMAIN_0_1234567890123.PNG) と同じであることが確認できます。
前回の REST API で取得した JSON の構造体への変換、そして今回の for 文での値を取得といった処理は、CMX に限らず Web API で頻出しますので、誰にでも役立つ手法です。
次回の最終回では、前回の記事で取得したクライアントの位置情報を、今回の記事で読み込んだ画像へと反映させていきます。