複製鏈接
請複製以下鏈接發送給好友

Geolocation

鎖定
Geolocation是一個基於地理位置的應用。是HTML5裏提出的一個綜合應用當前各種定位手段從而獲取用户的瀏覽器所在設備的位置的一組開發API。包括獲取一次位置以及連續獲取多次位置兩大類別,前者可以用於用户一次性定位,或者則可以實現對終端的連續跟蹤,用於終端的監控。
中文名
地理定位
外文名
Geolocation
獲取位置方式
IP地址、WIFI、通信基站、GPS等
優    點
綜合使用多種定位技術、跨平台
缺    點
定位精度可能不是、需較長時間

Geolocation應用背景

隨着互聯網技術的發展,基於地理位置的應用越來越火。HTML5也提供了地理位置API [1]  ,當前大多數的瀏覽器也都提供了相關的技術支持 [2]  。從而促進了以Web形式進行定位和相應的地圖服務相關應用的發展,也極大的降低了地理定位開發的門檻,使得隨遇性的地圖服務成為可能。它的出現進一步突破了位置服務必須安裝專業軟件的瓶頸,將對於硬件驅動的依賴降低到最低,只要有相關的硬件設備(如GPS模塊)就可以直接實現精準定位,將地理位置作為一個非常容易獲得的數據提供給用户。
當然,位置數據的輕易獲得也對用户的安全隱私造成了一定的隱患,從此,個人的隱私裏多了一條位置記錄。

Geolocation定位技術

綜合使用了包括以下幾類的定位方式。
由於IP是需要申請才能使用的,而這些IP很多是可以通過互聯網等手段訪問得到的,因此可以通過查詢IP等級機構的記錄獲取用户的位置。當然,很多時候獲取的是ISP機房的位置,但是獲取非常方便,幾乎沒有什麼限制。ip地址還是比較準確的,基本上上能精確到小區或大樓的標準,但也就是到這個程度。
2、GPS
通過使用美國的GPS衞星定位系統實現全球24小時時時定位,結果精度能夠達到10米。一般需要在户外,且需要較長時間搜索衞星,但是衞星信號容易受到建築物、水體等的干擾。當前很多設備尤其是移動設備基本都配置了相關的定位模塊,是當前獲取位置的最主要也是精度最高的方式。
3、基於WiFi基站mac地址。(連接位置已知的公共WiFi的時候,通過Mac地址識別WiFi接入點,從而定位)
這種定位的精度還是很不錯的,而且還可以在室內定位。不過由於這種位置公開的wifi比較少,此種方法的適用範圍比較少。據有關文獻顯示,Google通過瀏覽器等相關技術會收集一些WIFI基站的位置,作為基準點,從而為用户提供更好的定位。但是由於Google服務器在國外,國內用户通過這個方式進行定位存在一定難度,經常導致定位失敗。
4、 GSM或CDMA基站
通過移動通信的基站定位,精度隨基站密度變化,精度一般,而且只有手機能用,精度一般能夠達到100米左右。
5、用户指定位置
這個就不是HTML5的範疇了。

Geolocation地理位置獲取流程

1、用户打開需要獲取地理位置的web應用。
2、應用向瀏覽器請求地理位置,瀏覽器彈出詢問窗口,詢問用户是否共享地理位置。
3、假設用户允許,瀏覽器從設備查詢相關信息。
4、瀏覽器將相關信息發送到一個信任的位置服務器,服務器返回具體的地理位置。

Geolocation檢測瀏覽器支持性

function loadDemo() {
  if (navigator.geolocation) { 
    document.getElementById(“support”).innerHTML = “HTML5 Geolocation supported.”;
  } else { 
    document.getElementById(“support”).innerHTML = “HTML5 Geolocation is not supported inyour browser.”; 
  }
}

Geolocation位置請求方式

單次請求navigator.geolocation.getCurrentPosition(updateLocation, handleLocationError, options); [1] 
回調函數updateLocation接受一個對象參數,表示當前的地理位置,它有如下屬性:
latitude——緯度
longitude——經度
accuracy——精確度,單位米
altitude——高度,單位米
altitudeAccuracy——高度的精確地,單位米
heading—運動的方向,相對於正北方向的角度
speed——運動的速度(假設你在地平線上運動),單位米/秒
回調函數handleLocationError接受錯誤對象,error.code是如下錯誤號。
UNKNOWN_ERROR (error code 0) —— 錯誤不在如下三種之內,你可以使用error.message獲取錯誤詳細信息。
PERMISSION_DENIED (error code 1)—— 用户選擇不共享地理位置
POSITION_UNAVAILABLE (error code 2) ——無法獲取當前位置
TIMEOUT (error code 3) ——在指定時間無法獲取位置會觸發此錯誤。
第三個參數options是可選參數,屬性如下:
enableHighAccuracy——指示瀏覽器獲取高精度的位置,默認為false。當開啓後,可能沒有任何影響,也可能使瀏覽器花費更長的時間獲取更精確的位置數據。
timeout——指定獲取地理位置的超時時間,默認不限時。單位為毫秒
maximumAge——最長有效期,在重複獲取地理位置時,此參數指定多久再次獲取位置。默認為0,表示瀏覽器需要立刻重新計算位置。
參數使用的例子如下:
navigator.geolocation.getCurrentPosition(updateLocation,handleLocationError,{timeout:10000});
重複請求navigator.geolocation.watchPosition(updateLocation, handleLocationError);
使用 watchPosition可以持續獲取地理位置 [1]  ,瀏覽器或多次調用updateLocation函數以便傳遞最新的位置。該函數返回一個watchID,使用navigator.geolocation.clearWatch(watchId)可以清除此次回調,使用不帶參數的navigator.geolocation.clearWatch清除所有watchPosition。

Geolocation地址轉換

由於地理位置API返回的是經緯度,如果要計算兩個位置之間的距離,可以使用著名的Haversine公式計算兩個座標在地平線上的距離。
// Listing 4 - 7. A JavaScript Haversine implementation
function toRadians(degree) { 
  return degree * Math.PI / 180;
}
function distance(latitude1, longitude1, latitude2, longitude2) {// R is the radius of the earth in kilometers
  var R = 6371; var deltaLatitude = toRadians(latitude2 - latitude1); 
  var deltaLongitude = toRadians(longitude2 - longitude1); 
  latitude1 = toRadians(latitude1); 
  latitude2 = toRadians(latitude2); 
  var a = Math.sin(deltaLatitude / 2) * Math.sin(deltaLatitude / 2) + Math.cos(latitude1) * Math.cos(latitude2) * Math.sin(deltaLongitude / 2) * Math.sin(deltaLongitude / 2); 
  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); 
  var d = R * c; 
  return d;
}
參考資料