html5的geolocation 定位误差大的解决办法

您所在的位置:网站首页 百度地图地址不对怎么调整呢 html5的geolocation 定位误差大的解决办法

html5的geolocation 定位误差大的解决办法

2024-07-10 05:39| 来源: 网络整理| 查看: 265

本文为转载文章,原文传送门

感谢原作者大笑

学生党在做比赛作品,项目中需求要用到定位功能并以地图形式展现。所以思路就是用h5的geolocation 获取经纬度,通过百度地图api将经纬度转换成详细的地址以及地图。 在笔记本电脑做测试,定位总有超过500米以上的误差。找资料得知原因:

国内的地图产品,其地理位置大多数都进行了GCJ-02加密,即加入随机的偏差。 而html5原生的定位API获取到的地理位置,是未经加密的。 因此,为了保证html5原生的定位API获取到的地理位置在百度地图上较为准确的解析,就需要用官方提供的转换类。 由于国内地图产品的地理位置普遍进行了GCJ-02加密 因此,在用一种地图产品的API时,都应养成一个习惯,就是看看它们有没有提供地理位置信息转换的类。 所以,用geolocation获取的经纬度直接用误差会很大,要进行转换,百度地图提供了这个方法 ,Convertor()。

复制代码 1 doctype html> 2 3 4 5 Document 6 7 8 9 body, html,#allmap {width: 100%;height: 800px;;overflow: hidden;margin:0;} 10 #golist {display: none;} 11 @media (max-device-width: 780px){#golist{display: block !important;}} 12 .container{width:1080px;margin:0 auto;} 13 .title{width:100%;text-align: center;} 14 h1{color:#2280E8;} 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 function getLocation(){ 31 if (navigator.geolocation){ 32 navigator.geolocation.getCurrentPosition(showPosition,showError); 33 }else{ 34 alert("浏览器不支持地理定位。"); 35 } 36 } 37 getLocation(); 38 function showError(error){ 39 switch(error.code) { 40 case error.PERMISSION_DENIED: 41 alert("定位失败,用户拒绝请求地理定位"); 42 break; 43 case error.POSITION_UNAVAILABLE: 44 alert("定位失败,位置信息是不可用"); 45 break; 46 case error.TIMEOUT: 47 alert("定位失败,请求获取用户位置超时"); 48 break; 49 case error.UNKNOWN_ERROR: 50 alert("定位失败,定位系统失效"); 51 break; 52 } 53 }; 54 55 function showPosition(position) { 56 var latlon = position.coords.latitude+','+position.coords.longitude; 57 console.log(latlon); 58 console.log("原始位置精度:"+position.coords.accuracy); 59 //baidu 60 var url = "http://api.map.baidu.com/geocoder/v2/?ak=hCBcm8H8opRLdC0f6OibbGavC0pne1uc&callback=renderReverse&location="+latlon+"&output=json&pois=0"; 61 $.ajax({ 62 type: "GET", 63 dataType: "jsonp", 64 url: url, 65 beforeSend: function(){ 66 $("#baidu_geo").html('正在定位...'); 67 }, 68 success: function (json) { 69 console.log(json); 70 $("#baidu_geo").html(json.result.formatted_address); 71 var ggPoint = new BMap.Point(json.result.location.lng,json.result.location.lat);//创建标点 72 //地图初始化 73 var bm = new BMap.Map("allmap"); 74 bm.centerAndZoom(ggPoint, 15); 75 bm.addControl(new BMap.NavigationControl());//控件 76 77 //添加gps marker和label 78 var markergg = new BMap.Marker(ggPoint); 79 bm.addOverlay(markergg); //添加GPS marker 80 var labelgg = new BMap.Label("未转换的原始坐标(错误)",{offset:new BMap.Size(20,-10)}); 81 markergg.setLabel(labelgg); //添加GPS label 82 83 84 //坐标转换完之后的回调函数 85 translateCallback = function (data){ 86 if(data.status === 0) { 87 var marker = new BMap.Marker(data.points[0]); 88 bm.addOverlay(marker); 89 var label = new BMap.Label("转换后的百度坐标(正确)",{offset:new BMap.Size(20,-10)}); 90 marker.setLabel(label); //添加百度label 91 bm.setCenter(data.points[0]); 92 } 93 } 94 var convertor = new BMap.Convertor();//这个类就是转换的对象 95 var pointArr = []; 96 pointArr.push(ggPoint); 97 convertor.translate(pointArr, 1, 5, translateCallback)//通过调用回调函数来进行转换。 98 }, 99 error: function (XMLHttpRequest, textStatus, errorThrown) { 100 $("#baidu_geo").html(latlon+"地址位置获取失败"); 101 } 102 }); 103 }; 104 105 106 107


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3