Dive Into HTML5:地理位置

地理位置能夠找到你在這個世界上的位置,若是你願意,還能夠將這個信息分享給你的朋友。咱們有不少種方法來找出你所在的位置:IP 地址,無線網絡的鏈接(咱們能夠根據你的手機鏈接到哪一個基站來識別出位置),或者是設備中的 GPS 模塊。html

FAQhtml5

Q: 地理位置聽起來很恐怖,我能夠關閉嗎?git

A: 與遠程服務器共享你的物理位置的確是一件涉及隱私的問題。地理位置 API 明確要求:「User Agent 不可以在不經用戶容許的狀況下發送位置信息。」換句話說,分享你的位置是可選的。若是你不肯意,不要分享就行了。web

地理位置 API

地理位置 API 可讓你同信任的網站分享位置信息。頁面的 JavaScript 能夠獲取緯度和經度信息,這些信息能夠發送到遠程服務器上,以便完成一些與位置相關的操做,好比本地商業信息或者在地圖上顯示你的位置等。後端

下面的表格顯示,地理位置 API 在絕大多數桌面和手機瀏覽器上均可以使用。另外,老版本的瀏覽器或設備也可使用第三方庫來實現相似的功能,這一點咱們會在後面詳細講述。瀏覽器

IE Firefox Safari Chrome Opera iPhone Android
9.0+ 3.5+ 5.0+ 5.0+ 10.6+ 3.0+ 2.0+

除了支持標準的地理位置 API,一些移動設備還支持某些特殊的 API。咱們在後面的內容中也會對此有所闡述。服務器

從代碼提及

地理位置 API 會在全局 navigator 對象增長一個新的屬性:navigator.geolocation。使用 API 最簡單的代碼相似這樣:網絡

JavaScript Code複製內容到剪貼板
  1. function get_location() {  
  2.     navigator.geolocation.getCurrentPosition(show_map);  
  3. }  

咱們的代碼沒有檢測信息,沒有錯誤處理,沒有各類選項。正式的 web 程序至少應該包含這裏所說的前兩個。爲了檢測地理位置 API,咱們可使用 Modernizr:異步

JavaScript Code複製內容到剪貼板
  1. function get_location() {  
  2.     if (Modernizr.geolocation) {  
  3.         navigator.geolocation.getCurrentPosition(show_map);  
  4.     } else {  
  5.         // no native support; maybe try Gears?  
  6.     }  
  7. }  

你本身要決定,若是地理位置不能使用該怎麼辦。一下子咱們將解釋 Gears 的 fallback 選項,但如今咱們先來講說在調用 getCurrentPosition() 的時候究竟會發生什麼。就像咱們前面所說的,地理位置是可選的。這意味着瀏覽器不會強制向服務器發送你的當前物理位置。不一樣瀏覽器的處理是不同的。在 Mozilla Firefox 中,調用 getCurrentPosition() 函數將在瀏覽器窗口頂部彈出提示欄,相似下面的截圖:函數

咱們來解釋一下這個提示。做爲一個最終用戶,這個提示會告訴你這幾個信息:

  • 有網站想要你的位置信息;
  • 哪一個網站想要你的位置信息;
  • 「瞭解更多…」 是 Mozilla 的幫助頁面,這個頁面會解釋下面將會發生什麼(小故事:Google 會按照其 Location Service Privacy Policy 提供和存儲你的數據);
  • 能夠選擇分享你的位置;
  • 能夠選擇不分享你的位置;
  • 能夠選擇「永遠共享」,「永不共享」和「暫不」

另外,這個提示:

  • 非模態的,因此你沒必要擔憂不能切換到其餘窗口或標籤頁;
  • 獨立於標籤頁,所以當你切換瀏覽器窗口或標籤頁的時候,這個標記將會消失,切換回來的時候又會出現;
  • 不可控的,因此沒有辦法繞過
  • 阻塞的,所以只要你不作出選擇,網站就不能作出任何操做。

