PlaceEngine API ローカルアプリケーションプログラミング
PlaceEngineをWebサービスとしてではなく、ローカルアプリケーションから直接利用するための機能です。現状ではとくにライブラリは提供していません。以下では java を使った例を示しますが、他のプログラム言語からでも同様に利用することが可能です。
全体の流れ
ローカルアプリケーションを利用する際にも、電測用にPlaceEngineクライアントを起動して下さい。PlaceEngineクライアントとはHTTPプロトコル経由で通信することができます。位置情報取得は、
- PlaceEngineクライアント(http://localhost:5448)から電測情報を取得し、
- それをPlaceEngineサーバー(http://www.placeengine.com)に送信して位置情報を得る
アプリケーションキーの取得
PlaceEngineクライアントおよびPlaceEngineサーバーを利用するために、アプリケーションキーが必要です。
PlaceEngine連携サイト用アプリケーションキー取得ページ で、アプリケーションキーを取得して下さい。URLの欄にはローカルアプリケーションの実行イメージ名を入れて下さい。たとえば abcd.exe なら abcd を。Javaプログラムの場合は、java (javawで実行する場合はjavaw) を指定して下さい。
プログラム例1 : Hello Location in Java
実行すると、現在位置を標準出力に書き出すだけのjavaプログラムです ( ソースコード ) (プログラムを簡略化するためにエラー処理を省いています)。
import java.net.*; import java.io.*; import java.util.*; /** * PlaceEngine API Sample */ public class PeTest { public static final String appk = "......"; //アプリケーションキー /** HTTPリクエストを発行し、レスポンスを文字列で返す **/ public static String getURL(String urlstr) throws MalformedURLException, ProtocolException, IOException { URL url = new URL(urlstr); HttpURLConnection urlc = (HttpURLConnection)url.openConnection(); urlc.connect(); BufferedReader reader = new BufferedReader(new InputStreamReader(urlc.getInputStream(), "UTF-8")); String s = ""; for (String line = null; (line = reader.readLine()) != null; ) { s += line; } reader.close(); urlc.disconnect(); return s; } /** locリクエストのリターン値(json形式)を分析 **/ public static void printInfo(String s) { s = s.substring(1,s.length()-1); String param[] = s.split(","); String param2[] = s.split("\\{"); if (param.length >= 4 && param2.length >= 2) { System.out.println("Lat\t" + param[1]); System.out.println("Lon\t" + param[0]); String info[] = param2[1].substring(0, param2[1].length()-1).split(","); for (int i = 0; i < info.length; i++) { String tk[] = info[i].split(":"); String name = tk[0].substring(1,tk[0].length()-1); String value = tk[1]; System.out.println(name + "\t" + value); } } } public static void main(String[] argv) throws MalformedURLException, ProtocolException, IOException { /* System.setProperty("http.proxyHost", "...."); // 必要があればproxyの設定 System.setProperty("http.proxyPort", "...."); */ System.setProperty("http.nonProxyHosts", "localhost"); //ローカルホストは除外 // 電測情報を取得する long t = System.currentTimeMillis() / 1000; String req = "http://localhost:5448/rtagjs?t=" + t + "&appk=" + appk; System.out.println("-->PlaceEngineClient\n" + req + "\n"); String res = getURL(req); System.out.println("PlaceEngineClient-->\n" + res + "\n"); // 電測情報から位置情報を得る String v[] = res.substring(9, res.length()-2).split(", *"); String rtag = v[0].substring(1, v[0].length()-1); int numap = Integer.parseInt(v[1]); if (numap > 0) { String req2 = "http://www.placeengine.com/api/loc?t=" + t + "&rtag=" + rtag + "&appk=" + appk + "&fmt=json"; System.out.println("-->PlaceEngineServer\n" + req2 + "\n"); String res2 = getURL(req2); System.out.println("PlaceEngineServer-->\n" + res2 + "\n"); // 得られた位置情報(json形式)の表示 printInfo(res2); } } }
この例では、PlaceEngineサーバーに位置を問い合わせる際に、JSON (javascript object notation)形式を要求しています(fmt=json)。JSON形式については www.json.org 等を参照して下さい。
proxyの設定をする場合は, PlaceEngineクライアントと通信できるようにローカルホストを除外するようにして下さい。
実行結果:
C:\>java PeTest -->PlaceEngineClient PlaceEngineクライアントへのリクエスト http://localhost:5448/rtagjs?t=1165321003&appk=S7Rk0Bm3D.... PlaceEngineClient--> PlaceEngineクライアントからの戻り値 recvRTAG("CgS4isZH-BPX....",6,1165321003,null,null); -->PlaceEngineServer PlaceEngineサーバーへのリクエスト http://www.placeengine.com/api/loc?t=1165321003&rtag=CgS4isZH-BPX....&appk=S7Rk0Bm3D....&fmt=json PlaceEngineServer--> PlaceEngineサーバーから戻り値 [139.730472,35.625954,15,{'addr':'東京都品川区東五反田三丁目','msg':'位置が取得できました','floor':'2F','t':1165321003}] Lat 35.625954 Lon 139.730472 addr '東京都品川区東五反田三丁目' msg '位置が取得できました' floor '2F' t 1165321003
プログラム例2 : Hello Location Local 版 in Java
現在位置(緯度・経度)を、LocalDB機能を用いて推定します。PlaceEngineサーバーとの接続は必要ありません。
( LocalTest.java ソースコード)
PlaceEngineクライアント インタフェース
PlaceEngineクライアントへのリクエストはhttp://localhost:5448 へのGETリクエストの形式を取ります。
http://localhost:5448/ackjs?パラメタ
PlaceEngineクライアントの存在を確認します。
パラメタ:
パラメタ名 | 値 | 必須/オプション |
---|---|---|
t | タイムスタンプ | 必須 |
タイムスタンプは、秒で測定した、現在時刻と協定世界時の UTC 1970年1月1日 午前0時 との差です。Javaでは System.currentTimeMillis()/1000 で求めることができます。
戻り値:
ackRTAG(version);
値 | 説明 |
---|---|
version | バージョン文字列 ("w061130" など) |
http://localhost:5448/rtagjs?パラメタ
WiFi電測を行います。
パラメタ:
パラメタ名 | 値 | 必須/オプション |
---|---|---|
t | タイムスタンプ | 必須 |
appk | アプリケーションキー | 必須 |
戻り値:
recvRTAG(rtag,numap,t);
値 | 説明 |
---|---|
rtag | 電測情報文字列 |
numap | 観測できたアクセスポイント数, あるいはエラーコード |
t | タイムスタンプ |
numap 値 | 説明 |
---|---|
> 0 | 観測できたアクセスポイント数 |
-1 | WiFi取得できず (無線LANがOFFなど) |
-2 | AP数0 (WiFi電測できたがAPが発見できなかった) |
-4 | 電測が拒否された |
-5 | timeout |
-6 | アプリケーションキー未設定/不正 |
PlaceEngineクライアントインタフェース (LocalDB機能)
以下の機能はPlaceEngineクライアントw070606,m070606,o080131以降で導入された LocalDB機能 に関するものです。それ以前のクライアントでは利用できません。
LocalDBによる位置推定は、単純に緯度経度のみを求めるもので、以下の情報は提供されません:
- 住所
- フロア情報
- 推定精度
- 推定に利用されたアクセスポイント数
LocalDBによる位置推定は、ローカルアプリケーションからのみ利用可能です。Webアプリケーションでは従来通り PlaceEngineサーバーの機能をご利用下さい。
http://localhost:5448/listdb
利用できるLocalDB名を列挙します。
パラメタ:
パラメタ名 | 値 | 必須/オプション |
---|---|---|
check | 1:データベース更新のチェック | オプション |
戻り値:
以下のようにLocalDB名を列挙したリストが返されます。
["all", "tokyo"]
check=1 を指定すると、ダウンロードされているLocalDBが最新のものかどうかを確認します。LocalDB名、タイムスタンプ、最新かどうか(1:最新、0:サーバーにより新しいLocalDBが存在する)を列挙したリストが返されます:
[["all",1192479058,1],["tokyo",1192478712,1]]※ LocalDBは、PlaceEngineクライアントの設定→LocalDB→アップデートで最新版をダウンロードすることができます。
http://localhost:5448/locdb?パラメタ
WiFi電測を行い、PlaceEngineクライアントが保持するローカル位置データベース(LocalDB)を利用して位置推定を行います。(PlaceEngineサーバとは通信しません)
パラメタ:
パラメタ名 | 値 | 必須/オプション |
---|---|---|
t | タイムスタンプ | 必須 |
appk | アプリケーションキー | 必須 |
戻り値:
以下のように経度、緯度、エラーコード, 付加情報からなる文字列
[x,y,result,info]
値 | 説明 |
---|---|
x | 経度 |
y | 緯度 |
result | 位置推定に成功した場合(>= 0), エラーコード(<0の場合) |
info | 属性情報 |
現状では、infoは常に"{}"です。
resultの意味は以下の通りです
0 | 電測が成功し、位置がx,yに取得できた |
-1 | WiFi取得できず (無線LANがOFFなど) |
-2 | AP数0 (WiFi電測できたがAPが発見できなかった) |
-4 | 電測が拒否された |
-5 | timeout |
-6 | アプリケーションキー未設定/不正 |
-110 | 位置取得できず(データベース未登録) ※ |
※ 電測が成功しても、LocalDBに対応するアクセスポイント情報が存在しない場合、x,yも0,0となります。
PlaceEngineサーバーインタフェース
PlaceEngineサーバーへのリクエストは、 http://www.placeengine.com/api へのGETリクエストの形式をとります。
http://www.placeengine.com/api/loc?パラメタ
電測情報から位置を推定ます。
パラメタ:
パラメタ名 | 値 | 必須/オプション |
---|---|---|
rtag | 電測文字列 | 必須 |
t | タイムスタンプ | 必須 |
appk | アプリケーションキー | 必須 |
fmt | 省略、あるいはjson | オプション |
quote | 戻り値の文字列形式*1を指定 | オプション |
戻り値:
recvLoc(x,y,range,info); -- fmtが省略された場合 [x,y,range,info] -- fmt=json の場合
値 | 説明 |
---|---|
x | 経度 |
y | 緯度 |
range | 推定誤差(>0の場合), エラーコード(<0の場合) |
info | 属性情報 |
info は {"属性名1":値1,"属性名2":値2,...} といった形式をもつ文字列で、以下の属性があります:
info 属性名 | 説明 |
---|---|
addr | 住所文字列 |
msg | フィードバックメッセージ |
floor | フロア情報("2F"など) |
t | タイムスタンプ |
PlaceEngineクライアントインタフェース (ハイブリッド測位)
http://localhost:5448/getlocjs?パラメタ
GPS,ローカルDB,PlaceEngineサーバを使用したハイブリッド測位を行います。
パラメタ:
パラメタ名 | 値 | 必須/オプション |
---|---|---|
appk | アプリケーションキー | 必須 |
fmt | json または jsonp、省略時は jsonp | オプション |
m | 測位メッソッド*1 をカンマ区切りで指定、省略時は g,l,p | オプション |
usecache | 1:測位結果キャッシュ*2 を使用する、0:使用しない、省略時は1 | オプション |
restrict | 戻り値の型*3 を 0 または 1 で指定、省略時は 0 | オプション |
*2 … PlaceEngine が定期的に測位した結果をキャッシュに保持しその値を返す。
*3 … 測位メソッドを複数指定した場合、通常は複数の結果を返しますが、正常に測位できた最初の測位メソッドだけを返したい場合に restrict=1 を指定します。「詳しくは例をご参照ください。」
戻り値:
//結果が複数ある場合(mに複数の測位メソッドを指定した場合) recvLoc2([result1,result2,...]); -- fmt=jsonp または省略された場合 [result1,result2,...] -- fmt=json の場合 //result1,result2の形式 {"r":result, "m":method, "t":t, "x":x, "y":y, "info":info} //結果がひとつの場合 recvLoc2({"r":result, "m":method, "t":t, "x":x, "y":y, "info":info}); -- fmt=jsonp または省略された場合 {"r":result, "m":method, "x":x, "y":y, "info":info} -- fmt=json の場合
値 | 説明 |
---|---|
result | 測位成功(>=0), エラーコード(<0の場合 エラーコード一覧) |
method | 測位メソッド |
t | タイムスタンプ |
x | 経度 |
y | 緯度 |
info | 属性情報 |
info は {"属性名1":値1,"属性名2":値2,...} といった形式をもつ文字列で、以下の属性があります:
info 属性名 | 説明 |
---|---|
addr | 住所文字列 |
floor | フロア情報("2F"など) |
例:
デフォルト測位http://localhost:5448/getlocjs?appk=xxx
recvLoc2({ "r": 0, "m": "p", "t": 1236336446, "x": 139.7659, "y": 35.6814, "info": { "addr": "東京都千代田区丸の内一丁目", "floor": "3F" } })
JSON形式を指定
http://localhost:5448/getlocjs?appk=xxx&fmt=json
{ "r": 0, "m": "p", "t": 1236336446, "x": 139.7659, "y": 35.6814, "info": { "addr": "東京都千代田区丸の内一丁目", "floor": "3F" } }
PlaceEngineサーバを利用した測位でキャッシュを使わない
http://localhost:5448/getlocjs?appk=xxx&m=p&usecache=0
recvLoc2({ "r": 0, "m": "p", "t": 1236336446, "x": 139.7659, "y": 35.6814, "info": { "addr": "東京都千代田区丸の内一丁目", "floor": "3F" } })
ローカルDBのみの測位でキャッシュを使わない
http://localhost:5448/getlocjs?appk=xxx&m=l&usecache=0
recvLoc2({ "r": 0, "m": "l", "t": 1236336446, "x": 139.7659, "y": 35.6814, "info": { "addr": null, "floor": null } })
ローカルDB,PlaceEngineサーバ,GPSの複数測位
http://localhost:5448/getlocjs?appk=xxx&m=l,p,g&usecache=0&fmt=json
//実際には改行はありません
//この結果はローカルDB、PlaceEngineサーバの測位は成功ですがGPS測位が失敗した例です
[
{ "r": 0, "m": "l", "t": 1236337593, "x": 139.7659, "y": 35.6814, "info": { "addr": null, "floor": null } },
{ "r": 0, "m": "p", "t": 1236337594, "x": 139.7659, "y": 35.6814, "info": { "addr": "東京都港区麻布十番四丁目", "floor": "3F" } }
]
ローカルDB,PlaceEngineサーバ,GPSの複数測位で結果がひとつだけ欲しい場合
http://localhost:5448/getlocjs?appk=xxx&m=l,p,g&restrict=1&usecache=0&fmt=json
//測位メソッドはローカルDB、PlaceEngineサーバ、GPSの順で指定しています。
//restrict=1 が指定されているので結果がひとつだけ返りました。
//ローカルDBの測位に失敗し、PlaceEngineサーバの測位に成功した場合の結果となります。
{ "r": 0, "m": "p", "t": 1236337594, "x": 139.7659, "y": 35.6814, "info": { "addr": "東京都港区麻布十番四丁目", "floor": "3F" } }
エラーコード一覧
値 | 説明 |
---|---|
0 | 成功 |
-1 | WiFi取得できず (無線LANがOFFなど) |
-2 | AP数0 (WiFi電測できたがAPが発見できなかった) |
-3 | PlaceEngineサーバーへのアクセス失敗 |
-4 | 電測が拒否された |
-5 | 通知画面の待ち受けタイムアウト |
-6 | アプリケーションキー未設定/不正 |
-7 | Terminal Servicesサービスが無効のため機能せず(Windows XP,Vistaのみ) |
-8 | パラメータエラー(引数が不正) |
-9 | 位置情報の信頼度が足りない(電波が弱いとか) |
-10 | PlaceEngine内部エラー |
-11 | WiFi情報の利用は法律で禁止されている |
-12 | 言語IDが不正 |
-13 | ローカルDBが見つかりませんでした |
-110 | ローカルDBから位置取得できず(ローカルDB位置未登録) |
-111 | 要求に対してレファラーが正しくはない |
-113 | リクエスト形式不正 |
-115 | タイムスタンプ不一致(パソコンの時計がずれ過ぎている) |