คําขอและการตอบสนองตําแหน่งทางภูมิศาสตร์

คำขอตำแหน่งทางภูมิศาสตร์

ระบบจะส่งคำขอตำแหน่งทางภูมิศาสตร์โดยใช้ POST ไปยัง URL ต่อไปนี้

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

คุณต้องระบุคีย์ในคำขอ โดยรวมเป็นค่าของพารามิเตอร์ a key key คือคีย์ API ของแอปพลิเคชัน คีย์นี้จะระบุแอปพลิเคชันของคุณเพื่อวัตถุประสงค์ในการจัดการโควต้า ดูวิธีรับคีย์

เนื้อความของคำขอ

เนื้อหาของคำขอต้องอยู่ในรูปแบบ JSON หากไม่รวมเนื้อหาของคำขอ ระบบจะแสดงผลลัพธ์ ตามที่อยู่ IP ของตำแหน่งคำขอ ฟิลด์ต่อไปนี้ รองรับ และฟิลด์ทั้งหมดไม่บังคับ เว้นแต่จะระบุไว้เป็นอย่างอื่น

ช่อง ประเภท JSON คำอธิบาย หมายเหตุ
homeMobileCountryCode number (uint32) รหัสบริการโทรศัพท์เคลื่อนที่ (MCC) สำหรับเครือข่ายบ้านของอุปกรณ์ รองรับสำหรับ radioType gsm (ค่าเริ่มต้น) wcdma, lte และ nr ไม่ได้ใช้สำหรับ cdma
ช่วงที่ใช้ได้: 0–999
homeMobileNetworkCode number (uint32) รหัสเครือข่ายมือถือสำหรับเครือข่ายบ้านของอุปกรณ์ นี่คือ MNC สำหรับ GSM, WCDMA, LTE และ NR
CDMA ใช้รหัสระบบ (SID)
ช่วงที่ใช้ได้สำหรับ MNC: 0–999
ช่วงที่ใช้ได้สำหรับ SID: 0–32767
radioType string ประเภทสัญญาณสำหรับอุปกรณ์เคลื่อนที่ ค่าที่รองรับคือ gsm, cdma, wcdma, lte และ nr แม้ว่าช่องนี้จะไม่บังคับ แต่ควรระบุเสมอหากไคลเอ็นต์ทราบประเภทวิทยุ
หากละเว้นช่องนี้ API ตำแหน่งทางภูมิศาสตร์จะใช้ค่าเริ่มต้นเป็น gsm ซึ่งจะทำให้ผลลัพธ์ไม่ถูกต้องหรือเป็น 0 หากประเภทวิทยุที่สันนิษฐานไม่ถูกต้อง
carrier string ชื่อผู้ให้บริการขนส่ง
considerIp boolean ระบุว่าจะกลับไปใช้ตำแหน่งทางภูมิศาสตร์ของ IP หรือไม่ หากไม่มีสัญญาณ Wi-Fi และเสาสัญญาณโทรศัพท์ ว่างเปล่า หรือไม่เพียงพอที่จะประมาณตำแหน่งอุปกรณ์ ค่าเริ่มต้นคือ 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 ของเนื้อหาคำขอมีออบเจ็กต์เสาสัญญาณโทรศัพท์มือถือ 0 รายการขึ้นไป

