คำขอตำแหน่งทางภูมิศาสตร์
ระบบจะส่งคำขอตำแหน่งทางภูมิศาสตร์โดยใช้ POST ไปยัง URL ต่อไปนี้
https://www.googleapis.com/geolocation/v1/geolocate?key=YOUR_API_KEY
คุณต้องระบุคีย์ในคำขอ โดยรวมเป็นค่าของพารามิเตอร์ 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 |
แม้ว่าช่องนี้จะไม่บังคับ แต่คุณควรรวมช่องนี้ไว้เสมอหากไคลเอ็นต์ทราบประเภทวิทยุ หากละเว้นช่องนี้ Geolocation API จะใช้ค่าเริ่มต้นเป็น gsm
ซึ่งจะส่งผลให้ได้ผลลัพธ์ที่ไม่ถูกต้องหรือไม่มีผลลัพธ์เลยหากประเภทสัญญาณวิทยุที่สันนิษฐานไม่ถูกต้อง |
carrier |
string |
ชื่อผู้ให้บริการขนส่ง | |
considerIp |
boolean |
ระบุว่าจะใช้ตำแหน่งทางภูมิศาสตร์ของ IP หรือไม่หากไม่มีสัญญาณ Wi-Fi และเสาสัญญาณมือถือ สัญญาณว่างเปล่า หรือไม่เพียงพอที่จะประมาณตำแหน่งของอุปกรณ์ | ค่าเริ่มต้นคือ true ตั้งค่า considerIp เป็น false เพื่อป้องกันการเปลี่ยนกลับ |
cellTowers |
array |
อาร์เรย์ของออบเจ็กต์เสาสัญญาณมือถือ | ดูส่วนออบเจ็กต์เสาสัญญาณมือถือด้านล่าง |
wifiAccessPoints |
array |
อาร์เรย์ของออบเจ็กต์จุดเข้าใช้งาน Wi-Fi | ดูส่วนออบเจ็กต์จุดเข้าใช้งาน Wi-Fi ด้านล่าง |
ตัวอย่างเนื้อหาคำขอ 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 ของเนื้อความของคำขอมีออบเจ็กต์เสาสัญญาณมือถืออย่างน้อย 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) |
ค่า timing advance |
กำลังคำนวณ cellId
ประเภทวิทยุก่อน NR (5G) จะใช้ช่อง cellId แบบ 32 บิตเพื่อส่งรหัสเซลล์เครือข่ายไปยัง Geolocation API
- เครือข่าย GSM (2G) ใช้รหัสเซลล์ (CID) แบบ 16 บิตตามที่เป็นอยู่ ช่วงที่ถูกต้องคือ 0-65535
- เครือข่าย CDMA (2G) ใช้รหัสสถานีฐาน (BID) แบบ 16 บิตตามที่เป็นอยู่ ช่วงที่ถูกต้องคือ 0-65535
- เครือข่าย WCDMA (3G) ใช้ UTRAN/GERAN Cell Identity (UC-ID) ซึ่งเป็นค่าจำนวนเต็ม 28 บิตที่เชื่อมโยง Radio Network Controller Identifier (RNC-ID) 12 บิตและ Cell ID (CID) 16 บิตเข้าด้วยกัน
สูตร:rnc_id << 16 | cid
ช่วงที่ใช้ได้: 0–268435455
หมายเหตุ: การระบุเฉพาะค่ารหัสเซลล์ 16 บิตในเครือข่าย WCDMA จะทำให้ได้ผลลัพธ์ที่ไม่ถูกต้องหรือไม่มีผลลัพธ์ - เครือข่าย LTE (4G) ใช้ E-UTRAN Cell Identity (ECI) ซึ่งเป็นค่าจำนวนเต็ม 28 บิตที่เชื่อมโยง E-UTRAN Node B Identifier (eNBId) ขนาด 20 บิตและ Cell ID (CID) ขนาด 8 บิตเข้าด้วยกัน
สูตร:enb_id << 8 | cid
ช่วงที่ใช้ได้: 0–268435455
หมายเหตุ: การระบุเฉพาะค่ารหัสเซลล์ 8 บิตในเครือข่าย LTE จะส่งผลให้ได้ผลลัพธ์ที่ไม่ถูกต้องหรือไม่มีผลลัพธ์
การวางค่านอกช่วงเหล่านี้ในคำขอ API อาจส่งผลให้เกิดลักษณะการทำงานที่ไม่ได้กำหนดไว้ API อาจตัดตัวเลขให้สั้นลงตามดุลยพินิจของ Google เพื่อให้พอดีกับช่วงที่ระบุไว้ในเอกสาร อนุมานการแก้ไขเป็น 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
เครือข่ายที่ใหม่กว่าซึ่งมีรหัสเซลล์ยาวกว่า 32 บิตจะใช้ช่อง newRadioCellId แบบ 64 บิตเพื่อส่งรหัสเซลล์เครือข่ายไปยัง Geolocation API
- เครือข่าย NR (5G) ใช้ New Radio Cell Identity (NCI) แบบ 36 บิตตามที่เป็นอยู่
ช่วงที่ถูกต้อง: 0–68719476735
ตัวอย่างออบเจ็กต์เสาสัญญาณมือถือ NR ซึ่งเป็นส่วนหนึ่งของเนื้อความของคำขอมีดังนี้
{ ... "cellTowers": [ { "newRadioCellId": 68719476735, "mobileCountryCode": 310, "mobileNetworkCode": 410, "age": 0, "signalStrength": -60, } ] }
การตอบกลับคำขอก่อนหน้าจะมีลักษณะดังนี้
{ "location": { "lat": 37.7646157, "lng": -122.4127361 }, "accuracy": 1458.5570522410717 }
ออบเจ็กต์จุดเข้าใช้งาน Wi-Fi
อาร์เรย์ wifiAccessPoints ของเนื้อหาคำขอต้องมีออบเจ็กต์จุดเข้าใช้งาน Wi-Fi อย่างน้อย 2 รายการซึ่งแสดงถึงอุปกรณ์จุดเข้าใช้งานแบบอยู่กับที่ซึ่งแตกต่างกันทางกายภาพ ต้องระบุช่อง macAddress ส่วนฟิลด์อื่นๆ ทั้งหมดไม่บังคับ บริการนี้จะไม่สนใจจุดเข้าใช้งานที่เคลื่อนที่ เช่น จุดเข้าใช้งานในเครื่องบินและรถไฟ
| ช่อง | ประเภท JSON | คำอธิบาย | หมายเหตุ |
|---|---|---|---|
macAddress |
string |
ที่อยู่ MAC ของโหนด Wi-Fi ซึ่งโดยปกติจะเรียกว่า BSS, BSSID หรือที่อยู่ MAC |
ต้องระบุสตริงเลขฐาน 16 ที่คั่นด้วยโคลอน (:)
เฉพาะที่อยู่ 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 }
การตอบกลับสำหรับคำขอก่อนหน้าจะมีลักษณะดังนี้
{ "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 }
การยกเลิกจุดเข้าใช้งาน Wi-Fi ที่ไม่ได้ใช้
การนำออบเจ็กต์จุดเข้าใช้งาน Wi-Fi ที่มี macAddress ซึ่งเป็นที่อยู่ในการบรอดแคสต์ (FF:FF:FF:FF:FF:FF) หรือสงวนไว้โดย IANA ออกจะช่วยเพิ่มอัตราความสำเร็จของการเรียก API Geolocation ที่ใช้ Wi-Fi เป็นอินพุตได้ หากหลังจากกรองแล้ว ระบบระบุได้ว่าการเรียก Geolocation API จะไม่สำเร็จ ก็สามารถใช้การลดความเสี่ยง เช่น การใช้สัญญาณตำแหน่งที่เก่ากว่าหรือจุดเข้าใช้งาน Wi-Fi ที่มีสัญญาณอ่อนกว่า แนวทางนี้เป็นการแลกเปลี่ยนระหว่างความจำเป็นของแอปพลิเคชันในการประมาณตำแหน่งกับข้อกำหนดด้านความแม่นยำและความครอบคลุม เทคนิคการกรองต่อไปนี้แสดงวิธีกรองอินพุต แต่ไม่ได้แสดงการลดความเสี่ยงที่คุณในฐานะวิศวกรแอปพลิเคชันอาจเลือกใช้
ช่วงของที่อยู่ MAC ระหว่าง 00:00:5E:00:00:00 และ 00:00:5E:FF:FF:FF เป็นที่อยู่สงวนไว้สำหรับ IANA และมักใช้สำหรับฟังก์ชันการจัดการเครือข่ายและมัลติแคสต์ ซึ่งทำให้ไม่สามารถใช้เป็นสัญญาณตำแหน่งได้ นอกจากนี้ คุณควรนำที่อยู่ MAC เหล่านี้ออกจากอินพุตไปยัง API ด้วย
ตัวอย่างเช่น คุณสามารถรวบรวมที่อยู่ MAC ที่ใช้ได้สำหรับตำแหน่งทางภูมิศาสตร์จากอาร์เรย์ของสตริง macAddress ที่ชื่อ macs ได้ดังนี้
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")));
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')]
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 ในรายการ เนื่องจากรายการนี้มีที่อยู่ MAC ของ Wi-Fi น้อยกว่า 2 รายการ คำขอจึงไม่สำเร็จและระบบจะแสดงผลการตอบกลับ HTTP 404(notFound)
การตอบกลับตำแหน่งทางภูมิศาสตร์
คำขอตำแหน่งทางภูมิศาสตร์ที่สำเร็จจะแสดงผลการตอบกลับในรูปแบบ JSON ซึ่งกำหนดตำแหน่งและรัศมี
location: พิกัดละติจูดและลองจิจูดโดยประมาณของผู้ใช้ในหน่วยองศา มีช่องย่อยlat1 ช่องและlng1 ช่องaccuracy: ความแม่นยำของตำแหน่งโดยประมาณในหน่วยเมตร ซึ่งแสดงรัศมีของวงกลมรอบlocationที่ระบุ
{ "location": { "lat": 37.421875199999995, "lng": -122.0851173 }, "accuracy": 120 }
API จะแสดงผลตำแหน่งและรัศมีความแม่นยำตามสัญญาณอินพุต แม้ว่า API จะแสดงตำแหน่งที่มีความแม่นยำสูงได้ แต่ความแม่นยำอาจแตกต่างกันไปตามแหล่งที่มา จำนวน ความหนาแน่น และความแรงของสัญญาณที่ใช้ได้ โดยปกติแล้ว คุณจะเห็นรัศมีความแม่นยำต่อไปนี้
- จุดเข้าใช้งาน Wi-Fi: หากคำขอมี
wifiAccessPointsอย่างน้อย 2 รายการ รัศมีความแม่นยำที่แสดงผลโดยทั่วไปจะอยู่ที่ประมาณ 20 เมตร ความแม่นยำจะเพิ่มขึ้นตามจำนวนจุดเข้าใช้งานและสัญญาณที่แรงขึ้น (วัดเป็น dBm) โดยความแรงของสัญญาณมักจะอยู่ในช่วง -100 ถึง -20 dBm - เสาสัญญาณมือถือ: หากไม่มีข้อมูล Wi-Fi หรือมีไม่เพียงพอ API จะใช้
cellTowersเพื่อระบุตำแหน่ง ความแม่นยำจะแตกต่างกันอย่างมากตามประเภทเสาสัญญาณมือถือ ความแรงของสัญญาณ และความหนาแน่นของเครือข่าย ดังนี้- เซลล์มาโคร (ประเภทที่พบบ่อยที่สุด ใช้สำหรับการครอบคลุมพื้นที่กว้าง) มีความแม่นยำต่ำกว่า โดยปกติแล้วรัศมีจะอยู่ในช่วงหลายร้อยเมตร และอาจสูงถึงหลายพันเมตรในพื้นที่ที่มีเสาสัญญาณมือถือครอบคลุมเบาบาง สำหรับเซลล์มาโคร การได้รัศมีความแม่นยำต่ำกว่า 100 เมตรเป็นเรื่องที่เกิดขึ้นได้ยาก โดยทั่วไปแล้ว ความแม่นยำจะสูงขึ้นสำหรับเสาสัญญาณมือถือที่มีสัญญาณแรง โดยทั่วไปแล้ว สัญญาณที่แรงคือ > -110 dBm สำหรับ LTE (ช่วงสัญญาณ -140 ถึง -55 dBm), > -100 dBm สำหรับ WCDMA (ช่วงสัญญาณ -111 ถึง -53 dBm), > -100 dBm สำหรับ CDMA (ช่วงสัญญาณ -120 ถึง -40 dBm) และ > -80 dBm สำหรับ GSM (ช่วงสัญญาณ -121 ถึง -1 dBm)
- เซลล์ขนาดเล็ก (เช่น Femtocell, Picocell หรือรีพีทเตอร์ในอาคาร) ให้ตำแหน่งตามเซลล์ที่แม่นยำที่สุด โดยมีรัศมีความแม่นยำอยู่ในช่วง 10-30 เมตร
- ตำแหน่งทางภูมิศาสตร์ของ IP: หาก
considerIpเป็นtrueและไม่สามารถระบุตำแหน่งทางภูมิศาสตร์ของสัญญาณ Wi-Fi หรือเสาสัญญาณมือถือได้ API จะประมาณตำแหน่งตามที่อยู่ IP ของคำขอ วิธีนี้มีความแม่นยำต่ำที่สุด โดยมีรัศมีได้หลายพันเมตร ดูเหตุใดรัศมีความแม่นยำจึงกว้างมาก ในคู่มือการแก้ปัญหา