PHP群:95885625 Hbuilder+MUI群:81989597 站长QQ:634381967
    您现在的位置: 首页 > 开发编程 > HBuilderX教程 > 正文

    MUI 地图定位问题终于解决了

    作者:admin来源:网络浏览:时间:2020-09-30 00:07:50我要评论
    导读:自己的APP需要定位模块,类似滴滴打车的需求。所以找了高德的JS API,用浏览器定位(小白注意:我们用mui开发的Hybrid APP不能用高德的原...
    自己的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

    转载请注明(B5教程网)原文链接:https://b5.mxunkeji.com/content-146-5084-1.html
    相关热词搜索: