位置情報のリクエストとレスポンス

Geolocation リクエスト

Geolocation リクエストは、次の URL に POST で送信します。

https://www.googleapis.com/geolocation/v1/geolocate?key=YOUR_API_KEY

リクエストには、 key パラメータの値としてキーを指定する必要があります。A key はアプリケーションの API キーです。このキーは、割り当て 管理の目的でアプリケーションを識別します。キーを取得する方法をご確認ください。

リクエストの本文

リクエストの本文は JSON 形式にする必要があります。リクエストの本文が含まれていない場合、結果はリクエスト元の IP アドレスに基づいて返されます。次のフィールドがサポートされています。特に記載がない限り、すべてのフィールドは省略可能です。

フィールド JSON 型 説明 メモ
homeMobileCountryCode numberuint32 デバイスのホーム ネットワークのモバイル カントリー コード(MCC)。 サポートされていますradioType gsm(デフォルト)、 wcdmaltenr で使用できます。cdma では使用されません。
有効範囲: 0 ~ 999。
homeMobileNetworkCode numberuint32 デバイスのホーム ネットワークのモバイル ネットワーク コード。 これは、GSM、WCDMA、LTE、NR の MNC です。
CDMA ではシステム ID(SID)を使用します。
MNC の有効範囲: 0 ~ 999。
SID の有効範囲: 0 ~ 32767。
radioType string モバイル無線タイプ。サポートされている値は gsmcdmawcdmaltenr です。 このフィールドは省略可能ですが、クライアントが無線タイプを認識している場合は、常に含める必要があります。
このフィールドを省略すると、Geolocation API はデフォルトで gsmに設定されます。 想定される無線通信タイプが正しくない場合、無効な結果またはゼロの結果が返されます。
carrier string 配送業者名です。
considerIp boolean Wi-Fi 信号と基地局信号がない場合、 空の場合、またはデバイスの位置を推定するのに十分でない場合に、IP Geolocation にフォールバックするかどうかを指定します。 デフォルトは true です。フォールバックしないようにするには、considerIpfalse に設定します。
cellTowers array 携帯電話の基地局を表すオブジェクトの配列です。 後述の携帯電話の基地局オブジェクトのセクションをご覧ください。
wifiAccessPoints array WiFi アクセス ポイント オブジェクトの配列です。 後述の WiFi アクセス ポイント オブジェクトのセクション をご覧ください。

Geolocation API リクエストの本文の例を次に示します。

{
  "homeMobileCountryCode": 310,
  "homeMobileNetworkCode": 410,
  "radioType": "lte",
  "carrier": "Vodafone",
  "considerIp": true,
  "cellTowers": [
    // See the Cell Tower Objects section below.
  ],
  "wifiAccessPoints": [
    // See the WiFi Access Point Objects section below.
  ]
}

携帯電話の基地局オブジェクト

リクエストの本文の cellTowers 配列には、ゼロ個以上の 携帯電話の基地局オブジェクトが含まれます。

フィールド JSON 型 説明 メモ
cellId numberuint32 セルの一意の識別子です。 必須radioType gsm(デフォルト)、cdmawcdmalte の場合)。拒否nr の場合)。
後述の cellId の計算 セクションでは、各無線通信タイプの有効な値の範囲も示しています。
newRadioCellId numberuint64 NR(5G)セルの一意の識別子。 必須です。radioType nr で。他の タイプでは拒否されます。
後述のnewRadioCellId の計算セクションでは、 このフィールドの有効な値の範囲も示しています。
locationAreaCode numberuint32 GSM ネットワークと WCDMA ネットワークのロケーション エリア コード(LAC)。
CDMA ネットワークのネットワーク ID(NID)。
LTE ネットワークと NR ネットワークのトラッキング エリア コード(TAC)。
必須です。radioType gsm(デフォルト)と cdmaで必須です。他の値では省略可能です。
gsmcdmawcdmalte の有効範囲: 0 ~ 65535。
nr の有効範囲: 0 ~ 16777215。
mobileCountryCode numberuint32 携帯電話の基地局のモバイル カントリー コード(MCC)。 必須です。radioType gsm(デフォルト)、wcdmaltenr で使用されます。cdma では使用されません。
有効範囲: 0 ~ 999。
mobileNetworkCode numberuint32 携帯電話の基地局のモバイル ネットワーク コード。 これは、GSM、WCDMA、LTE、NR の MNC です。
CDMA ではシステム ID(SID)を使用します。
必須。
MNC の有効範囲: 0 ~ 999。
SID の有効範囲: 0 ~ 32767。