ช่อง ประเภท JSON คำอธิบาย หมายเหตุ
cellId number (uint32) ตัวระบุที่ไม่ซ้ำกันของเซลล์ ต้องระบุสำหรับ radioType gsm (ค่าเริ่มต้น), cdma, wcdma และ lte ปฏิเสธสำหรับ nr
ดูส่วนการคำนวณ cellId ด้านล่าง ซึ่งแสดงช่วงค่าที่ถูกต้องสำหรับ วิทยุแต่ละประเภทด้วย
newRadioCellId number (uint64) ตัวระบุที่ไม่ซ้ำกันของเซลล์ NR (5G) ต้องระบุสำหรับ radioType nr; ถูกปฏิเสธสำหรับประเภทอื่นๆ
ดูส่วนการคำนวณ newRadioCellId ด้านล่าง ซึ่งแสดงช่วงค่าที่ถูกต้องสำหรับฟิลด์ด้วย
locationAreaCode number (uint32) รหัสพื้นที่ (LAC) สำหรับเครือข่าย GSM และ WCDMA
รหัสเครือข่าย (NID) สำหรับเครือข่าย CDMA
รหัสพื้นที่ติดตาม (TAC) สำหรับเครือข่าย LTE และ NR
ต้องระบุสำหรับ radioType gsm (ค่าเริ่มต้น) และ cdma ไม่บังคับสำหรับค่าอื่นๆ
ช่วงที่ใช้ได้กับ gsm, cdma, wcdma และ lte: 0–65535
ช่วงที่ใช้ได้กับ nr: 0–16777215
mobileCountryCode number (uint32) รหัสบริการโทรศัพท์เคลื่อนที่ของประเทศ (MCC) ของเสาสัญญาณมือถือ ต้องระบุสำหรับ radioType gsm (ค่าเริ่มต้น), wcdma, lte และ nr ไม่ได้ใช้สำหรับ cdma
ช่วงที่ใช้ได้: 0–999
mobileNetworkCode number (uint32) รหัสเครือข่ายมือถือของเสาสัญญาณมือถือ นี่คือ MNC สำหรับ GSM, WCDMA, LTE และ NR
CDMA ใช้รหัสระบบ (SID)
ต้องระบุ
ช่วงที่ใช้ได้สำหรับ MNC: 0–999
ช่วงที่ใช้ได้สำหรับ SID: 0–32767

ระบบจะไม่ใช้ช่องที่ไม่บังคับต่อไปนี้ แต่จะรวมไว้ได้หากมีค่า

ช่อง ประเภท JSON คำอธิบาย หมายเหตุ
age number (uint32) จำนวนมิลลิวินาทีนับตั้งแต่เซลล์นี้เป็นเซลล์หลัก หากอายุเป็น 0 cellId หรือ newRadioCellId จะแสดงการวัดปัจจุบัน
signalStrength number (double) ความแรงของสัญญาณวิทยุที่วัดเป็น dBm
timingAdvance number (double) ค่า การปรับเวลา

การคำนวณ cellId

วิทยุประเภทก่อน NR (5G) ใช้ฟิลด์ 32 บิต cellId สำหรับส่งรหัสเซลล์เครือข่ายไปยัง Geolocation API

  • เครือข่าย GSM (2G) ใช้รหัสเซลล์ (CID) แบบ 16 บิตตามเดิม ช่วงที่ใช้ได้คือ 0–65535
  • เครือข่าย CDMA (2G) ใช้รหัสสถานีฐาน (BID) แบบ 16 บิตตามที่เป็นอยู่ ช่วงที่ถูกต้องคือ 0–65535
  • เครือข่าย WCDMA (3G) ใช้ข้อมูลระบุเซลล์ UTRAN/GERAN (UC-ID) ซึ่งเป็นค่าจำนวนเต็ม 28 บิต ที่ต่อกันกับตัวระบุตัวควบคุมเครือข่ายวิทยุ (RNC-ID) 12 บิตและรหัสเซลล์ (CID) 16 บิต
    สูตร: rnc_id << 16 | cid
    ช่วงที่ใช้ได้: 0–268435455
    หมายเหตุ: การระบุค่ารหัสเซลล์แบบ 16 บิตในเครือข่าย WCDMA เท่านั้นจะทำให้ได้ผลลัพธ์ที่ไม่ถูกต้องหรือเป็น 0
  • เครือข่าย LTE (4G) ใช้รหัสเซลล์ E-UTRAN (ECI) ซึ่งเป็นค่าจำนวนเต็ม 28 บิต โดยเชื่อมต่อตัวระบุโหนด B ของ E-UTRAN (eNBId) 20 บิตและรหัสเซลล์ (CID) 8 บิต
    สูตร: enb_id << 8 | cid
    ช่วงที่ใช้ได้: 0–268435455
    หมายเหตุ: การระบุค่ารหัสเซลล์ 8 บิตในเครือข่าย LTE เท่านั้นจะทำให้ผลลัพธ์ไม่ถูกต้องหรือเป็น 0

