您好,登錄后才能下訂單哦!
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ā)生未知的錯誤。"; } }
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。