次の省略可能なフィールドは使用されませんが、値がある場合は含めることができます。

フィールド JSON 型 説明 メモ
age numberuint32 このセルがプライマリであったときからの経過時間(ミリ秒)です。 age が 0 の場合、cellId または newRadioCellId は現在の測定値を表します。
signalStrength numberdouble dBm 単位の無線通信の信号強度です。
timingAdvance numberdouble タイミング アドバンス値。

cellId の計算

NR(5G)より前の無線タイプでは、32 ビットの cellId フィールドを使用して、ネットワーク セル ID を Geolocation API に渡します。

  • GSM(2G)ネットワークでは、16 ビットのセル ID(CID)がそのまま使用されます。有効範囲: 0 ~ 65535。
  • CDMA(2G)ネットワークでは、16 ビットの基地局 ID(BID)がそのまま使用されます。有効範囲: 0 ~ 65535。
  • WCDMA(3G)ネットワークでは、UTRAN/GERAN セル ID(UC-ID)が使用されます。これは、12 ビットの無線ネットワーク コントローラ ID(RNC-ID)と 16 ビットのセル ID(CID)を連結した 28 ビットの整数値 です。
    数式: rnc_id << 16 | cid
    有効範囲: 0 ~ 268435455。
    注: WCDMA ネットワークで 16 ビットのセル ID 値のみを指定すると、 誤った結果またはゼロの結果が返されます。
  • LTE(4G)ネットワークでは、E-UTRAN セル ID(ECI)が使用されます。これは、20 ビットの E-UTRAN ノード B ID(eNBId)と 8 ビットのセル ID(CID)を連結した 28 ビットの整数値です。
    数式: enb_id << 8 | cid
    有効範囲: 0 ~ 268435455。
    注: LTE ネットワークで 8 ビットのセル ID 値のみを指定すると、 誤った結果またはゼロの結果が返されます。

API リクエストでこれらの範囲外の値を指定すると、動作が未定義になる可能性があります。 Google の裁量により、API は数値を切り捨ててドキュメントに記載されている範囲に収まるようにしたり、 radioType の修正を推測したり、レスポンスにインジケータを含めずに NOT_FOUND の結果を返したりすることがあります。

リクエストの本文の一部である LTE 携帯電話の基地局オブジェクトの例を次に示します。

{
  ...

  "cellTowers": [
    {
      "cellId": 170402199,
      "locationAreaCode": 35632,
      "mobileCountryCode": 310,
      "mobileNetworkCode": 410,
      "age": 0,
      "signalStrength": -60,
      "timingAdvance": 15
    }
  ]
}

上記のリクエストに対するレスポンスは次のようになります。

{
  "location": {
    "lat": 37.7801129,
    "lng": -122.4168229
  },
  "accuracy": 180.052
}

`newRadioCellId` の計算 newRadioCellId

セル ID が 32 ビットを超える新しいネットワークでは、64 ビットの newRadioCellId フィールドを使用して、ネットワーク セル ID を Geolocation API に渡します。

  • NR(5G)ネットワークでは、36 ビットの New Radio Cell Identity(NCI)がそのまま使用されます。
    有効範囲: 0 ~ 68719476735。

リクエストの本文の一部である NR 携帯電話の基地局オブジェクトの例を次に示します。

{
  ...

  "cellTowers": [
    {
      "newRadioCellId": 68719476735,
      "mobileCountryCode": 310,
      "mobileNetworkCode": 410,
      "age": 0,
      "signalStrength": -60,
    }
  ]
}

上記のリクエストに対するレスポンスは次のようになります。

