地理位置要求與回應

地理位置要求

地理位置要求會透過 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必填,其他類型則拒絕
請參閱下方的「計算 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

在 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),這是一個 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 陣列必須包含兩個或更多 WiFi 存取點物件,代表實際上不同的存取點裝置。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
}

捨棄未使用的 WiFi 存取點

移除使用 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
}