地理位置要求與回應

地理位置要求

系統會使用 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 WiFi 存取點物件陣列。 請參閱下方的「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」一節,其中也會列出每個單選按鈕類型的有效值範圍。
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)。
必要。
有效的 MNC 範圍: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 位元 New Radio 小區識別碼 (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 要求實際上變成空白。詳情請參閱「移除無用的 Wi-Fi 存取點」。
signalStrength number (double) 目前的訊號強度,以 dBm 為單位。 對於 Wi-Fi 存取點,dBm 值通常為 -35 或更低,範圍介於 -128 到 -10 dBm。 請務必加上減號。
age number (uint32) 偵測到這個存取點後的毫秒數。
channel number (uint32) 用戶端與存取點通訊的管道。
signalToNoiseRatio number (double) 以分貝為單位,測量目前的信噪比。

以下是 WiFi 存取點物件的範例。

{
  "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 所提供的 WiFi 存取點物件,可提高使用 WiFi 做為輸入值的 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
}