H5 navigator.geolocation 获取定位

本文介绍了浏览器原生的navigator.geolocationAPI的getCurrentPosition方法,详细讲解了如何获取设备地理位置信息,包括坐标、精度、速度等,并处理可能遇到的错误情况和配置选项。

navigator.geolocation 有三个方法:getCurrentPosition(),  watchPosition(), clearWatch()

getCurrentPosition() 是一个浏览器原生的API,用于获取设备的地理位置信息,具体的使用方法如下:

navigator.geolocation.getCurrentPosition(successCallback,  errorCallback, options);
const successCallback = (position)=>{
       const { longitude, latitude, accuracy, altitude, altitudeAcuracy,
             heading, speed, timestamp} = position;

       console.log(
           `经度为${longitude}, 纬度为${latitude}, 
           准确度为${accuracy},海拔为${altitude},
           海拔准确度为${altitudeAcuracy},行进方向为${heading},
           地面速度为${speed},请求时间为${new Date(timestamp)}` 
       );
}
const errorCallback = (error)=>{
    let message = ""
    switch (error.code) {
           case error.PERMISSION_DENIED:
                message = "用户拒绝对获取地理位置的请求。"
                break;
           case error.POSITION_UNAVAILABLE:
                message = "位置信息是不可用的。"
                break;
           case error.TIMEOUT:
                message = "请求用户地理位置超时。"
                break;
           case error.UNKNOWN_ERROR:
                message = "未知错误。"
                break;
            default: 
                message = error.mesaage;
    }

}
const options = {
    enableHighAccuracy: true, //是否获取高精度经纬度,默认值为false
    timeout: 5000, //获取位置信息的超时时间。单位为毫秒(ms),默认值为不超时
    maximumAge: 0, //获取位置信息的缓存时间。单位为毫秒(ms),默认值为0(立刻更新获取)。如果        设备缓存的位置信息超过当前指定的缓存时间,将重新更新位置信息后再返回。
    provider: "system",/*(String)优先使用的定位模块。 "system":系统定位模块,支持wgs84坐标系; "baidu":百度定位模块,支持gcj02/bd09/bd09ll坐标系; 
            "amap":高德定位模板,支持gcj02坐标系。 默认值按此优先(amap>baidu>system),若指定的provider不存在或无效则返回错误回调。 
            ps:百度/高德定位模块需要配置百度/高德地图相关参数才能正常使用。平台支持Android - 2.2+ (支持),iOS - 4.5+ (支持): provider为“baidu”时,
            仅支持bd09ll坐标系,暂不支持高德定位模块。*/
    coordsType: "wgs84",/*指定获取的坐标系类型。可选值为: “wgs84”:WGS-84坐标系;
             “gcj02”:国测局经纬度坐标系; “bd09”:百度墨卡托坐标系; “bd09ll”:百度经纬度坐标系; 
              provider为“system”时,默认使用“wgs84”;provider为“baidu”时,默认使用“bd09ll”。 
              如果设置的坐标系类型provider不支持,则返回错误。*/

    geocode: true,/*是否解析地址信息。解析的地址信息保存到Position对象的address、addresses属性中,
           true表示解析地址信息,false表示不解析地址信息,返回的Position对象的address、addresses属性值为undefined,默认值为true。 
           如果解析地址信息失败则返回的Position对象的address、addresses属性值为null。*/
}

