HTML5 Geolocation API 允許我們對喜歡的網(wǎng)站共享我們的位置。JavaScript 可以捕獲到緯度和經(jīng)度,還可以發(fā)送給后端服務(wù)器,然后做一些位置感知的事情,比如查找本地企業(yè)或者在地圖上顯示我們的位置。
當(dāng)前大多數(shù)瀏覽器和移動設(shè)備都支持 Geolocation API。地理定位 APIs 是作為全局 navigator 對象的一個新屬性工作的??梢园凑杖缦路绞絼?chuàng)建地理定位對象:
var geolocation = navigator.geolocation;
地理對象是一個允許組件檢索設(shè)備地理位置相關(guān)信息的服務(wù)對象。
地理定位對象提供了下列方法:
| 方法 | 描述 |
|---|---|
| getCurrentPosition() |
這個方法用于檢索用戶的當(dāng)前地理位置。 |
| watchPosition() |
這個方法用于檢索設(shè)備當(dāng)前地理位置定期更新信息。 |
| clearWatch() |
這個方法用于取消 watchPosition 方法調(diào)用。 |
下面是一個使用上述方法的示例代碼:
function getLocation() {
var geolocation = navigator.geolocation;
geolocation.getCurrentPosition(showLocation, errorHandler);
}
這里的 showLocation 和 errorHandler 分別是用來下一節(jié)會講述的獲取實際位置和處理錯誤的回調(diào)方法。
地理定位方法 getCurrentPosition() 和 getPositionUsingMethodName() 指定了檢索位置信息的回調(diào)方法。這些方法使用一個存儲完整位置信息的 Position 對象異步調(diào)用。
這個 Position 對象指定了設(shè)備的當(dāng)前地理位置。這個位置以一組帶有方向和速度信息的地理坐標(biāo)表示。
下面的表格描述了 Position 對象的屬性。對于可選屬性,如果系統(tǒng)沒有提供值,則該屬性值為 null。
| 屬性 | 類型 | 描述 |
|---|---|---|
| coords | objects |
表示設(shè)備的地理位置。位置以一組帶有方向和速度信息的地理坐標(biāo)表示。 |
| coords.latitude | Number |
十進(jìn)制的緯度估值。值范圍為 [-90.00, +90.00]。 |
| coords.longitude | Number |
十進(jìn)制的經(jīng)度固執(zhí)。值范圍為 [-180.00, +180.00]。 |
| coords.altitude | Number |
【可選】 WGS-84 球面以上的海拔高度固執(zhí),以米為單位計算。 |
| coords.accuracy | Number |
【可選】 以米為單位的緯度和經(jīng)度精確估值。 |
| coords.altitudeAccuracy | Number |
【可選】 以米為單位的海拔高度精確估值。 |
| coords.heading | Number |
【可選】 相對正北方向設(shè)備以順時針方向運動計算的當(dāng)前方向。 |
| coords.speed | Number |
【可選】 以米/每秒為單位的設(shè)備當(dāng)前地面速度。 |
| timestamp | date |
檢索位置信息和創(chuàng)建 Position 對象的日期時間。 |
下面是一個使用 Position 對象的示例代碼。其中 showLocation 方法是一個回調(diào)方法:
function showLocation( position ) {
var latitude = position.coords.latitude;
var longitude = position.coords.longitude;
...
}
地理定位是復(fù)雜的。非常需要我們捕獲任意錯誤并優(yōu)雅的處理它。
地理定位方法 getCurrentPosition() 和 watchPosition() 可以使用一個提供 PositionError 對象的錯誤處理回調(diào)方法。這個對象有下列兩屬性。
| 屬性 | 類型 | 描述 |
|---|---|---|
| code | Number |
錯誤碼。 |
| message | String |
錯誤描述信息。 |
下面這個表格描述了 PositionError 對象可能返回的錯誤碼。
| 錯誤碼 | 常量 | 描述 |
|---|---|---|
| 0 | UNKNOWN_ERROR |
由于未知錯誤,檢索設(shè)備位置信息失敗。 |
| 1 | PERMISSION_DENIED |
由于應(yīng)用程序沒有權(quán)限使用位置服務(wù),檢索設(shè)備位置信息失敗。 |
| 2 | POSITION_UNAVAILABLE |
設(shè)備位置信息無法確定。 |
| 3 | TIMEOUT |
不能在給定的最大超時區(qū)間內(nèi)檢索位置信息。 |
下面是一個使用 PositionError 對象的示例代碼。其中 errorHandler 方法是一個回調(diào)方法:
function errorHandler( err ) {
if (err.code == 1) {
// access is denied
}
...
}
下面是 getCurrentPosition() 方法的實際語法:
getCurrentPosition(callback, ErrorCallback, options)
其中第三個參數(shù)是指定一組檢索設(shè)備地理位置選項的 PositionOptions 對象。
下列選項可以指定為第三個參數(shù):
| 屬性 | 類型 | 描述 |
|---|---|---|
| enableHighAccuracy | Boolean |
是否想要檢索最精準(zhǔn)的位置估值。默認(rèn)值為 false。 |
| timeout | Number |
timeout 屬性就是 Web 應(yīng)用程序要等待定位的毫秒數(shù)。 |
| maximumAge | Number |
用于緩存位置信息的過期時間毫秒數(shù)。 |
下面這個示例代碼展示了如何使用上面提到的方法:
function getLocation() {
var geolocation = navigator.geolocation;
geolocation.getCurrentPosition(showLocation, errorHandler, {maximumAge: 75000});
}