การใส่ค่าที่อยู่นอกช่วงเหล่านี้ในคำขอ API อาจทำให้เกิดลักษณะการทำงานที่ไม่คาดคิด API อาจตัดทอนตัวเลขเพื่อให้พอดีกับช่วงที่ระบุไว้ อนุมานการแก้ไขradioType หรือแสดงผลลัพธ์ NOT_FOUND โดยไม่มีตัวบ่งชี้ใดๆ ในการตอบกลับ ทั้งนี้ขึ้นอยู่กับดุลยพินิจของ Google

ตัวอย่างออบเจ็กต์เสาสัญญาณ LTE แสดงอยู่ด้านล่าง

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

กำลังคำนวณ newRadioCellId

เครือข่ายรุ่นใหม่ที่มีรหัสเซลล์ยาวกว่า 32 บิตจะใช้ฟิลด์ 64 บิต newRadioCellId เพื่อส่งรหัสเซลล์เครือข่ายไปยัง Geolocation API

  • เครือข่าย NR (5G) ใช้รหัสเซลล์วิทยุใหม่ (NCI) แบบ 36 บิตตามเดิม
    ช่วงที่ถูกต้อง: 0–68719476735

ตัวอย่างออบเจ็กต์เสาสัญญาณ NR อยู่ด้านล่าง

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

ออบเจ็กต์จุดเข้าใช้งาน Wi-Fi

อาร์เรย์ wifiAccessPoints ของเนื้อหาคำขอต้องมีออบเจ็กต์จุดเข้าใช้งาน WiFi อย่างน้อย 2 รายการที่แสดงถึงอุปกรณ์จุดเข้าใช้งานที่แตกต่างกันทางกายภาพ macAddress ต้องระบุ ส่วนช่องอื่นๆ ทั้งหมดเป็น ไม่บังคับ

ช่อง ประเภท JSON คำอธิบาย หมายเหตุ
macAddress string ที่อยู่ MAC ของโหนด WiFi โดยปกติแล้วจะเรียกว่า BSS, BSSID หรือที่อยู่ MAC ต้องระบุสตริงเลขฐานสิบหกที่คั่นด้วยเครื่องหมายโคลอน (:)
เฉพาะ ที่อยู่ MAC ที่มีการดูแลจัดการเป็นสากลเท่านั้นที่ค้นหาได้ผ่าน API ระบบจะทิ้งที่อยู่ MAC อื่นๆ โดยไม่แจ้งให้ทราบ และอาจทำให้คำขอ API ว่างเปล่า โปรดดูรายละเอียดที่หัวข้อการทิ้งจุดเข้าถึง Wi-Fi ที่ไม่มีประโยชน์
signalStrength number (double) ความแรงของสัญญาณปัจจุบันที่วัดเป็น dBm สำหรับจุดเข้าใช้งาน Wi-Fi ค่า dBm โดยทั่วไปจะอยู่ที่ -35 หรือต่ำกว่า และมีช่วงตั้งแต่ -128 ถึง -10 dBm โปรดอย่าลืมใส่เครื่องหมายลบ
สำหรับค่าที่มากกว่า -10 dBm API จะแสดงผล NOT FOUND
age number (uint32) จำนวนมิลลิวินาทีนับตั้งแต่ตรวจพบจุดเข้าถึงนี้
channel number (uint32) แชแนลที่ไคลเอ็นต์ใช้สื่อสารกับจุดเข้าถึง
signalToNoiseRatio number (double) อัตราส่วนสัญญาณต่อสัญญาณรบกวนปัจจุบัน วัดเป็น dB