<think>嗯,用户问的是关于navigator.geolocation获取海拔信息时altitude属性不显示的原因和解决方法。我需要先回忆一下相关的知识,并结合提供的引用内容来分析。 首先,根据引用2中的信息,H5地理定位使用navigator.geolocation.getCurrentPosition方法,其中返回的coords对象包含altitude属性。但用户遇到的情况是这个属性没有显示,可能的原因是什么呢? 可能的原因有几个: 1. 设备或浏览器不支持:比如有些浏览器或设备可能无法获取海拔数据,特别是PC端浏览器,引用2提到PC端返回的值可能为NULL。比如在桌面浏览器上,可能没有高度传感器,所以altitude可能为null。 2. 定位方式的问题:如果使用的是IP定位或者网络定位,而不是GPS,可能精度不够,无法提供海拔信息。GPS通常能提供更详细的数据,包括高度,而Wi-Fi或基站定位可能没有。 3. 权限问题:用户可能没有授予精确位置的权限,导致返回的信息不完整。不过引用2提到错误回调中的code 1是用户拒绝权限,但用户的问题是没有altitude,而不是直接报错,所以可能不是权限问题,而是数据不可用。 4. 配置选项的设置:在getCurrentPosition的options中,enableHighAccuracy是否设置为true?如果设为true,可能会尝试获取更精确的数据,包括海拔。引用2中的示例代码确实设置了enableHighAccuracy为true,但用户可能没有开启这个选项。 解决方法的话,首先检查设备是否支持,比如在手机上的浏览器使用GPS定位。然后确保启用高精度模式,即enableHighAccuracy: true。另外,可能需要使用HTTPS,因为引用2提到需要SSL证书支持,否则定位可能被拒绝或数据不全。如果还是不行,可能需要回退处理,比如显示默认值或者提示用户设备不支持。 另外,引用3提到有些浏览器不支持HTML5获取地理位置,所以如果用户在不支持的浏览器上运行,自然无法获取任何信息,包括海拔。这时候可能需要检测浏览器兼容性,或者提供替代方案,比如使用第三方定位服务。 总结起来,可能的原因有设备不支持、定位方式不准确、配置选项未启用高精度、浏览器兼容性问题等。对应的解决步骤是检查设备、启用高精度模式、使用HTTPS、处理兼容性等。</think>### navigator.geolocation不返回海拔信息的原因及解决方法 #### 原因分析 1. **设备/浏览器限制** - PC端浏览器通常不配备高度传感器,返回的$coords.altitude$可能为`null`[^2] - 移动设备需硬件支持(如GPS模块),部分低端设备可能无法提供海拔数据 2. **定位方式差异** - 若使用IP定位或低精度网络定位(如Wi-Fi/基站),返回数据可能仅包含经纬度,缺少高度信息 - GPS定位模式下更可能返回海拔值(需`enableHighAccuracy: true`)[^2] 3. **权限配置问题** - 未启用高精度模式时,系统可能优先返回低精度定位数据 - HTTPS协议未正确部署可能导致部分属性缺失(现代浏览器强制要求SSL加密) #### 解决方案 1. **启用高精度模式** 在定位配置中强制要求高精度: ```javascript navigator.geolocation.getCurrentPosition( successCallback, errorCallback, { enableHighAccuracy: true, timeout: 10000, maximumAge: 0 } ) ``` 2. **设备环境检测** ```javascript if ("geolocation" in navigator) { // 支持定位 if (typeof position.coords.altitude === "number") { // 海拔数据可用 } else { console.log("设备不支持海拔测量") } } ``` 3. **异常处理优化** ```javascript function successCallback(position) { const altitude = position.coords.altitude || 'N/A'; console.log(`海拔:${altitude} 米`); } ``` 4. **混合定位方案** - 结合第三方地图API(如Google Maps Elevation API)通过经纬度反推海拔值 - 示例代码: ```javascript function getAltitude(lat, lng) { fetch(`https://maps.googleapis.com/maps/api/elevation/json?locations=${lat},${lng}&key=YOUR_API_KEY`) .then(response => response.json()) .then(data => console.log(data.results[0].elevation)) } ``` #### 验证流程图 ``` 开始定位 → 检查HTTPS → 启用高精度模式 → 移动设备GPS激活 → 获取完整坐标数据 ↓ ↓ ↓ 协议错误 → 降级处理 → 低精度模式 → 仅返回经纬度 ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值