溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

地理定位(一)

發(fā)布時間:2020-04-09 06:24:04 來源:網(wǎng)絡 閱讀:543 作者:ghcomeon 欄目:移動開發(fā)

Geolocation可以實現(xiàn)對訪客地理定位,當然,這種定位并不是說判斷用戶在那個國家,或是哪個國家的哪個城市,而是確定用戶在城市的那個街道上,甚至是用戶正在拿著手機在哪里上網(wǎng),給出這個地點的坐標位置。

下面列出了支持地理定位的瀏覽器


IE
Firefox
Chrome
Safari
Opera
Safari iOS
Andriod
最低版本
9
3.5
5
3
10.6
3.2
2.1

問題最嚴重仍然是IE“老大哥”,比如IE7、IE8,要想在瀏覽器上實現(xiàn)地理定位功能,可以借助Google Gears,Google Gears只是對老版本瀏覽器的一個補救措施,Google現(xiàn)放棄對它的維護。補救的方法是:像安裝其它瀏覽器插件一樣,讓訪客在自己的瀏覽器上安裝Google Gears。如果訪客計算機中沒有安裝Google Gears,還可以使用Chrome Fram,或是讓訪客自己輸入當前位置。

地理定位的基本原理

   為了得到用戶的位置信息,瀏覽器會爭取位置提供商(location provider)的幫助。比如Firefox瀏覽器使用的是Google Location Services。當然,即使瀏覽器支持地理定位功能,如果你不允許,也不會把你的位置透漏給瀏覽器。

   對于通過網(wǎng)線(不是無線)上網(wǎng)的桌面計算機來說,辦法很簡單,就是定位不太準確。用戶一上網(wǎng),他的信息就會通過雙絞線在計算機或本地網(wǎng)上傳輸。這個設備有唯一的IP地址(注意地理定位不使用局域網(wǎng)內(nèi)的私有IP地址),靠這個IP就能在Internet上找到他。與IP地址對應,還有一個現(xiàn)實中的郵政編碼。

   位置提供商會把這兩個信息綜合起來。首先,找到你連接的IP地址,然后,確定使用該IP地址的路由器的位置。因為這個信息是間接的,所以使用桌面計算機的地理定位并不準確,但畢竟可以確定你所在的街道的位置。

   如果使用筆記本或是移動設備無線上網(wǎng),位置提供商會尋找你附近的無線接入點。理想情況下,位置提供商會查詢一個大型數(shù)據(jù)庫,以確定你周圍幾個接入點的確切位置,然后再使用三角測量法算出你的位置。

   如果是使用手機上網(wǎng),位置提供商還會采用類似的三角測量法,但是使用的信號發(fā)射塔的位置。經(jīng)過迅速而相對準確的計算,最終得到的位置誤差大約在1000米左右。如果在高樓林立的市中心,由于信號發(fā)射塔相對較多,地理定位的結(jié)果也會更準確。

   還有很多的移動設備都配有專用的GPS組件,GPS使用的是衛(wèi)星定位,誤差只有幾米。但GPS速度慢,耗電多。而且GPS在高樓林立的地區(qū)不好使,因為高大的建筑會屏蔽信號。

   另外還有其它的技術可以用于地理定位。位置提供商會想更多的辦法獲得位置信息,比如RFID芯片、藍牙設備以及Google Maps設置的cookie等。

   注意,無論你通過什么方式上網(wǎng)—就算是臺式機,地理定位都可以大概找到你。而如果使用能接受電話信號或是配有GPS芯片的設備,地理定位的坐標的準確性更是驚人。

查找訪客的坐標

地理定位的功能實際上是非常簡單的,主要就是navigator.geolocation對象的三個方法:

  • getCurrentPosition();

  • watchPosition();

  • clearWatch();

getCurrentPosition()方法取得訪客的位置。當然,查找位置不會立即返回結(jié)果,瀏覽器也不想鎖定頁面等待位置數(shù)據(jù)。所以getCurrentPosition()方法是異步,它會立即執(zhí)行,但不會阻塞其它的代碼。完成地理定位后,它會觸發(fā)另一段代碼來處理返回的結(jié)果。

   測試地理定位的時候,需要使用支持地理定位的瀏覽器(我使用的Firefox),并且允許網(wǎng)頁訪問你的數(shù)據(jù)。在學會使用錯誤處理和地理定位設置的知識。

錯誤處理

如果訪客不愿意共享他們的位置數(shù)據(jù),那地理定位就不會返回位置信息。在這樣的情況下,根本不會調(diào)用完成函數(shù),而頁面也沒有辦法告訴你瀏覽器是在繼續(xù)挖掘數(shù)據(jù),還是遇到了錯誤。為解決這個問題,可以在調(diào)用getCurrentPosition()時傳入兩個參數(shù),第一個是函數(shù)在頁面成功取得數(shù)據(jù)時調(diào)用,第二個函數(shù)在地理定位因錯誤而終止時調(diào)用。

以下是一個同時傳入完成函數(shù)和錯誤函數(shù)的例子:

window.onload = function() {
  results = document.getElementById("results");
  var myOptions = {
    zoom: 13,
    mapTypeId: google.maps.MapTypeId.ROADMAP
  };
  map = new google.maps.Map(document.getElementById("mapSurface"), myOptions);
  if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(
      geolocationSuccess, geolocationFailure
    );
    results.innerHTML = "定位已開始.";
  } else {
    results.innerHTML = "該瀏覽器不支持地理定位";
  }
};
function geolocationSuccess(position) {
results.innerHTML = "你的位置("+position.coords.latitude+","+position.coords.longitude+")";
}
function geolocationFailure(positionError) {
    results.innerHTML =
     "地理定位失敗";
}

   調(diào)用錯誤函數(shù)時,瀏覽器會給錯誤函數(shù)傳入一個錯誤對象,這個對象有兩個屬性:code和message。code屬性是一個數(shù)值,表示問題類型;message中包含著對問題的簡短描述。一般來說,message屬性多用于測試,而code屬性用于確定如何進行下一步的處理。下面是修改后的錯誤函數(shù),檢測了code屬性所有可能的值:

function geolocationFailure(positionError) {
  if (positionError.code == 1) {
    results.innerHTML =
     "你已拒絕位置信息共享";
  }
  else if (positionError.code == 2) {
    results.innerHTML =
     "網(wǎng)絡連接失敗或位置服務不可用。";
  }
  else if (positionError.code == 3) {
    results.innerHTML =
     "獲取位置超時,請重試。";
  }
  else {
    results.innerHTML =
     "Sorry !發(fā)生未知的錯誤。";
  }
}


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI