Html5中提供了地理位置信息的API,通过浏览器来获取用户当前位置。基于此特性可以开发基于位置的服务应用。在获取地理位置信息前,首先浏览器都会向用户询问是否愿意共享其位置信息,待用户同意后才能使用。

Html5获取地理位置信息是通过Geolocation API提供,使用其getCurrentPosition方法,此方法中有三个参数,分别是成功获取到地理位置信息时所执行的回调函数,失败时所执行的回调函数和可选属性配置项。

如下Demo演示了通过Geolocation获取地理位置信息,并在百度地图上显示当前位置(通过调用百度地图API)。实验结果发现位置被定位到了大学城内环东四路入口处,与本人所在位置(华工学生宿舍)偏差还是有点大的,达到200-300米左右。

代码如下所示(其中convertor.js为百度地图提供的坐标转化文件):

<span style="color: #008080;"> 1</span> <span style="color: #0000ff;">&lt;!</span><span style="color: #ff00ff;">DOCTYPE html</span><span style="color: #0000ff;">&gt;</span>
<span style="color: #008080;"> 2</span> <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">html</span><span style="color: #0000ff;">&gt;</span>
<span style="color: #008080;"> 3</span>     <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">head</span><span style="color: #0000ff;">&gt;</span>
<span style="color: #008080;"> 4</span>         <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">title</span><span style="color: #0000ff;">&gt;</span>H5地理位置Demo<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">title</span><span style="color: #0000ff;">&gt;</span>
<span style="color: #008080;"> 5</span>         <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">script </span><span style="color: #ff0000;">src</span><span style="color: #0000ff;">="http://api.map.baidu.com/api?v=1.3"</span><span style="color: #ff0000;"> type</span><span style="color: #0000ff;">="text/javascript"</span><span style="color: #0000ff;">&gt;</span>
<span style="color: #008080;"> 6</span>         <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">script</span><span style="color: #0000ff;">&gt;</span>
<span style="color: #008080;"> 7</span>         <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">script </span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="text/javascript"</span><span style="color: #ff0000;"> src</span><span style="color: #0000ff;">="convertor.js"</span><span style="color: #0000ff;">&gt;</span>
<span style="color: #008080;"> 8</span>         <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">script</span><span style="color: #0000ff;">&gt;</span>
<span style="color: #008080;"> 9</span>     <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">head</span><span style="color: #0000ff;">&gt;</span>
<span style="color: #008080;">10</span>     <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">body</span><span style="color: #0000ff;">&gt;</span>
<span style="color: #008080;">11</span>         <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">div </span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="map"</span><span style="color: #ff0000;"> style</span><span style="color: #0000ff;">="width:600px; height:400px"</span><span style="color: #0000ff;">&gt;</span>
<span style="color: #008080;">12</span>         <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">div</span><span style="color: #0000ff;">&gt;</span>
<span style="color: #008080;">13</span>     <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">body</span><span style="color: #0000ff;">&gt;</span>
<span style="color: #008080;">14</span>     <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">script </span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="text/javascript"</span><span style="color: #0000ff;">&gt;</span>
<span style="color: #008080;">15</span>         <span style="color: #0000ff;">if</span> (window.navigator.geolocation) {
<span style="color: #008080;">16</span>             <span style="color: #0000ff;">var</span> options = {
<span style="color: #008080;">17</span>                 enableHighAccuracy: <span style="color: #0000ff;">true</span>,
<span style="color: #008080;">18</span>             };
<span style="color: #008080;">19</span>             window.navigator.geolocation.getCurrentPosition(handleSuccess, handleError, options);
<span style="color: #008080;">20</span>         } <span style="color: #0000ff;">else</span> {
<span style="color: #008080;">21</span>             alert("浏览器不支持html5来获取地理位置信息");
<span style="color: #008080;">22</span>         }
<span style="color: #008080;">23</span>         
<span style="color: #008080;">24</span>         <span style="color: #0000ff;">function</span> handleSuccess(position){
<span style="color: #008080;">25</span>             <span style="color: #008000;">//</span><span style="color: #008000;"> 获取到当前位置经纬度  本例中是chrome浏览器取到的是google地图中的经纬度</span>
<span style="color: #008080;">26</span>             <span style="color: #0000ff;">var</span> lng = position.coords.longitude;
<span style="color: #008080;">27</span>             <span style="color: #0000ff;">var</span> lat = position.coords.latitude;
<span style="color: #008080;">28</span>             <span style="color: #008000;">//</span><span style="color: #008000;"> 调用百度地图api显示</span>
<span style="color: #008080;">29</span>             <span style="color: #0000ff;">var</span> map = <span style="color: #0000ff;">new</span> BMap.Map("map");
<span style="color: #008080;">30</span>             <span style="color: #0000ff;">var</span> ggPoint = <span style="color: #0000ff;">new</span> BMap.Point(lng, lat);
<span style="color: #008080;">31</span>             <span style="color: #008000;">//</span><span style="color: #008000;"> 将google地图中的经纬度转化为百度地图的经纬度</span>
<span style="color: #008080;">32</span>             BMap.Convertor.translate(ggPoint, 2, <span style="color: #0000ff;">function</span>(point){
<span style="color: #008080;">33</span>                 <span style="color: #0000ff;">var</span> marker = <span style="color: #0000ff;">new</span> BMap.Marker(point);
<span style="color: #008080;">34</span>                 map.addOverlay(marker);
<span style="color: #008080;">35</span>                 map.centerAndZoom(point, 15);
<span style="color: #008080;">36</span>             });
<span style="color: #008080;">37</span>         }
<span style="color: #008080;">38</span>         
<span style="color: #008080;">39</span>         <span style="color: #0000ff;">function</span> handleError(error){
<span style="color: #008080;">40</span>         
<span style="color: #008080;">41</span>         }
<span style="color: #008080;">42</span>     <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">script</span><span style="color: #0000ff;">&gt;</span>
<span style="color: #008080;">43</span> <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">html</span><span style="color: #0000ff;">&gt;</span>

