原文出处:
http://blog.youkuaiyun.com/xuexiaodong009/article/details/49246459 (blog涉及:微信开发、C#)
对于一个地点的经纬度,是确定的?这个问题,我想很多人都会回答,肯定了,可实际上呢?我只能呵呵了。
在使用百度地图的过程中,发现一个很奇怪的现象,有时候调用百度地图js API时,后得到一个错的离谱的地方。然后我自己也就研究了一下jsAPI获取地理位置的相关信息,jsAPI其实都是利用了HTML5中的方法获取地理信息的。但很奇怪,使用HTML5获取到的经纬度和百度获取的竟然相差很大。
HTML5获取到的经纬度
function getLocation() { if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(showPosition); } else {alert( "Geolocation is not supported by this browser." ) } } function showPosition(position) { $("#lngl" ).val(position.coords.longitude ); $("#latl" ).val(position.coords.latitude); }
百度地图获取经纬度的方法
var map = new BMap.Map( "allmap" ); var circle = new BMap.Geolocation(); var options={}; options.enableHighAccuracy=true ; options.timeout=10; options.maximumAge=0; circle.getCurrentPosition(locationResult, options); map.addOverlay(circle); var tempGeocoder = new BMap.Geocoder(); function locationResult(geolocationResult) { var Status = this .getStatus() if (Status == 0) { $("#lngBaidu" ).val(geolocationResult.point.lng); $("#latBaidu" ).val(geolocationResult.point.lat); var address = geolocationResult.address; $("#cityBaidu" ).val(address.city); $("#districtBaidu" ).val(address.district); $("#streetBaidu" ).val(address.street); else { alert("定位失败错误码" + Status) } }
高德地图获取经纬的方法
var mapObj, geolocation; var MGeocoder; mapObj = new AMap.Map( 'allmap1' ); mapObj.plugin('AMap.Geolocation' , function () { geolocation = new AMap.Geolocation({ enableHighAccuracy: true , timeout: 10000, maximumAge: 0, convert: false , showButton: false , buttonPosition: 'LB' , buttonOffset: new AMap.Pixel(10, 20), showMarker: false , showCircle: false , panToLocation: true , zoomToAccuracy: true }); mapObj.addControl(geolocation); AMap.event.addListener(geolocation, 'complete' , onComplete); AMap.event.addListener(geolocation, 'error' , onError); geolocation.getCurrentPosition(); }); function onComplete(data) { var lnglatXY = [data.position.getLng(), data.position.getLat()]; $("#accuracy" ).val(data.accuracy); $("#lng" ).val(data.position.getLng()); $("#lat" ).val(data.position.getLat()); } function onError(data) { var str = '定位失败;' ; str += '错误信息:' switch (data.info) { case 'PERMISSION_DENIED' : str += '浏览器阻止了定位操作' ; break ; case 'POSITION_UNAVAILBLE' : str += '无法获得当前位置' ; break ; case 'TIMEOUT' : str += '定位超时' ; break ; default : str += '未知错误' ; break ; } alert(str); }
使用这三种方法获取的经纬度竟然有很大不同!!
小数点后第一位就有可能不一样了,小数点后第二位是肯定不一样的,0.01的偏差就会导致几十公里的偏差,测试多次依然是这样。
最后在百度地图的官方文档找到了这样的的话
百度地图坐标转换API是一套以HTTP形式提供的坐标转换接口,用于将常用的非百度坐标(目前支持GPS设备获取的坐标、google地图坐标、soso地图坐标、amap地图坐标、mapbar地图坐标)转换成百度地图中使用的坐标,并可将转化后的坐标在百度地图JavaScript API、车联网API、静态图API、web服务API等产品中使用。注意Android SDK、iOS SDK、定位SDK和导航SDK坐标转换服务需 单独申请
百度地图官方文档
才知道HTML5得到的数据是需要转化之后才是百度地图的经纬度。难怪测试了很多次,几乎都有这么大的偏差。
HTML5经纬度转化为百度地图经纬度的方法:
var ggPoint = new BMap.Point(position.coords.longitude, position.coords.latitude); var convertor = new BMap.Convertor(); var pointArr = []; pointArr.push(ggPoint); convertor.translate(pointArr, 1, 5, translateCallback) } translateCallback = function (data) { if (data.status === 0) { $("#lngz" ).val(data.points[0].lng); $("#latz" ).val(data.points[0].lat); } }
经过这么转化后,偏差基本上在小数点后前三位基本上都一样了。
经过测试发现,高德地图似乎直接使用了HTML5返回的经纬度,但没找到相关的文档,百度地图使用的是转化过的经纬度。一个简单的经纬度问题却由于各种原因导致了这么一个背离常识的问题,实在是令人难以理解!!
如何将非高德坐标转换为高德坐标系
百度地图坐标转换