{
  "location": {
    "lat": 37.7646157,
    "lng": -122.4127361
  },
  "accuracy": 1458.5570522410717
}

WiFi アクセス ポイント オブジェクト

リクエストの本文の wifiAccessPoints 配列には、物理的に異なる固定アクセス ポイント デバイスを表す 2 つ以上の WiFi アクセス ポイント オブジェクトを含める必要があります。macAddress フィールドは 必須です。それ以外のフィールドはすべて省略可能です。 このサービスでは、飛行機や電車など、移動するアクセス ポイント は無視されます。

フィールド JSON 型 説明 メモ
macAddress string WiFi ノードの MAC アドレス。通常は BSS、BSSID、MAC アドレスと呼ばれます。 必須。コロン区切り(:)の 16 進数文字列。
API を使用して特定できるのは、 ユニバーサル管理の MAC アドレスのみです。他の MAC アドレスは 通知なく削除され、API リクエストが事実上 空になる可能性があります。詳しくは、不要な WiFi アクセス ポイントの削除をご覧ください。
signalStrength numberdouble dBm で計測した現在の信号強度です。 WiFi アクセス ポイントの場合、dBm 値は通常 -35 以下で、-128 ~-10 dBm の範囲です。 必ずマイナス記号を含めてください。
-10 dBm より大きい値の場合、API は NOT FOUND を返します。
age numberuint32 このアクセス ポイントが検出されてからの経過時間(ミリ秒)です。
channel numberuint32 クライアントがアクセス ポイントとの通信を行っているチャネルです。
signalToNoiseRatio numberdouble dB で計測した現在の信号対雑音比 。

リクエストの本文の一部である WiFi アクセス ポイント オブジェクトの例を次に示します。

{
  ...
  
  "macAddress": "f0:d5:bf:fd:12:ae",
  "signalStrength": -43,
  "signalToNoiseRatio": 0,
  "channel": 11,
  "age": 0
}

上記のリクエストに対するレスポンスは次のようになります。

{
  "location": {
    "lat": 37.7801129,
    "lng": -122.4168229
  },
  "accuracy": 180.052
}

サンプル リクエスト

サンプルデータで Geolocation API を試す場合は、次の JSON をファイルに保存します。

{
  "considerIp": "false",
  "wifiAccessPoints": [
    {
      "macAddress": "3c:37:86:5d:75:d4",
      "signalStrength": -35,
      "signalToNoiseRatio": 0
    },
    {
      "macAddress": "30:86:2d:c4:29:d0",
      "signalStrength": -35,
      "signalToNoiseRatio": 0
    }
  ]
}

次に、curl を使用してコマンドラインからリクエストを行います。

$ curl -d @your_filename.json -H "Content-Type: application/json" -i "https://www.googleapis.com/geolocation/v1/geolocate?key=YOUR_API_KEY"

上記の MAC アドレスに対するレスポンスは次のようになります。

{
  "location": {
    "lat": 37.4241173,
    "lng": -122.0915717
  },
  "accuracy": 20
}

未使用の WiFi アクセス ポイントの削除

macAddress が ブロードキャスト アドレス(FF:FF:FF:FF:FF:FF)または IANA によって予約されている WiFi アクセス ポイント オブジェクトを削除すると、入力として WiFi を 使用する Geolocation API 呼び出しの成功率が向上します。フィルタリング後、Geolocation API 呼び出し が成功しないと判断された場合は、古い位置情報信号や信号の弱い WiFi AP を使用するなどの軽減策を講じることができます。このアプローチは、アプリケーションの位置情報の推定の必要性と、適合率と再現率の要件とのトレードオフです。次のフィルタリング手法は、入力をフィルタ する方法を示していますが、アプリケーション エンジニアが適用する軽減策は示していません。

00:00:5E:00:00:0000:00:5E:FF:FF:FF の MAC アドレスの範囲は IANA 用に予約されており、ネットワーク管理機能やマルチキャスト機能によく使用されるため、位置情報信号として使用することはできません。これらの MAC アドレスも API への入力から削除する必要があります。

