HTML5 教程 / 地理定位

HTML5 Geolocation 地理定位API

HTML5 提供的 Geolocation API 是 Web 应用获取用户地理位置的核心接口,广泛应用于地图服务、位置签到、附近推荐等场景。

简介

Geolocation API 是 HTML5 引入的强大功能,它允许网页请求访问用户的地理位置信息。通过该 API,开发者可以获取用户的经度、纬度、海拔高度、移动速度等详细信息。该 API 基于 GPS、Wi-Fi、基站等多种定位方式,现代浏览器通常能够提供相当准确的定位结果。

注意事项
  • 使用地理定位需要用户明确授权
  • 必须在 HTTPS(生产环境)或 localhost(开发环境)下使用
  • 部分浏览器可能不支持该 API,需要进行兼容性检查
  • 定位精度受设备硬件和网络环境影响

基本 API 使用

使用navigator.geolocation对象获取当前位置信息。最常用的方法是getCurrentPosition(),它接受一个成功回调函数作为参数。

获取当前位置
if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(
        function(position) {
            var lat = position.coords.latitude;
            var lon = position.coords.longitude;
            console.log("纬度: " + lat + ", 经度: " + lon);
        },
        function(error) {
            console.log("获取位置失败: " + error.message);
        }
    );
} else {
    console.log("浏览器不支持地理定位");
} 

getCurrentPosition()方法可以接受三个参数:

  • successCallback - 成功获取位置时的回调函数
  • errorCallback - 获取位置失败时的回调函数(可选)
  • options - 配置选项对象(可选)

位置信息详解

成功回调函数返回的 Position 对象包含coords属性,其中包含了丰富的位置信息:

coords 属性说明
navigator.geolocation.getCurrentPosition(function(position) {
    // 基本坐标
    console.log(position.coords.latitude);   // 纬度
    console.log(position.coords.longitude);  // 经度
    console.log(position.coords.accuracy);   // 精度(米)
    
    // 高级信息
    console.log(position.coords.altitude);          // 海拔(米)
    console.log(position.coords.altitudeAccuracy);  // 海拔精度
    console.log(position.coords.heading);           // 方向(0-360度)
    console.log(position.coords.speed);              // 速度(米/秒)
    
    // 时间戳
    console.log(position.timestamp);
}); 
提示

altitude、heading、speed 等属性可能返回 null,因为并非所有设备都支持这些功能。在使用前建议进行 null 检查。

配置选项

通过第三个参数可以配置定位的行为,包括精度、超时时间等:

配置选项
var options = {
    enableHighAccuracy: true,   // 高精度模式(可能更慢)
    timeout: 5000,                // 超时时间(毫秒)
    maximumAge: 300000           // 缓存有效时间(毫秒)
};

navigator.geolocation.getCurrentPosition(success, error, options); 
  • enableHighAccuracy - 设为 true 会尝试使用 GPS 等高精度方式,但响应可能较慢
  • timeout - 设置请求超时时间,超时后会调用错误回调
  • maximumAge - 允许使用缓存的定位结果,0 表示不使用缓存

错误处理

定位可能因为多种原因失败,错误回调会接收到一个 PositionError 对象:

错误处理示例
function showError(error) {
    switch(error.code) {
        case error.PERMISSION_DENIED:
            alert("用户拒绝定位请求");
            break;
        case error.POSITION_UNAVAILABLE:
            alert("无法获取位置信息");
            break;
        case error.TIMEOUT:
            alert("定位请求超时");
            break;
        case error.UNKNOWN_ERROR:
            alert("发生未知错误");
            break;
    }
} 

持续位置追踪

除了获取单次位置,Geolocation API 还支持持续追踪用户位置,适用于导航、运动记录等场景:

watchPosition 示例
// 开始追踪位置
var watchId = navigator.geolocation.watchPosition(
    function(position) {
        console.log("新位置: " + position.coords.latitude + ", " + position.coords.longitude);
    },
    function(error) {
        console.log("追踪错误: " + error.message);
    },
    { enableHighAccuracy: true }
);

// 停止追踪
// navigator.geolocation.clearWatch(watchId); 

完整示例

下面是一个完整的地理位置获取示例:

💻 在线代码编辑器
👁️ 预览效果