ตัวอย่างออบเจ็กต์จุดเข้าถึง 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 ที่ไม่ได้ใช้

การนำออบเจ็กต์จุดเข้าใช้งาน Wi-Fi ที่มี macAddress ซึ่ง ได้รับการจัดการในพื้นที่ จะช่วยปรับปรุงอัตราความสำเร็จของการเรียก Geolocation API ที่ใช้ Wi-Fi เป็นอินพุตได้ หากหลังจากกรองแล้วพบว่าการเรียกใช้ Geolocation API จะไม่สำเร็จ คุณสามารถใช้การลดผลกระทบ เช่น การใช้สัญญาณตำแหน่งเก่าหรือ AP ของ Wi-Fi ที่มีสัญญาณอ่อนกว่า แนวทางนี้เป็นการแลกเปลี่ยนระหว่างความต้องการการประมาณตำแหน่งของแอปพลิเคชันกับความแม่นยำและข้อกำหนดด้านการเรียกคืน เทคนิคการกรองต่อไปนี้แสดงวิธีกรองอินพุต แต่ไม่ได้แสดงการลดความเสี่ยงที่คุณอาจเลือกใช้ในฐานะวิศวกรแอปพลิเคชัน

ที่อยู่ MAC ที่มีการดูแลจัดการในระบบไม่ใช่สัญญาณตำแหน่งที่มีประโยชน์สำหรับ API และจะถูกนำออกจากคำขอโดยไม่มีการแจ้งเตือน คุณสามารถนำ MAC Address ดังกล่าวออกได้ โดยตรวจสอบว่าบิตที่สำคัญน้อยที่สุดอันดับที่ 2 ของ ไบต์ที่สำคัญที่สุดของ macAddress คือ 0 เช่น บิตที่ 1 ซึ่งแสดงโดย 2 ใน 02:00:00:00:00:00 ที่อยู่ MAC แบบออกอากาศ (FF:FF:FF:FF:FF:FF) เป็นตัวอย่างของที่อยู่ MAC ที่ตัวกรองนี้ ควรยกเว้น

ช่วงที่อยู่ MAC ระหว่าง 00:00:5E:00:00:00 และ 00:00:5E:FF:FF:FF เป็นที่สงวนไว้ สำหรับ IANA และมักใช้สำหรับการจัดการเครือข่ายและฟังก์ชันมัลติแคสต์ ซึ่งทำให้ไม่สามารถใช้เป็นสัญญาณตำแหน่งได้ นอกจากนี้ คุณควรนำที่อยู่ MAC เหล่านี้ออกจากอินพุตไปยัง API ด้วย

ตัวอย่างเช่น คุณสามารถรวบรวมที่อยู่ MAC ที่ใช้ได้สำหรับตำแหน่งทางภูมิศาสตร์จากอาร์เรย์ของสตริง macAddress ที่ชื่อ macs ได้

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 ในรายการ เนื่องจากรายการนี้มีที่อยู่ MAC ของ Wi-Fi น้อยกว่า 2 รายการ คำขอจึงไม่สำเร็จและระบบจะส่งคืนการตอบกลับ HTTP 404 (notFound)

คำตอบเกี่ยวกับตำแหน่งทางภูมิศาสตร์

คำขอตำแหน่งทางภูมิศาสตร์ที่สำเร็จจะแสดงการตอบกลับในรูปแบบ JSON ซึ่งกำหนดตำแหน่งและรัศมี

  • location: พิกัดละติจูดและลองจิจูดโดยประมาณของผู้ใช้เป็นองศา มีฟิลด์ย่อย lat 1 รายการและ lng 1 รายการ
  • accuracy: ความแม่นยำของตำแหน่งโดยประมาณในหน่วยเมตร แสดงรัศมีของวงกลมรอบlocationที่ระบุ
{
  "location": {
    "lat": 37.421875199999995,
    "lng": -122.0851173
  },
  "accuracy": 120
}