HTML5的地理位置定位感覺是很cool的能力,我們公司原先的定位是在android上完成的,現在我來嘗試下使用HTML5的geolocation來做些事情看看。
HTML5的地理定位的采集方式:1. IP地址,2. GPS定位,3. MAC地址,4. GSM基站網絡,5. 用戶定義的地址位
老規矩,先簡單的嘗試下geolocationAPI應用
先HTML的代碼,那是相當簡單
- [html] view plaincopy
- <body>
- <input type="button" value="get Geo" />
- </body>
- javaScript的代碼如下
- [javascript] view plaincopy
- $(
- function() {
- $(":button").click(
- function() {
- navigator.geolocation.getCurrentPosition(
- function(e) { //成功回調
- $.log(e.coords.accuracy); //準確度
- $.log(e.coords.latitude); //緯度
- $.log(e.coords.longitude); //經度
- $.log(e.coords.altitude); //海拔高度
- $.log(e.coords.altitudeAccuracy); //海拔高度的精確度
- $.log(e.coords.heading); //行進方向
- $.log(e.coords.speed); //地面的速度
- $.log(new Date(e.timestamp).toLocaleDateString());//采集日期
- $.log(new Date(e.timestamp).toLocaleTimeString());//采集時間
- },
- function(e) { //失敗回調
- $.log(e.message); //錯誤信息
- $.log(e.code); //錯誤代碼
- },
- {//可選參數 JSON格式
- "enableHighAcuracy": false, //是否啟用高精確度模
- "timeout": 100, //在指定的時間內獲取位置信息
- "maximumAge": 0//瀏覽器重新獲取位置信息的時間間隔
- }
- );
- }
- );
- }
- );
現在你點擊按鈕,就可以在控制臺看到經緯度和采樣日期時間了。
那獲得了經緯度的值,必然首先要做的就是地圖定位了,現在主流的地圖服務我知道的有:baidu,google,和bing,下面我來測試我們得到的經緯度在這三個地圖服務中取得的地圖圖像吧。
baidu和bing我都查了官方的sample,但是,但是,我要狠狠的批評google,我用chrome瀏覽器訪問googleMapApi中的sample,竟然chrome告訴我“由于 google-developers.appspot.com 響應時間過長,導致“Google Chrome 瀏覽器”無法加載網頁。該網站可能已崩潰,或者您的互聯網連接出現了問題。”google,你看著辦吧。
先看看我們的body
- [javascript] view plaincopy
- <body>
- <div>
- <input type="button" value="get Geo" />
- </div>
- <div id="baiduMap" style="width: 300px; height: 300px; float: left;">
- </div>
- <div id="googleMap" style="width: 300px; height: 300px; float: left;">
- </div>
- <div id="bingMap" style="width: 300px; height: 300px; float: left; position: relative;">
- </div>
- </body>
然后引入三家的服務腳本
- [javascript] view plaincopy
- <script type="text/javascript" src="http://api.map.baidu.com/api?v=1.3"></script>
- <script src="http://maps.google.com/maps/api/js?sensor=false"></script>
- <script charset="UTF-8" type="text/javascript" src="http://dev.ditu.live.com/mapcontrol/mapcontrol.ashx?v=6.2&mkt=en-us"></script>
以下是測試代碼
- [javascript] view plaincopy
- $.log = function(msg) {
- console.log(msg);
- }
- $(
- function() {
- $(":button").click(
- function() {
- navigator.geolocation.getCurrentPosition(
- function(e) { //成功回調
- $.log(e.coords.accuracy); //準確度
- $.log(e.coords.latitude); //緯度
- $.log(e.coords.longitude); //經度
- $.log(e.coords.altitude); //海拔高度
- $.log(e.coords.altitudeAccuracy); //海拔高度的精確度
- $.log(e.coords.heading); //行進方向
- $.log(e.coords.speed); //地面的速度
- $.log(new Date(e.timestamp).toLocaleDateString()); //采集日期
- $.log(new Date(e.timestamp).toLocaleTimeString()); //采集時間
- createBaiduMap(e.coords.longitude, e.coords.latitude);
- createBingMap(e.coords.longitude, e.coords.latitude);
- createGoogleMap(e.coords.longitude, e.coords.latitude);
- },
- function(e) { //失敗回調
- $.log(e.message); //錯誤信息
- $.log(e.code); //錯誤代碼
- },
- {//可選參數 JSON格式
- enableHighAcuracy: false, //是否啟用高精確度模
- timeout: 100, //在指定的時間內獲取位置信息
- maximumAge: 0//瀏覽器重新獲取位置信息的時間間隔
- }
- );
- }
- );
- }
- );
- function createBaiduMap(longitude, latitude) {
- var map = new BMap.Map("baiduMap");
- var point = new BMap.Point(longitude, latitude);
- map.centerAndZoom(point, 15);
- }
- function createGoogleMap(longitude, latitude) {
- var map = new google.maps.Map(document.getElementById("googleMap"),
- {
- center: new google.maps.LatLng(latitude, longitude),
- zoom: 14,
- mapTypeId: google.maps.MapTypeId.ROADMAP,
- mapTypeControl: false,
- navigationControlOptions: { style: google.maps.NavigationControlStyle.SMALL }
- }
- );
- }
- function createBingMap(longitude, latitude) {
- var map = new VEMap("bingMap");
- var LA = new VELatLong(latitude, longitude);
- map.LoadMap(LA, 14, VEMapStyle.Road, false, VEMapMode.Mode2D, true, 1);
- }
基本代碼完成后,我們看到googleMap(以后簡稱gm)和bingMap(以后簡稱mm)默認有縮放都控制器,baiduMpa(以后簡稱bm)沒有帶,現在為bm加上控制器
- [javascript] view plaincopy
- function createBaiduMap(longitude, latitude) {
- var map = new BMap.Map("baiduMap");
- var point = new BMap.Point(longitude, latitude);
- map.centerAndZoom(point, 15);
- map.addControl(new BMap.NavigationControl());
- }
為bm添加了一個NavigationControl就可以看到效果了。
現在我們想在地圖上做一個標注,把我們給點的經緯度標注出來,同時我們也看看地圖服務商和HTML5的定位是不是比較準,三個地圖服務商的加標注代碼如下
- [javascript] view plaincopy
- function createBaiduMap(longitude, latitude) {
- var map = new BMap.Map("baiduMap");
- var point = new BMap.Point(longitude, latitude);
- map.centerAndZoom(point, 15);
- map.addControl(new BMap.NavigationControl());
- var marker = new BMap.Marker(point); //標注
- marker.setLabel(new BMap.Label("我在這里"));
- map.addOverlay(marker);
- }
- function createGoogleMap(longitude, latitude) {
- var map = new google.maps.Map(document.getElementById("googleMap"),
- {
- center: new google.maps.LatLng(latitude, longitude),
- zoom: 14,
- mapTypeId: google.maps.MapTypeId.ROADMAP,
- mapTypeControl: false,
- navigationControlOptions: { style: google.maps.NavigationControlStyle.SMALL }
- }
- );
- var marker = new google.maps.Marker({ position: new google.maps.LatLng(latitude, longitude),
- map: map,
- title: "我在這里" });
- }
- function createBingMap(longitude, latitude) {
- var map = new VEMap("bingMap");
- var LA = new VELatLong(latitude, longitude);
- map.LoadMap(LA, 14, VEMapStyle.Road, false, VEMapMode.Mode2D, true, 1); //圖釘
- var myPolygon = new VEShape(VEShapeType.Pushpin, new VELatLong(latitude, longitude, 0, VEAltitudeMode.Default));
- map.AddShape(myPolygon);
- myPolygon.SetTitle("我在這里");
- }
如果我在移動設備上進行采集數據的話,geo提供了一個異步的API:watchPosition,這個api是異步的,文檔上說:當檢測到設備的位置發生改變時,它返回設備的當前位置。當設備檢索到一個新的位置,會觸發geolocationSuccess回調函數并傳遞一個Position對象作為參數。如果發生錯誤,會觸發geolocationError回調函數并傳遞一個PositionError對象。不過具體我還沒有測試
代碼和getCurrentPosition很像的
- [javascript] view plaincopy
- $(
- function() {
- $(":button").click(
- function() {
- navigator.geolocation.watchPosition(
- function(e) { //成功回調
- $.log(e.coords.accuracy); //準確度
- $.log(e.coords.latitude); //緯度
- $.log(e.coords.longitude); //經度
- $.log(e.coords.altitude); //海拔高度
- $.log(e.coords.altitudeAccuracy); //海拔高度的精確度
- $.log(e.coords.heading); //行進方向
- $.log(e.coords.speed); //地面的速度
- $.log(new Date(e.timestamp).toLocaleDateString()); //采集日期
- $.log(new Date(e.timestamp).toLocaleTimeString()); //采集時間
- createBaiduMap(e.coords.longitude, e.coords.latitude);
- createBingMap(e.coords.longitude, e.coords.latitude);
- createGoogleMap(e.coords.longitude, e.coords.latitude);
- },
- function(e) { //失敗回調
- $.log(e.message); //錯誤信息
- $.log(e.code); //錯誤代碼
- },
- {//可選參數 JSON格式
- enableHighAcuracy: false, //是否啟用高精確度模
- timeout: 10, //在指定的時間內獲取位置信息
- maximumAge: 10, //瀏覽器重新獲取位置信息的時間間隔
- frequency: 1000//每隔3秒鐘檢索一次位置信息
- }
- );
- }
- );
- }
- );
要停止這個輪詢,只要用navigator.geolocation.clearWatch就可以了。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。