地理位置要求與回應

地理位置要求

地理位置要求會使用 POST 傳送至下列網址:

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

您必須在要求中指定鍵,並將鍵納入 key 參數的值。key 是應用程式的 API 金鑰。這個金鑰可識別您的應用程式,以便進行配額管理。瞭解如何取得金鑰

要求主體

要求主體必須採用 JSON 格式。如果未包含要求主體,則系統會根據要求位置的 IP 位址傳回結果。系統支援下列欄位,且所有欄位均為選填欄位 (除非另有說明):

欄位 JSON 類型 說明 附註
homeMobileCountryCode number (uint32) 裝置所在國家/地區的行動裝置國家/地區代碼 (MCC)。 支援 radioType gsm (預設)、wcdmaltenr;不支援 cdma
有效範圍:0 到 999。
homeMobileNetworkCode number (uint32) 裝置家用網路的行動網路代碼。 這是 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 地理位置。 預設為 true。將 considerIp 設為 false,以防備回退。
cellTowers array 電信塔物件的陣列。 請參閱下方的「基地台物件」一節。
wifiAccessPoints array Wi-Fi 存取點物件的陣列。 請參閱下方的「Wi-Fi 存取點物件」一節。

以下是 Geolocation API 要求主體的範例。

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

基地台物件

要求主體的 cellTowers 陣列含有零個或多個行動通信基地台物件。

欄位 JSON 類型 說明 附註
cellId number (uint32) 儲存格專屬 ID。 radioType gsm (預設)、cdmawcdmalte必填nr拒絕
請參閱下方的「計算 cellId」一節,其中也會列出每個 radio 類型的有效值範圍。
newRadioCellId number (uint64) NR (5G) 儲存格的專屬 ID。 radioType nr必填;其他類型則為 rejected
請參閱下方的「計算 newRadioCellId」一節,其中也列出該欄位的有效值範圍。
locationAreaCode number (uint32) GSM 和 WCDMA 網路的區域代碼 (LAC)。
CDMA 網路的網路 ID (NID)。
LTE 和 NR 網路的追蹤區碼 (TAC)。
radioType gsm (預設) 和 cdma必填,其他值則為選填。
必須使用 gsmcdmawcdmalte 的有效範圍:0 至 65535。
有效的範圍,必須包含 nr:0–16777215。
mobileCountryCode number (uint32) 基地台的行動裝置國家/地區代碼 (MCC)。 radioType gsm (預設)、wcdmaltenr必要;不供 cdma 使用。
有效範圍:0 到 999。
mobileNetworkCode number (uint32) 基地台的行動網路代碼。 這是 GSM、WCDMA、LTE 和 NR 的 MNC。
CDMA 使用系統 ID (SID)。
必填。
國家/地區代碼的有效範圍:0 到 999。
有效的 SID 範圍:0 到 32767。

以下為不使用的選填欄位,如果可以使用值,則可加入此欄位。

欄位 JSON 類型 說明 附註
age number (uint32) 因為這個儲存格為主要儲存格而經過的毫秒數。 如果 age 為 0,cellIdnewRadioCellId 則代表目前的測量值。
signalStrength number (double) 無線電訊號強度以 dBm 為單位。
timingAdvance number (double) 時間提前值。

正在計算cellId

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),這是一個 28 位元整數值,連結 12 位元無線網路控制器 ID (RNC-ID) 和 16 位元小區 ID (CID)。
    公式:rnc_id << 16 | cid
    有效範圍:0 到 268435455。
    注意:如果您只在 WCDMA 網路中指定 16 位元 Cell ID 值,則會產生不正確或零的結果。
  • LTE (4G) 網路使用 E-UTRAN 小區 ID (ECI),這是一個 28 位元整數值,將 20 位元 E-UTRAN 節點 B ID (eNBId) 和 8 位元小區 ID (CID) 連接在一起。
    公式:enb_id << 8 | cid
    有效範圍:0 到 268435455。
    注意:如果只在 LTE 網路中指定 8 位元 Cell ID 值,則會產生不正確或零的結果。