convertor.js文件:

<span style="color: #008080;"> 1</span> (function() { // 闭包
<span style="color: #008080;"> 2</span>     function load_script(xyUrl, callback) {
<span style="color: #008080;"> 3</span>         var head = document.getElementsByTagName('head')[0];
<span style="color: #008080;"> 4</span>         var script = document.createElement('script');
<span style="color: #008080;"> 5</span>         script.type = 'text/javascript';
<span style="color: #008080;"> 6</span>         script.src = xyUrl;
<span style="color: #008080;"> 7</span>         // 借鉴了jQuery的script跨域方法
<span style="color: #008080;"> 8</span>         script.onload = script.onreadystatechange = function() {
<span style="color: #008080;"> 9</span>             if ((!this.readyState || this.readyState === "loaded" || this.readyState === "complete")) {
<span style="color: #008080;">10</span>                 callback && callback();
<span style="color: #008080;">11</span>                 // Handle memory leak in IE
<span style="color: #008080;">12</span>                 script.onload = script.onreadystatechange = null;
<span style="color: #008080;">13</span>                 if (head && script.parentNode) {
<span style="color: #008080;">14</span>                     head.removeChild(script);
<span style="color: #008080;">15</span>                 }
<span style="color: #008080;">16</span>             }
<span style="color: #008080;">17</span>         };
<span style="color: #008080;">18</span>         // Use insertBefore instead of appendChild to circumvent an IE6 bug.
<span style="color: #008080;">19</span>         head.insertBefore(script, head.firstChild);
<span style="color: #008080;">20</span>     }
<span style="color: #008080;">21</span>     function translate(point, type, callback) {
<span style="color: #008080;">22</span>         var callbackName = 'cbk_' + Math.round(Math.random() * 10000); // 随机函数名
<span style="color: #008080;">23</span>         var xyUrl = "http://api.map.baidu.com/ag/coord/convert?from=" + type
<span style="color: #008080;">24</span>                 + "<span style="color: #ff0000;">&to</span>=4<span style="color: #ff0000;">&x</span>=" + point.lng + "<span style="color: #ff0000;">&y</span>=" + point.lat
<span style="color: #008080;">25</span>                 + "<span style="color: #ff0000;">&callback</span>=BMap.Convertor." + callbackName;
<span style="color: #008080;">26</span>         // 动态创建script标签
<span style="color: #008080;">27</span>         load_script(xyUrl);
<span style="color: #008080;">28</span>         BMap.Convertor[callbackName] = function(xyResult) {
<span style="color: #008080;">29</span>             delete BMap.Convertor[callbackName]; // 调用完需要删除改函数
<span style="color: #008080;">30</span>             var point = new BMap.Point(xyResult.x, xyResult.y);
<span style="color: #008080;">31</span>             callback && callback(point);
<span style="color: #008080;">32</span>         }
<span style="color: #008080;">33</span>     }
<span style="color: #008080;">34</span> 
<span style="color: #008080;">35</span>     window.BMap = window.BMap || {};
<span style="color: #008080;">36</span>     BMap.Convertor = {};
<span style="color: #008080;">37</span>     BMap.Convertor.translate = translate;
<span style="color: #008080;">38</span> })();