浅谈 HTML5 Geolocation

Geolocation API

HTML5 中,window.navigator 对象新增了一个 geolocation 属性,可以使用 Geolocation API 对该属性进行访问。

地理位置 API 允许用户向 Web 应用程序提供他们的位置。出于隐私考虑,报告地理位置会先请求用户许可。

取得当前地理位置

异步请求获取用户位置,并查询定位硬件来获取最新信息。

  • 语法:
/**
 * @param onSuccess:必选,获取当前地理位置信息成功时执行的回调函数
 * @param onError:可选,获取当前地理位置信息失败时执行的回调函数
 * @param options:可选,可选属性列表
 */
void getCurrentPosition(onSuccess, onError, options);
  • 使用方法:
navigator.geolocation.getCurrentPosition(function(position)) {
    // 获取成功时的处理
}, function(error) {
    // 获取失败时的处理
}, {
    // 设置可选属性
}
  • 注意事项:
    默认情况下,getCurrentPosition() 会尽快返回一个低精度结果,这在开发人员不关心精确度,只关心快速获取结果的情况下很有用。有 GPS 的设备可能需要一分钟或更久来获取 GPS 定位,在这种情况下 getCurrentPosition() 会返回低精度数据(基于 IP 的定位或 Wi-Fi 定位)。

position 对象:

  • 来源:获取地理位置信息成功,则可以在获取成功后的回调函数中获得 position 对象。
  • 属性:
    • latitude:当前地理位置的纬度。
    • longitude:当前地理位置的经度。
    • altitude:当前地理位置的海拔高度(不能获取时为 null)。
    • accuracy:获取到的纬度或经度的精度(以米为单位)。
    • heading:设备的前进方向。用面朝正北方向的顺时针旋转角度来表示(不能获取时为 null)。
    • speed:设备的前进速度(以米/秒为单位,不能获取时为 null)。
    • timestamp:获取地理位置信息时的时间。

error 对象:

  • 来源:获取地理位置信息失败,则可以在获取失败后的回调函数中或的 error 对象。
  • 注意:当在浏览器中打开使用了 Geolocation API 来获得用户当前位置信息的页面时,浏览器会询问用户是否共享位置信息,如果用户在该页面中拒绝共享,也会引起错误的产生。
  • 属性:
    • code:
      • 1:用户拒绝了位置服务;
      • 2:获取不到位置信息;
      • 3:获取信息超时错误。
    • message:字符串,在该字符串中包含错误信息。
  • 示例:
navigator.geolocation.getCurrentPosition(
    function(position) {
        // 成功时执行的操作
    },
    // 捕获错误信息
    function(error) {
        var errorTypes = {
            1 : '位置服务被拒绝',
            2 : '获取不到位置信息',
            3 : '获取信息超时'
        };
        alert(errorTypes[error.code] + ": 不能确定你的当前地理位置。");
    }
};

可选属性列表:

  • enableHighAccuracy:是否要求高精度的地理位置信息,这个参数在很多设备上设置了都没用,因为使用在设备上时需要结合设备电量、具体地理情况来综合考虑。因此,多数情况下把该属性设为默认,由设备自身来调整。
  • timeout:对地理位置信息的获取操作做一个超时限制(单位为毫秒)。如果在该时间内未获取到地理位置信息,则返回错误。
  • maximumAge:对地理位置信息进行缓存的有效时间(单位为毫秒)。例如 maximumAge: 120000。如果 10 点整的时候获取过一次地理位置信息,10:01 的时候,再次调用 navigator.geolocation.getCurrentPosition 重新获取地理位置信息,则返回的依然为 10:00 时的数据(因为设置的缓存有效时间为 2 分钟)。超过这个时间后缓存的地理位置信息被废弃,尝试重新获取地理位置信息。如果该值被指定为 0,则无条件重新获取新的地理位置信息。

getCurrentPosition() 示例:

<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <meta http-equiv="x-ua-compatible" content="ie=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1">
    <title>获取当前位置的地理信息示例</title>
</head>
<body>
    <div id="map" style="width: 400px; height: 400px"></div>
    <script>
        function showObject(obj, k) {
            // 递归显示 object
            if(!obj) {
                return;
            }
            for(var i in obj) {
                if(typeof(obj[i) != 'object' || obj[i] == null) {
                    for(var j = 0; j < k; j++) {
                        document.write("    ");
                    }
                    document.write(i + " : " + obj[i] + "<br/>");
                } else {
                    document.write(i + " : " + "<br/>");
                    showObject(obj[i], k + 1);
                }
            }
        }
        function get_location() {
            if(navigator.geolocation) {
                navigator.geolocation.getCurrentPosition(show_map, handle_error, {
                    enableHighAccuracy : true,
                    maximumAge : 1000
                })
            } else {
                alert("你的浏览器不支持使用 HTML 5 获取地理位置信息。");
            }
        }
        function handle_error(err) {
            // 错误处理
            switch(err.code) {
                case 1 :
                    alert("位置服务被拒绝。");
                    break;
                case 2 :
                    alert("暂时获取不到位置信息。");
                    break;
                case 3 :
                    alert("获取信息超时。");
                    break;
                default :
                    alert("未知错误。");
                    break;
            }
        }
        function show_map(position) {
            // 显示地理信息
            var latitude = position.coords.latitude;
            var longitude = position.coords.longitude;
            showObject(position, 0);
        }
        get_location();
    </script>
</body>
</html>

持续监视当前地理位置的信息

使用 watchPosition 方法来持续获取用户的当前地理位置信息,它会定期自动获取。

  • 语法:
/**
 * 参数和 getCurrentPosition 方法的参数说明与使用方法相同。
 * @return int 返回一个 ID,唯一地标记该位置监视器,作为 clearWatch() 的参数来停止监视用户位置。
 */
int watchPosition(onSuccess, onError, options);
  • 注意事项:可以直接调用 watchPosition() 函数,不需要先调用 getCurrentPosition() 函数。

停止获取当前用户的地理位置信息

使用该方法可以停止对当前用户的地理位置信息的监视。

/**
 * @param watchId watchPosition() 返回的整数值
 */
void clearWatch(watchId);

浏览器兼容情况:

浏览器兼容情况
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351

推荐阅读更多精彩内容