前回までの記事でクライアントの位置情報の取得、およびフロア情報の取得と画像の読み込みが完了しました。最後にクライアントの位置情報からヒートマップを作成し、フロア画像へ反映させていきます。
ヒートマップを作成するので、heatmap モジュールをインストールしておいてください。そして、前回までのブログ記事で紹介したスクリプトを「cmx2.py」という名前で保存しておきます。シェル(Windowsの場合、コマンドプロンプト)で「python -i cmx2.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()
get_maps_info_json = requests.get(mse_url + 'maps/info/CAMPUS/BUILDING/FLOOR', auth=(username, password), headers = {'Accept': 'application/json'}).json()
floor_width = get_maps_info_json["Floor"]["Dimension"]["width"]
floor_length = get_maps_info_json["Floor"]["Dimension"]["length"]
get_maps_imagesource = requests.get(mse_url + 'maps/imagesource/' + get_maps_info_json["Floor"]["Image"]["imageName"], auth=(username, password))
from PIL import Image
from cStringIO import StringIO
map = Image.open(StringIO(get_maps_imagesource.content))
for とif文を組み合わせて参照したい値を取得
対象としているフロアに存在する全クライアントの位置情報をタプルで取得し、リストにします。
>>> pts = [(i['MapCoordinate']['x'], floor_length - i['MapCoordinate']['y']) for i in get_clients_json['Locations']['entries'] if i['MapInfo']['mapHierarchyString'] == 'CAMPUS>BUILDING>FLOOR']
>>> print pts
[(123.45, 30.81), ...]
これで、位置情報のリストが取得できます。
ヒートマップを作成
次にheatmapモジュールをインポートし、取得した位置情報のリストからヒートマップを作成します。
>>> import heatmap
>>> hm_img = heatmap.Heatmap().heatmap(pts, size=map.size, area=((0, 0), (floor_width, floor_length)))
最後にフロア画像へ張り付け、保存します。
>>> map.paste(hm_img, (0, 0), hm_img)
>>> map.save('heatmap.png')
以上、十数行のコードでヒートマップが作成できました。
このシリーズのコードで REST や JSON の扱い方だけでなく、Python の基本となる数や文字列、リスト、辞書、セット、タプルといったデータ型、for や if 文といった制御構文、算術演算子や比較演算子が出てきましたので、プログラミングに馴染みのない方にも使い方の一助となればと思います。