damdmen
damdmen
  • 发布:2016-01-13 11:53
  • 更新:2021-02-26 15:49
  • 阅读:42718

地图定位问题终于搞清楚了。。

分类:HTML5+

不得不吐槽下mui的社区,问问题基本没人答复。小白经常被一个问题卡死,严重拖累进度和心情。

自己在qq群里反复询问,在高德社区发帖,一步步搜索问题。终于搞懂了大部分。下面进入正题:

自己的APP需要定位模块,类似滴滴打车的需求。

所以找了高德的JS API,用浏览器定位(小白注意:我们用mui开发的Hybrid APP不能用高德的原生Android API,下面会讲到怎么使用系统的原生能力)

所谓的浏览器定位实际上都是使用了HTML5的Geolocation功能。关于定位,分为GPS定位和网络定位2种。GPS定位,精度较高,可达到10米,但室内不可用,且超级费电。网络定位,分为wifi定位和基站定位,都是通过获取wifi或者基站信息,然后查询对应的wifi或者基站位置数据库,得到的定位地点。定位数据库可以不断完善不断补充,所以,越定位越准确。我们可以先判断浏览器是否支持geolocation, 如果不支持,可以提示错误,或者进入其他逻辑处理流程,现在移动端的智能手机浏览器绝大部分都是支持的。代码如下:

if( navigator.geolocation ){  
    alert('恭喜,您的浏览器支持HTML5 Geolocation API');  
    navigator.geolocation.getCurrentPosition( successCallback, handleLocationError,{maximumAge:15000, timeout:10000, enableHighAccuracy:true});  
}else{  
    alert( "对不起,您的浏览器不支持html5定位");  
}  

function successCallback (){  
    alert('成功获取到位置信息');  
};  

function handleLocationError(error) {  
    console.log(error);  
    switch(error.code){  
        case 0:  
          alert("获取位置信息出错!");  
          break;  
        case 1:  
          alert("您设置了阻止该页面获取位置信息!");  
          break;  
        case 2:  
          alert("浏览器无法确定您的位置!");  
          break;  
        case 3:  
          alert("获取位置信息超时!");  
          break;  
        default:  
          alert('不明原因');  
          break;  
    }  
}

当然浏览器定位不是那么好用,由于各种其他原因和我们的天朝的社会主义特色政策,国行Android手机“阉割”了谷歌GMS服务包,导致HTML5的geolocation无法使用wifi和基站定位服务。经常会定位失败。但是提供地图和定位相关服务的不止是google一家,还有百度、高德、搜狗啊。

咋一看,百度js api也有自己的geolocation(http://developer.baidu.com/map/reference/index.php?title=Class:%E6%9C%8D%E5%8A%A1%E7%B1%BB/Geolocation) 这个取代html5自带的不就可以了么,经过实验,真是图样图森破了,原来所有的javascript API都还是调用的浏览器自身的geolocation进行封装实现的,也就是说如果原本不能wifi+基站定位,用百度、高德的javascript api的效果是一样的。

由于我人在北京,每次都把我定位到了一个叫“军诚水果超市”的地方。开始因为我听说高德的浏览器有很大偏差,以为是定位偏差的问题。但直到我注意到这里:(http://lbs.amap.com/api/javascript-api/reference/plugin/) 在AMap.Geolocation 插件中有这样一句话:当浏览器原生定位接口定位失败后,系统会调用IP定位,返回定位点所在城市中心点。此时,定位精度范围返回“null”。使用高德JS API浏览器定位,精度如果返回null就说明定位失败了,而不是定位偏差。(国内的文档太不规范,着实把我骗到了)

最后要说明的是,如果是开发Android原生软件的话,可以在APP里封装百度地图定位的SDK,这个是可以解决没有谷歌GMS服务包无法定位的问题的,因为百度地图定位SDK实际上是起到和谷歌服务包里面的定位模块一样的作用,由这里也可以看到HTML5 Webapp和原生APP的一个差别,不是一个层面的解决方案。

记得项目目录里的menifest.json文件里可以配置百度和高德的SDK么?这就是HTML5+API赋予你的强大能力!如果你配置正确的话,即可使用系统原生的定位,不需要坑爹的浏览器定位了。这就是Hybrid APP相对Web APP的一个优势。

最终解决方案是:配置好百度或高德的SDK,使用HTML5+API的plus.geolocation.getCurrentPosition()利用原生定位获取到坐标点后,再用百度或高德的JS API去实现其他的地图模块功能。

参考的文章:

http://www.html5col.com/getcurrentposition/

http://blog.csdn.net/albert528108/article/details/39213419

10 关注 分享
程序员Tom 阿里郎 王彦坡 Trust 小小码农 lhyh MooGu 2***@163.com mcNull f***@sina.com

要回复文章请先登录注册

2***@qq.com

2***@qq.com

可以参考[uniapp中配置高德地图定位流程](https://www.chao-yu.cn/details/5.html)
2021-02-26 15:49
damdmen

damdmen (作者)

回复 妙妙 :
你说的是 “在后台运行时使用你的位置” 这个权限吧? 记得ios是需要用户确认的,安卓忘记了
2020-08-12 10:47
妙妙

妙妙

请问网页定位有办法实现后台自动定位吗,不出弹出确认框的那种能实现吗
2020-06-19 22:21
9***@qq.com

9***@qq.com

老哥,Hybrid APP离线获取定位应该怎么做呀?
2019-12-09 09:29
星陨

星陨

配置高德还是百度,有用过的给个建议
2018-05-18 15:10
p***@163.com

p***@163.com

配置完之后,需要加入高德地图开发的jdk吗?
发现这样配完之后,是基于基站定位,每次定位只能定位到最近的基站。
2018-04-25 11:49
m***@163.com

m***@163.com

不多的不准就能折磨死人aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
2018-04-07 14:09
462384523

462384523

回复 littlebear :
必须要重新打包发布吗
2018-03-19 18:06
462384523

462384523

回复 l***@qq.com :
你找到原因了吗,我也遇到这个问题了,本地可以,发布到测试库上就不行了
2018-03-19 18:05
l***@qq.com

l***@qq.com

回复 6***@qq.com :
发布之后就获取不到了,你的解决了么
2018-03-19 09:15