我使用latitude& amp ;;在百度地图(中国的主要地图服务)中实施地图视图来自谷歌地图的经度。我发现我的位置(主要是在上海附近)始终如一地“关闭”。但是大约一公里!
进行线性调整会使百度位置大致(+ - 几米)出现在正确位置:
//Declaring my Baidu map marker's properties
...
lat : gm_location.lat + 0.00575,
lng : gm_location.lng + 0.00668,
...
虽然这可以满足我的特殊需求,但我不喜欢这些神奇的数字。任何人都有任何洞察力来弥补这种偏差吗?
答案 0 :(得分:11)
您使用哪种Google地图,谷歌。 com / map,或google。 cn / map?卫星或街景?在所有情况下,答案都是否定的 - 坐标与百度地图POI不对应,但原因略有不同。
首先,自Baidu doesn't offer any useful maps outside of China起,让我们关注问题,
Google地图在中国境内协调 ,是否映射到百度地图中的相同位置?
答案是否定的。 Baidu Maps uses its own BD-09 coordinate system,而Google地图使用中文GCJ-02标准(适用于google上的街道地图。 com / maps或 .cn ),或者WGS-84用于谷歌上的卫星图像。 com 卫星视图。
GPS坐标(WGS-84)和Google街道地图坐标(GCJ-02)不会映射到百度地图上的相同位置,如this snippet demonstrates(我在答案中没有包含该片段,因为它由于SO包含脚本的方式不起作用 - 但您可以在此other answer I gave中看到代码。)
在上海周围使用线性修正可能会有效,但中国其他地区的价值会发生变化。
将Google坐标转换为百度地图坐标的官方方法是使用百度地图API。
API有两个版本:
据称在http://developer.baidu.com/map/changeposition.htm记录的“服务器”版本需要obtaining an application key
http://api.map.baidu.com/ag/coord/convert的Baidu Map coordinates conversion demo版本,由http://developer.baidu.com/map/jsdemo/demo/convertor.js通过People's Heroes Monument使用,不需要应用密钥。
让我们以上海人民英雄纪念碑的谷歌街道地图(GCJ-02)坐标转换为百度地图坐标:
curl "http://api.map.baidu.com/ag/coord/convert?from=2&to=4&x=121.4914&y=31.2423"
将输出
{"error":0,"x":"MTIxLjQ5Nzk5OTg3MzM4","y":"MzEuMjQ3OTc1ODQwMTk2"}
坐标是base64编码的,并解码为
121.49799987338, 31.247975840196
如果map.baidu.com允许您输入纬度/经度坐标,则可以登陆on Chinese blogs。
百度的API只提供转换到 BD-09。
转换也可以离线运行,并且可以找到公式geoChina。可以使用eviltransform或{{3}}等库来执行GCJ-02,WGS-84和B-09之间的转换。
答案 1 :(得分:1)
法律要求中国公司不得出口地图数据,不得抵制外国公司。有关详细信息,请参阅https://help.openstreetmap.org/questions/37560/map-offset-in-china。
您从maps.google.com获得的坐标可能是错误的,而百度中的那些可能是正确的。
答案 2 :(得分:1)
百度地图API确实有将Google地图坐标转换为百度地图坐标的服务,但我认为这只适用于中国地区的地理位置。其他任何地方仍然关闭
看一下官方演示
http://developer.baidu.com/map/jsdemo.htm#a5_1
但请注意,在返回翻译的坐标之前会有一个很大的延迟。
var x = 116.32715863448607;
var y = 39.990912172420714;
var ggPoint = new BMap.Point(x,y); // step 1 - create a Baidu map point from Google Maps coordinate
translateCallback = function (data){
if(data.status === 0) {
var marker = new BMap.Marker(data.points[0]); // step 3 - u get the offset coordinate here
bm.addOverlay(marker);
bm.setCenter(data.points[0]);
}
}
setTimeout(function(){
var convertor = new BMap.Convertor();
var pointArr = [];
pointArr.push(ggPoint);
convertor.translate(pointArr, 3, 5, translateCallback); // step 2 - pass the point as an array to the translate service
}, 1000);
答案 3 :(得分:0)
我的解决方法是
使用当前坐标(Google纬度和经度)替换此链接中的纬度和经度值
http://api.map.baidu.com/marker?location=39.916979519873,116.41004950566&output=html