คำขอระบุตำแหน่งทางภูมิศาสตร์
ระบบจะส่งคำขอระบุตำแหน่งทางภูมิศาสตร์โดยใช้ POST ไปยัง URL ต่อไปนี้
https://www.googleapis.com/geolocation/v1/geolocate?key=YOUR_API_KEY
คุณต้องระบุคีย์ในคำขอ โดยรวมเป็นค่าของพารามิเตอร์
key A 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 เป็นค่าเริ่มต้น
ซึ่ง จะ ส่งผลให้ได้ผลลัพธ์ที่ไม่ถูกต้องหรือเป็น 0 หากประเภทวิทยุที่สันนิษฐานไว้
ไม่ถูกต้อง |
carrier |
string |
ชื่อผู้ให้บริการขนส่ง | |
considerIp |
boolean |
ระบุว่าจะใช้การระบุตำแหน่งทางภูมิศาสตร์ด้วย IP เป็นตัวเลือกสำรองหรือไม่ หากไม่มีสัญญาณ WiFi และเสาสัญญาณมือถือ สัญญาณว่างเปล่า หรือสัญญาณไม่เพียงพอที่จะประมาณตำแหน่งของอุปกรณ์ | ค่าเริ่มต้นคือ true ตั้งค่า considerIp เป็น
false เพื่อป้องกันไม่ให้ใช้ตัวเลือกสำรอง |
cellTowers |
array |
อาร์เรย์ของออบเจ็กต์เสาสัญญาณมือถือ | ดูส่วนออบเจ็กต์เสาสัญญาณมือถือด้านล่าง |
wifiAccessPoints |
array |
อาร์เรย์ของออบเจ็กต์จุดเข้าใช้งาน WiFi | ดูส่วนออบเจ็กต์จุดเข้าใช้งาน WiFi ด้านล่าง |
ตัวอย่างเนื้อความของคำขอ API Geolocation แสดงไว้ด้านล่าง
{ "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 |
ระบบจะไม่ใช้ช่องที่ไม่บังคับต่อไปนี้ แต่คุณอาจรวมไว้ได้หากมีค่า
การคำนวณ cellId
วิทยุประเภทก่อน NR (5G) ใช้ช่อง cellId แบบ 32 บิตเพื่อส่งรหัสเซลล์เครือข่าย ไปยัง 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 } ] }
การตอบกลับสำหรับคำขอก่อนหน้าจะมีลักษณะดังนี้
{ "location": { "lat": 37.7801129, "lng": -122.4168229 }, "accuracy": 180.052 }
การคำนวณ
newRadioCellId
เครือข่ายใหม่กว่าซึ่งรหัสเซลล์ยาวกว่า 32 บิตจะใช้ช่อง 64 บิต
newRadioCellId เพื่อส่งรหัสเซลล์เครือข่ายไปยัง
Geolocation API
- เครือข่าย NR (5G) ใช้รหัสเซลล์วิทยุใหม่ (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 }
ออบเจ็กต์จุดเข้าใช้งาน WiFi
อาร์เรย์ wifiAccessPoints ของเนื้อความคำขอต้องมีออบเจ็กต์จุดเข้าใช้งาน WiFi ตั้งแต่ 2 รายการขึ้นไป ซึ่งแสดงถึงอุปกรณ์จุดเข้าใช้งานแบบอยู่กับที่ ที่แตกต่างกันทางกายภาพ ช่อง macAddress เป็นช่องที่
ต้องระบุ ส่วนช่องอื่นๆ ทั้งหมดไม่บังคับ บริการจะละเว้นจุดเข้าใช้งาน
ที่เคลื่อนที่ เช่น จุดเข้าใช้งานในเครื่องบินและรถไฟ
| ช่อง | ประเภท JSON | คำอธิบาย | หมายเหตุ |
|---|---|---|---|
macAddress |
string |
ที่อยู่ MAC ของโหนด WiFi โดยทั่วไปจะเรียกว่า BSS, BSSID หรือที่อยู่ MAC |
จำเป็น สตริงเลขฐาน 16 ที่คั่นด้วยโคลอน (:)
API จะระบุตำแหน่งได้เฉพาะที่อยู่ MAC ที่มีการดูแลจัดการเป็นสากลเท่านั้น ระบบจะละเว้นที่อยู่ MAC อื่นๆ โดยไม่มีการแจ้งเตือน และอาจทำให้คำขอ API ว่างเปล่า ดูรายละเอียดได้ที่การละเว้นจุดเข้าใช้งาน WiFi ที่ไม่มีประโยชน์ |
signalStrength |
number (double) |
ความแรงของสัญญาณปัจจุบันที่วัดเป็น dBm | สำหรับจุดเข้าใช้งาน WiFi ค่า dBm โดยทั่วไปจะอยู่ที่ -35 หรือต่ำกว่า และมีช่วงตั้งแต่ -128 ถึง -10 dBm
อย่าลืมใส่เครื่องหมายลบ สำหรับค่าที่มากกว่า -10 dBm API จะแสดงผล NOT FOUND |
age |
number (uint32) |
จำนวนมิลลิวินาทีตั้งแต่ตรวจพบจุดเข้าใช้งานนี้ | |
channel |
number (uint32) |
ช่องที่ไคลเอ็นต์ใช้สื่อสารกับจุดเข้าใช้งาน | |
signalToNoiseRatio |
number (double) |
อัตราส่วนสัญญาณต่อสัญญาณรบกวนปัจจุบัน ที่วัดเป็น dB |
ตัวอย่างออบเจ็กต์จุดเข้าใช้งาน WiFi ซึ่งเป็นส่วนหนึ่งของ เนื้อความคำขอแสดงไว้ด้านล่าง
{ ... "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 }
การละเว้นจุดเข้าใช้งาน WiFi ที่ไม่ได้ใช้
การนำออบเจ็กต์จุดเข้าใช้งาน WiFi ที่มี macAddress เป็น
ที่อยู่บรอดแคสต์ (FF:FF:FF:FF:FF:FF) หรือ IANA สงวนไว้
จะช่วยเพิ่มอัตราความสำเร็จของการเรียก Geolocation API ที่ใช้ WiFi เป็น
อินพุต หากหลังจากกรองแล้ว ระบบพิจารณาได้ว่าการเรียก Geolocation API จะไม่สำเร็จ คุณสามารถใช้การบรรเทาผลกระทบ เช่น การใช้สัญญาณตำแหน่งที่เก่ากว่าหรือ AP WiFi ที่มีสัญญาณอ่อนกว่า แนวทางนี้เป็นการแลกเปลี่ยนระหว่างความต้องการประมาณตำแหน่งของ
แอปพลิเคชันกับข้อกำหนดด้านความแม่นยำและความอ่อนไหว
เทคนิคการกรองต่อไปนี้แสดงวิธีกรอง
อินพุต แต่ไม่ได้แสดงการบรรเทาผลกระทบที่คุณในฐานะวิศวกรแอปพลิเคชัน
อาจเลือกใช้
IANA สงวนที่อยู่ MAC ในช่วงระหว่าง 00:00:5E:00:00:00 และ 00:00:5E:FF:FF:FF ไว้ และมักใช้สำหรับการจัดการเครือข่ายและฟังก์ชันมัลติแคสต์ ซึ่งทำให้ไม่สามารถใช้เป็นสัญญาณตำแหน่งได้ นอกจากนี้ คุณควรนำที่อยู่ 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 ของ WiFi น้อยกว่า 2 รายการ คำขอจึงไม่สำเร็จและระบบจะแสดงการตอบกลับ HTTP 404
(notFound)
การตอบกลับการระบุตำแหน่งทางภูมิศาสตร์
คำขอระบุตำแหน่งทางภูมิศาสตร์ที่สำเร็จจะแสดงการตอบกลับในรูปแบบ JSON ซึ่งกำหนดตำแหน่งและรัศมี
location: พิกัดละติจูดและลองจิจูดโดยประมาณของผู้ใช้ ในหน่วยองศา มีฟิลด์ย่อยlatและlngอย่างละ 1 รายการaccuracy: ความแม่นยำของตำแหน่งโดยประมาณในหน่วย เมตร ซึ่งแสดงถึงรัศมีของวงกลมรอบๆlocationที่ระบุ
{ "location": { "lat": 37.421875199999995, "lng": -122.0851173 }, "accuracy": 120 }
API จะแสดงตำแหน่งและรัศมีความแม่นยำตามสัญญาณอินพุต แม้ว่า API จะแสดงตำแหน่งที่มีความแม่นยำสูงได้ แต่ความแม่นยำอาจแตกต่างกันไปตามแหล่งที่มา จำนวน ความหนาแน่น และความแรงของสัญญาณที่ใช้ได้ โดยทั่วไปคุณจะได้รับรัศมีความแม่นยำดังต่อไปนี้
- จุดเข้าใช้งาน WiFi: หากคำขอมี
wifiAccessPointsตั้งแต่ 2 รายการขึ้นไป รัศมีความแม่นยำที่แสดงโดยทั่วไปจะอยู่ที่ประมาณ 20 เมตร ความแม่นยำจะดีขึ้นตามจำนวนจุดเข้าใช้งานและ สัญญาณที่แรงขึ้น (วัดเป็น dBm) โดยความแรงของสัญญาณโดยทั่วไปจะอยู่ในช่วง -100 ถึง -20 dBm - เสาสัญญาณมือถือ: หากไม่มีข้อมูล WiFi หรือข้อมูลไม่เพียงพอ
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)
- เซลล์ขนาดเล็ก (เช่น เฟมโตเซลล์ พิโคเซลล์ หรือตัวทวนสัญญาณในอาคาร) ให้ตำแหน่งที่แม่นยำที่สุดโดยอิงตามเซลล์ โดยมีรัศมีความแม่นยำอยู่ในช่วง 10-30 เมตร
- การระบุตำแหน่งทางภูมิศาสตร์ด้วย IP: หาก
considerIpเป็นtrueและไม่สามารถระบุตำแหน่งทางภูมิศาสตร์ของสัญญาณ WiFi หรือเสาสัญญาณมือถือได้ API จะประมาณ ตำแหน่งตามที่อยู่ IP ของคำขอ วิธีนี้ให้ความแม่นยำต่ำที่สุด โดยมีรัศมีหลายพันเมตร ดูหัวข้อ ทำไมรัศมีความแม่นยำจึงมีขนาดใหญ่มาก ในคู่มือการแก้ปัญหา