剛剛見到的是使用 JavaScript 代碼顯示這個提示框。這是一個簡單的函數調用,接受一個回調函數(這裏咱們的回調函數就是 show_map)。getCurrentPosition() 的調用會當即返回,可是這並不意味着你立刻能夠訪問用戶位置信息。你第一次可以得到位置信息的地方是在這個回調函數裏面。回調函數看上去是這樣子的:

JavaScript Code複製內容到剪貼板
  1. function show_map(position) {  
  2.     var latitude = position.coords.latitude;  
  3.     var longitude = position.coords.longitude;  
  4.     // let's show a map or do something interesting!  
  5. }  

回調函數接受一個參數,這是一個有兩個屬性的對象:coords 和 timestamp。timestamp 是計算出來位置信息的時刻。(由於這個過程是異步的,咱們不能知道到底是何時得到的這個數據。用戶閱讀這個提示框,以及他們贊成共享位置都須要必定的 時間。帶有 GPS 模塊的設備也須要一段時間去鏈接 GPS 衛星。)coords 有像 latitude 和 longitude 這樣的屬性,用來給出用戶的物理位置信息。

position 對象
屬性 類型 說明
coords.latitude double 緯度:十進制浮點數,單位-度
coords.longitude double 經度:十進制浮點數,單位-度
coords.altitude double 或 null 海拔:高於參考橢球,單位-米
coords.accuracy double 精度:單位-米
coords.altitudeAccuracy double 或 null 海拔精度:單位-米
coords.heading double 或 null 與正北方向的偏移角度:順時針方向,單位-度
coords.speed double 或 null 移動速度:單位-米/秒
timestamp DOMTimeStamp 同 Date() 同樣

只有三個屬性是必需要有值的:coords.latitude,coords.longitude 和 coords.accuracy。其他的多是 null,這取決於你的設備和後端位置服務器的能力。若是有的話,heading 和 speed 屬性則要根據你先前的位置計算出來。

處理錯誤

地理位置很複雜,可能會出錯。咱們曾經提到過要求「用戶贊成」。若是你的程序須要用戶位置信息,可是用戶卻不一樣意,那你就鬱悶了。用戶選擇確定要放 在第一位。那麼咱們的代碼怎麼寫呢?這就用到了 getCurrentPosition() 的第二個參數:錯誤處理的回調函數:

JavaScript Code複製內容到剪貼板
  1. navigator.geolocation.getCurrentPosition(show_map, handle_error)  

若是有什麼出錯了,這個錯誤處理函數就會被調用,其參數是 PositionError 對象。

PositionError 對象
屬性 類型 說明
code short 枚舉類型
message DOMString 對最終用戶而言是不友好的
JavaScript Code複製內容到剪貼板
  1. function handle_error(err) {    
  2.     if (err.code == 1) {    
  3.         // user said no!    
  4.     }    
  5. }   

其中,code 是枚舉類型,其值爲:

  • PERMISSION_DENIED (1):用戶點擊「不要共享」按鈕,或者有其餘緣由沒法獲取位置信息;
  • POSITION_UNAVAILABLE (2):網絡錯誤,或者沒法鏈接到衛星;
  • TIMEOUT (3):網絡是暢通的,可是花費很長時間計算用戶位置。多長算「很長」?咱們之後會詳細解釋這個問題。
  • UNKNOWN_ERROR (0):其餘錯誤。 

Q: 地理位置 API 能夠在國際空間站上使用嗎?能夠在月球上或者其餘星球上用嗎?

A: 地理位置標準是這樣闡述的:「地理座標參考系的屬性值來自大地測量系統(World Geodetic System (2d) [WGS84])。不支持其餘參考系。」國際空間站位於地球軌道上,因此宇航員可使用經緯度和海拔來描述其位置。可是,大地測量系統是以地球爲中心的, 所以也就不能使用這個系統來描述月球或者其餘星球的位置了。

相關文章
相關標籤/搜索