たとえば、Geolocation で使用可能な MAC アドレスは、 という名前の macs 文字列の macAddress 配列から収集できます。

Java
String[] macs = {"ff:ff:ff:ff:ff:ff", "1c:34:56:78:9a:bc", "00:00:5e:00:00:01"};
ArrayList<String> _macs = new ArrayList<>(Arrays.asList(macs));
_macs.removeIf(m -> !(!m.toUpperCase().equals("FF:FF:FF:FF:FF:FF")
                      && !m.substring(0, 8).toUpperCase().equals("00:00:5E")));
    
Python
macs = ['ff:ff:ff:ff:ff:ff', '1c:34:56:78:9a:bc', '00:00:5e:00:00:01']
macs = [m for m in macs if (m.upper() != "FF:FF:FF:FF:FF:FF" and m[:8].upper() != '00:00:5E')]
    
JavaScript
macs = ['ff:ff:ff:ff:ff:ff', '1c:34:56:78:9a:bc', '00:00:5e:00:00:01'];
macs = macs.filter(m => m.toUpperCase() !== "FF:FF:FF:FF:FF:FF"
                        && m.substr(0, 8).toUpperCase() !== '00:00:5E');
    

このフィルタを使用すると、リストに残るのは 1c:34:56:78:9a:bc のみになります。 このリストには 2 つ未満の WiFi MAC アドレスが含まれているため、 リクエストは成功せず、HTTP 404 notFound) レスポンスが返されます。

Geolocation のレスポンス

Geolocation リクエストが成功すると、位置と半径を定義する JSON 形式のレスポンス が返されます。

  • location: ユーザーの推定緯度と経度 座標(度単位)。1 つの lat サブフィールドと 1 つの lng サブフィールドが含まれます。
  • accuracy: 推定位置の精度( メートル単位)。これは、指定された locationを中心とする円の半径を表します。
{
  "location": {
    "lat": 37.421875199999995,
    "lng": -122.0851173
  },
  "accuracy": 120
}

API は、入力信号に基づいて位置と精度範囲を返します。API は高精度の位置情報を返すことができますが、精度は、利用可能な信号のソース、数、密度、強度によって異なります。通常、次の精度範囲が想定されます。

  • Wi-Fi アクセス ポイント: リクエストに 2 つ以上の wifiAccessPoints が含まれている場合、返される精度範囲は通常 20 メートル前後です。精度は、アクセス ポイントの数と 信号強度(dBm 単位)によって向上します。信号強度は通常 -100 ~-20 dBm の範囲です。
  • 携帯電話の基地局: WiFi 情報が利用できない場合や不十分な場合、 API は位置情報に cellTowers を使用します。精度は、携帯電話の基地局のタイプ、信号強度、ネットワーク密度によって大きく異なります。
    • マクロセル (最も一般的なタイプで、広範囲のカバーに使用)は、精度が低くなります。半径は通常数百メートルの範囲で、携帯電話の基地局のカバー範囲がまばらな地域では数千メートルになることもあります。マクロセルの場合、精度範囲が 100 メートル未満になることはほとんどありません。一般に、信号の強い携帯電話の基地局ほど精度が高くなります。通常、LTE の場合は > -110 dBm(信号範囲 -140 ~-55 dBm)、WCDMA の場合は > -100 dBm(信号範囲 -111 ~-53 dBm)、CDMA の場合は > -100 dBm(信号範囲 -120 ~-40 dBm)、GSM の場合は > -80 dBm(信号範囲 -121 ~-1 dBm)です。
    • スモールセル (フェムトセル、ピコセル、屋内リピーターなど)は、最も正確なセルベースの位置情報を提供し、精度範囲は 10 ~ 30 メートルです。
  • IP Geolocation: considerIptrue で、WiFi 信号または携帯電話の基地局信号をジオロケーションできない場合、API はリクエストの IP アドレスに基づいて位置を推定します。この方法では、精度が最も低く、半径が数千メートルになることがあります。トラブルシューティング ガイドの精度範囲が非常に大きいのはなぜですか?をご覧ください。