百度地图js定位不准

¥10.00

我按照百度地图官方文档写的浏览器定位为什么不准呢?误差好几公里,百度了好多解决方案都不行,求大神指点!!!

官方示例:

var map = new BMap.Map("allmap");
var point = new BMap.Point(116.331398,39.897445);
map.centerAndZoom(point,12);
var geolocation = new BMap.Geolocation();
geolocation.getCurrentPosition(function(r){
	if(this.getStatus() == BMAP_STATUS_SUCCESS){
		var mk = new BMap.Marker(r.point);
		map.addOverlay(mk);
		map.panTo(r.point);
		alert('您的位置:'+r.point.lng+','+r.point.lat);
	}
	else {
		alert('failed'+this.getStatus());
	}        });


最佳解决方案

原因分析

百度地图浏览器定位Geolocation优先调用浏览器H5定位接口,如果失败会调用IP定位。而浏览器定位通过IP或者域名的形式,如:http://172.21.3.82:8080 和 http://b.cunzhang.com进行访问时是获取不到定位信息的。这时API返回的定位信息实际上是ip定位信息,当然误差会比较大。

浏览器H5定位即navigator.geolocation,通过IP或者域名的形式,如:http://172.21.3.82:8080 和http://b.cunzhang.com进行访问时,调用navigator.geolocation.getCurrentPosition,打开控制台,你会发现有以下错误信息:

Only secure origins are allowed (see: https://goo.gl/Y0ZkNV).


“只有在安全来源的情况才才被允许”。错误信息里还包含了一个提示链接,我们不妨打开这个

链接https://goo.gl/Y0ZkNV)看看。原来,为了保障用户的安全,Chrome浏览器认为只有安全的

来源才能开启定位服务。那什么样才算是安全的来源呢?在打开链接的页面上有这么一段话:


“Secure origins” are origins that match at least one of the following (scheme, host, port) patterns:

  • (https, *, *)

  • (wss, *, *)

  • (*, localhost, *)

  • (*, 127/8, *)

  • (*, ::1/128, *)

  • (file, *, —)

  • (chrome-extension, *, —)

This list may be incomplete, and may need to be changed. Please discuss!


大概意思是说只有包含上述列表中的scheme、host或者port才会被认为是安全的来源,现在这个列表还不够完整,后续可能还会有变动,有待讨论。

如果需要在域名访问的基础上实现地位位置的定位,那我们只能把http协议升级为https了。


<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <style type="text/css">
        body, html, #allmap {
            width: 100%;
            height: 100%;
            overflow: hidden;
            margin: 0;
            font-family: "微软雅黑";
        }
    </style>
    <title>地图展示</title>
</head>
<body>
    <div id="allmap"></div>
    <!-- 百度API -->
    <script src="https://api.map.baidu.com/api?v=2.0&ak=在百度地图申请的key" 
type="text/javascript"></script>
    <script>
        // 百度地图API功能
        var map = new BMap.Map("allmap");    // 创建Map实例
        var point = new BMap.Point(116.331398, 39.897445);
        map.centerAndZoom(point, 30);
        map.enableScrollWheelZoom(true);     //开启鼠标滚轮缩放
        //添加地图类型控件
        map.setCurrentCity("北京");
        var geolocation = new BMap.Geolocation();
        geolocation.getCurrentPosition(function (r) {
            if (this.getStatus() == BMAP_STATUS_SUCCESS) {
                var mk = new BMap.Marker(r.point);
                map.addOverlay(mk);
                map.panTo(r.point);
                point = r.point;
                console.log(r.point.lng + ',' + r.point.lat);
                alert('您的位置:' + r.point.lng + ',' + r.point.lat);
                getName(point);
            }
            else {
                alert('failed' + this.getStatus());
            }
        }, { enableHighAccuracy: true })
        function callback(data) {
            console.log(data);
            console.log('转化后:'+data.points[0].lng + ',' + data.points[0].lat);
            alert('您的真实位置:' + data.points[0].lng + ',' + data.points[0].lat);
            var newpoint = new BMap.Point(data.points[0].lng, data.points[0].lat);
            var mk = new BMap.Marker(newpoint);
            map.addOverlay(mk);
            map.panTo(newpoint);
            getName(newpoint);
        }
        function getName(point) {
            var geoc = new BMap.Geocoder();
            geoc.getLocation(point, function (rs) {
                var addComp = rs.addressComponents;
                console.log(addComp);
                alert(addComp.province + ", " + addComp.city + ", " + 
addComp.district + ", " + addComp.street + ", " + addComp.streetNumber);
            });
        }
        //浏览器H5定位
        if (navigator.geolocation) {
            navigator.geolocation.getCurrentPosition(function (position) {
                //得到html5定位结果
                var x = position.coords.longitude;
                var y = position.coords.latitude;
                console.log(position.coords);
                alert('您的位置:' + x + ',' + y);
                //由于html5定位的结果是国际标准gps,所以需要转为百度坐标系,from=1,
to=5
                var newpoint = new BMap.Point(x, y);
                var convertor = new BMap.Convertor();
                var pointArr = [];
                pointArr.push(newpoint);
                convertor.translate(pointArr, 1, 5, callback)
            }, function (e) {
                console.log(e);
                alert(e.message);
            })
        } else {
            alert("没有定位权限");
        }
    </script>
</body>
</html>

在https站点下,通过对比我们发现百度api获取的坐标和浏览器H5经过坐标转换获得的坐标是一致的。所以要想在浏览器中通过百度api获取精确的定位,最好把站点升级为https协议。


潇洒哥的小号 T1 被采纳率94%
2021-03-16 17:22
打赏 0 3
页面统计
2686 访问
0 帮助
0.00 打赏

hierror 2019 © hierror.com 京ICP备13026190号-1

通知消息
  • 暂无任何消息