背景
GPSの実地精度を測定したところ
主とする雑居ビルの立ち並ぶ街中で非常に精度が低かった。
iOSにおけるWifiのみでの位置情報測定での最小誤差65mで返ってくることもしばしば発生した
測定に使ったアプリのソースはこちらで公開
https://github.com/maunamoana/gosasoku
そのため、wifiでの位置情報測定が実際はどの程度の精度を保証してくれるかを調査することにした。
API コール
googleのアカウントを登録し、keyを発行する。
取得したキーを YOUR_API_KEYの部分に置き換え、jsonをpostする
https://www.googleapis.com/geolocation/v1/geolocate?key=YOUR_API_KEY
JSON='{
"macAddress": "01:23:45:67:89:AB",
"signalStrength": -65,
"age": 0,
"channel": 11,
"signalToNoiseRatio": 40
}'
signalStrengthにはデシベル値を指定
AndroidアプリならWifiManagerで取得可能
macAddress以外は必須ではない模様
curl -H 'Content-type:application/json' -d "$JSON" https://www.googleapis.com/geolocation/v1/geolocate?YOUR_API_KEY
レスポンス
{
"location": {
"lat": 35.442457100000006,
"lng": 139.64011829999998
},
"accuracy": 2861.0
}
その他の叩き方
今回の目的はiOSでの利用予定のため、SignalStrengthが取得できない恐れがあるため
複数のmacアドレスでコールする。
{
"wifiAccessPoints": [
{
"macAddress": "00:xx:xx:xx:xx:xx",
"age": 0
},
{
"macAddress": "01:xx:xx:xx:xx:xx",
"age": 0
},
// 中略
{
"macAddress": "09:xx:xx:xx:xx:xx",
"age": 0
}
]
}
このように実際に取得したMacアドレスを5件ほど指定すると
シグナルの強度を指定しなくても比較的よい実行精度が取れた。
実地調査
ビルの谷間の駐車場にて数回Wifiアナライザーで取得した結果のXMLをJSONに変換してコールした。
一か所につき、40以上のアクセスポイントが上がってくる。
特にSSIDでモバイルwifiを除去することなしにコール
signalStrengthを入力しない場合はレスポンスのaccracyは150
signalStrengthをを指定すると、accuracyは60m以内に収束する
結果自体はどちらも本来の位置とはブレており、signalStrengthを指定したほうが建物の中に入り込む結果もでたが双方ともに概ね10m程度の誤差に収まる結果が出た
比較として横浜みなとみらいの広大に開けたエリアでも測定すると
路地に比べると大きく誤差が出た
特に、signalStrengthを指定しない場合は全く異なる場所を指すほどに誤差が大きくなる
accuracyの値は路地裏と同じく強度を指定しない場合は150から200は超えてない
逆に、このような解放エリアではGPSの精度はよく、実測精度でも5m-10m程度に収まるため
WifiとGPSでの位置測定は補完関係にあることが分かった