在 API 要求中放置超出範圍的值可能會導致未定義的行為。API 可視 Google 的判斷,截斷數字以符合說明範圍、推斷 radioType 的修正值,或在回應中傳回 NOT_FOUND 結果,而不會顯示任何指標。

以下是 LTE 基地台物件的範例。

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

計算「newRadioCellId

較新的網路 (其單元格 ID 長度超過 32 位元) 會使用 64 位元的 newRadioCellId 欄位,將網路單元格 ID 傳遞至 Geolocation API。

  • NR (5G) 網路會使用 36 位元的新無線電小區 ID (NCI)。
    有效範圍:0 到 68719476735。

以下是 NR 基地台物件的範例。

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

WiFi 存取點物件

要求主體的 wifiAccessPoints 陣列必須包含兩個以上的 Wi-Fi 存取點物件,代表實體不同存取點裝置。macAddress 為必填欄位,其他欄位則為選填欄位。

欄位 JSON 類型 說明 附註
macAddress string Wi-Fi 節點的 MAC 位址。這項資訊通常稱為 BSS、BSSID 或 MAC 位址。 必填。以半形冒號分隔的十六進位字串 (:)。
只有通用管理 MAC 位址可以透過 API 定位。系統會自動捨棄其他 MAC 位址,這可能會導致 API 要求變成空白。詳情請參閱「刪除無用的 Wifi 存取點」。
signalStrength number (double) 目前訊號強度,以 dBm 為單位。 對於 Wi-Fi 存取點,dBm 值通常為 -35 或更低,範圍為 -128 到 -10 dBm。 (別忘了加上減號)。
age number (uint32) 自偵測到這個存取點起算的毫秒數。
channel number (uint32) 用戶端與存取點通訊的管道。
signalToNoiseRatio number (double) 目前的信噪比,以分貝為單位。

以下是 Wi-Fi 存取點物件的範例。

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

要求範例

如果您想嘗試使用 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
}

捨棄未使用的 Wi-Fi 存取點

移除使用 macAddress 的 Wi-Fi 存取點物件,可改善使用 Wi-Fi 做為輸入內容的 Geolocation API 呼叫成功率。如果在篩選後,可以判斷地理位置 API 呼叫不會成功,則可以使用緩解措施,例如使用較舊的位置訊號或訊號較弱的 Wi-Fi 存取點。這個做法可以在應用程式需要位置估算的需求,以及其精確度和喚回度要求之間權衡取捨。以下篩選技巧說明如何篩選輸入內容,但不會顯示您 (應用程式工程師) 可能會選擇套用的緩解措施。

本機管理的 MAC 位址對 API 來說不是實用的位置信號,因此會不發出通知,從要求中捨棄。您可以移除這類 MAC 位址,方法是確保 macAddress 最高位元組的第二個最低有效位元為 0,例如 02:00:00:00:00:00 中由 2 代表的 1 位元。廣播 MAC 位址 (FF:FF:FF:FF:FF:FF) 是 MAC 位址的範例,這個位址可由這個篩選條件排除。

00:00:5E:00:00:0000:00:5E:FF:FF:FF 之間的 MAC 位址範圍會保留給 IANA,且通常用於網路管理和多點傳送功能,因此這些位址將不會做為位置信號使用。您也應從 API 輸入中移除這些 MAC 位址。

舉例來說,您可以從名為 macsmacAddress 字串陣列中,收集可用於地理位置的 MAC 位址:

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

使用這個篩選器後,清單中只會保留 1c:34:56:78:9a:bc。由於這個清單的 Wi-Fi MAC 位址少於 2 個,要求不會成功,並會傳回 HTTP 404 (notFound) 回應

地理位置回應

成功的定位資訊要求會傳回 JSON 格式的回應,定義位置和半徑。

  • location:使用者的預估經緯度座標,以度為單位。包含一個 lat 和一個 lng 子欄位。
  • accuracy:大概位置的準確度 (以公尺為單位)。這代表指定 location 的圓形半徑。
{
  "location": {
    "lat": 37.421875199999995,
    "lng": -122.0851173
  },
  "accuracy": 120
}