组件:地理定位器

地理定位器组件是一个不可视组件,用于获取设备的地理位置信息(经纬度、海拔、速度等),并支持持续监听位置变化。它基于浏览器的 Geolocation API 实现,适用于位置服务、地图应用、定位导航、轨迹记录等场景。注意: 使用前需获得用户明确授权,且仅在 HTTPS 环境下可用。

典型使用场景:

  • 地图应用(显示用户当前位置)
  • 位置签到(打卡、签到功能)
  • 导航与轨迹记录(运动轨迹、行车路线)
  • 基于位置的服务(附近的人、周边推荐)
  • 物流追踪(包裹实时位置)

快速索引

你想知道什么直接看这里
如何获取当前位置获取位置(成功回调, 失败回调)
如何持续监听位置变化监听位置被改变(回调函数)
如何停止监听停止监听()
位置对象包含哪些信息见下方“位置信息详解”
如何判断用户是否授权通过错误回调判断(权限被拒绝
如何检查是否支持定位调用 获取位置 并观察是否立即返回错误

基础示例

最简单的使用流程:获取当前位置 → 处理位置信息 → 处理错误。

变量 定位器 = 创建 地理定位器()

' 1. 获取当前位置
定位器.获取位置((位置对象) => {
        ' 成功回调
        调试输出("✅ 获取位置成功")
        调试输出("  纬度:" + 位置对象.coords.latitude)
        调试输出("  经度:" + 位置对象.coords.longitude)
        调试输出("  精度:" + 位置对象.coords.accuracy + " 米")
        弹出提示("当前位置:经度 " + 位置对象.coords.longitude + ",纬度 " + 位置对象.coords.latitude)
    },(错误对象) => {
        ' 失败回调
        调试输出("❌ 获取位置失败:" + 错误对象.message)
        如果(错误对象.code == 1)
            弹出提示("用户拒绝了位置授权")
        否则 如果(错误对象.code == 2)
            弹出提示("位置信息不可用,请检查GPS或网络")
        否则 如果(错误对象.code == 3)
            弹出提示("获取位置超时,请重试")
        否则
            弹出提示("定位失败:" + 错误对象.message)
        结束 如果
    }
)

综合示例:实时轨迹记录

本示例模拟一个轨迹记录应用,持续监听位置变化,并将每次位置更新添加到列表中,可用于运动记录、路线绘制等场景。

变量 定位器 = 创建 地理定位器()
变量 轨迹点列表 = []
变量 是否记录 = 假

' ========== 定义位置更新处理函数 ==========
函数 处理位置更新(位置对象)
    if (!是否记录) return
    
    变量 坐标 = 位置对象.coords
    变量 点 = {
        latitude: 坐标.latitude,
        longitude: 坐标.longitude,
        accuracy: 坐标.accuracy,
        altitude: 坐标.altitude,
        speed: 坐标.speed,
        timestamp: 位置对象.timestamp
    }
    添加成员(轨迹点列表, 点)
    
    变量 点数 = 取数组成员数(轨迹点列表)
    调试输出("📍 记录点 " + 点数 + ":(" + 坐标.latitude + ", " + 坐标.longitude + ")")
    ' 可在此更新 UI,例如在地图上绘制标记
结束 函数

' ========== 开始记录 ==========
函数 开始记录()
    是否记录 = 真
    
    ' 先获取一次当前位置(立即获取)
    定位器.获取位置((位置对象) => {
            处理位置更新(位置对象)
            ' 然后开始持续监听
            定位器.监听位置被改变(处理位置更新)
            弹出提示("开始记录轨迹")
        },(错误对象) => {
            弹出提示("无法获取位置:" + 错误对象.message)
            是否记录 = 假
        }
    )
结束 函数

' ========== 停止记录 ==========
函数 停止记录()
    是否记录 = 假
    定位器.停止监听()
    变量 点数 = 取数组成员数(轨迹点列表)
    弹出提示("已停止记录,共记录 " + 点数 + " 个轨迹点")
    调试输出("📊 轨迹点总数:" + 点数)
结束 函数

' ========== 演示:开始记录,5秒后停止 ==========
开始记录()
延时执行(() => {
    停止记录()
}, 5000)

函数详解

获取位置(成功回调, 失败回调)

  • 功能: 获取设备当前的地理位置信息(单次获取)。该方法会向用户弹窗请求授权(首次使用时)。
  • 参数:
    • 成功回调:函数,格式为 (位置对象) => { ... },位置对象包含经纬度、精度、海拔等信息(详见下方“位置信息详解”)。
    • 失败回调:函数,格式为 (错误对象) => { ... },错误对象包含 codemessage 属性。
  • 返回值: 无。
  • 示例: 见基础示例。

监听位置被改变(回调函数)

  • 功能: 持续监听设备位置变化,每当位置更新时触发回调。适合实时跟踪场景(如导航)。
  • 参数: 回调函数,格式同 成功回调,每次位置变化都会调用。
  • 返回值: 无。
  • 示例: 定位器.监听位置被改变((位置) => { 调试输出(位置.coords.latitude) })

停止监听()

  • 功能: 停止位置变化监听,释放相关资源。不再触发 监听位置被改变 的回调。
  • 返回值: 无。
  • 示例: 定位器.停止监听()

位置信息详解

成功回调 返回的 位置对象 包含以下属性:

属性类型说明
coords.latitude数值纬度(-90 到 90)
coords.longitude数值经度(-180 到 180)
coords.accuracy数值经纬度精度(米)
coords.altitude数值(可能为 海拔(米)
coords.altitudeAccuracy数值(可能为 海拔精度(米)
coords.heading数值(可能为 行进方向(0-360 度,相对正北)
coords.speed数值(可能为 速度(米/秒)
timestamp数值时间戳(毫秒)

💡 部分属性(如 headingspeed)仅在移动设备且启用 GPS 时有效,桌面浏览器通常为


错误对象详解

失败回调 返回的 错误对象 包含以下属性:

属性说明
code错误码:1 用户拒绝授权,2 位置不可用(如 GPS 关闭),3 获取超时
message错误描述文本

事件说明

地理定位器组件的事件与回调函数对应关系如下:

事件对应方法触发时机
位置被改变(事件源)监听位置被改变位置发生变化(持续监听模式下)

注意: 获取位置 的成功/失败是通过回调函数传递的,没有对应的事件。


⚠️ 注意事项

  1. 用户授权:首次调用 获取位置 会弹窗请求权限,用户拒绝后需引导用户手动开启(在浏览器设置中)。
  2. HTTPS 要求:地理定位功能仅在安全上下文(HTTPS)或 localhost 下可用。
  3. 超时设置:目前组件未提供超时配置,默认超时时间由浏览器决定(通常较长),若需调整可考虑封装自定义逻辑。
  4. 功耗与电量:持续监听位置变化会消耗较多电量,建议在不需要时调用 停止监听()
  5. 精度与响应速度accuracy 越小精度越高,但获取时间可能更长。浏览器会根据设备自动平衡。
  6. 位置缓存:有时浏览器会返回缓存的位置数据,可通过 timestamp 判断是否过旧。
  7. 错误处理:务必设置失败回调,尤其是处理用户拒绝授权的情况,提供友好的降级方案。
  8. 后台运行:浏览器页面切换到后台时,位置监听可能被暂停或节流,建议结合页面可见性 API 管理监听状态。
  9. 模拟器测试:在浏览器开发者工具中,可模拟位置数据(Chrome DevTools 的 Sensors 面板)。
  10. 坐标系:返回的经纬度为 WGS84 坐标系,可直接用于主流地图服务(如高德、百度需要转换坐标系)。

相关文档

  • 文档不可视类型组件_后台任务 —— 后台线程处理
  • 文档图像类组件_画板 —— 绘制位置轨迹
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、条件判断等
  • 文档综合演示:轨迹记录应用 —— 实际应用示例