您的位置:首页 > 大数据 > 人工智能

Google地图坐标 转换成 Baidu地图坐标

2013-04-11 15:49 393 查看
我们使用GPS系统获得的坐标系统,基本为标准的国际通用的WGS84坐标系统,而我们的国测局出于安全考虑,推出了02坐标系统,就是在标准的WGS84坐标系统上进行了人为的偏移,并且还是非线性的,所有的导航软件导航地图都需要使用国家02坐标系统,比如Google地图、腾讯SOSO地图等就是直接使用了国家02坐标系统,我们有一个不成文的说法,前者叫地球坐标,后者叫火星坐标,并且,火星坐标是无法转换成地球坐标的(网上虽然有一定的方法,但基本上都是基于偏移数据库,精度较高的数据库需要购买,当然这都是一种破解手段)。而百度地图等,可能是出于商业化考虑,为了不让自己的用户流失,而推出了自家的坐标系统,就是谁也看不懂的百度坐标系统,在百度地图上,没有任何偏差,但你又无法将转换后的百度坐标系统反转回来,这样你用百度地图坐标就自然离不开百度了。对于这样的行径,很是无语,但作为一个公司的商业化手段,也算能理解。

说完坐标系统,我们自然能够知道这里的问题,我穷举了六个问题,来说说我对此的研究。


1、地球坐标转火星坐标

原则上,国家提供了保密插件,直接可算,但你必须通过正规的商业化渠道才可以获得,一般的个人是不可能从国测局取得保密插件代码的。

这个问题不是没有解决办法,因为网络地图公司就一定会使用到这样的接口,比如Google地图、MapABC地图等,网上一个朋友在iOS上实现了该转换,用的是高德MapABC的接口(详见这里),我来说说百度地图接口的做法。

接口地址:http://api.map.baidu.com/ag/coord/convert?x=121.583140&y=31.341174&from=0&to=2&mode=1

说明:x和y就是经纬度了,替换成你真实的经纬度即可,from和to表示坐标系,0表示地球坐标,2表示火星坐标,4表示百度坐标,所以这里是从地球坐标转换成火星坐标,mode参数未知。

结果:[{"error":0,"x":"MTIxLjU4NzM2NDA5NTA1","y":"MzEuMzM5MDI3NTA2NTE="}]

说明:error为0表示没有错误,返回的x和y是base64算法后的结果(可以自行Google加解密base64),解密后就是:121.58736409505和31.33902750651,这个就是火星坐标。

问题:我不知道官方是否提供了这个方法,但验证下来基本没有偏差(第六位同MapABC加密出来的不同,原因未知),第六位的偏差也可以基本忽略。

本想用这个接口自己来写一个小软件的,但想想过于麻烦,所以有心的朋友来写一个吧,当然,也要注意,这个接口的调用最好是异步的,并且每次最多好像是20个。


2、火星坐标转地球坐标

如上文所述,国家是不可能公开这个算法的,网上流传的基本上都是基于数据库的,而高精度的反算数据库有人是卖钱的。

关于这方面的研究,三年前就已经是热火朝天了,只是个人有一两个工具可用,所以也一直无心研究具体实现。至于数据库,0.1的数据库应该是比较容易获得的,由于手头看到的都已经加密成二进制,所以待我找到后再同大家分享吧。顺便推荐一下这篇:一种根据纠偏数据对火星坐标进行完美拟合的方法,有兴趣的朋友可以研究一下,或者做成一个工具。


3、地球坐标到百度坐标

百度已经提供了两个示例:

坐标转换示例:http://developer.baidu.com/map/jsdemo.htm#a5_1

批量坐标转换示例:http://developer.baidu.com/map/jsdemo.htm#a5_3

虽然这两个示例中,百度提供了一个js,但实际上也逃离不了第一点中描述的接口http://api.map.baidu.com/ag/coord/convert?x=121.583140&y=31.341174&from=0&to=2&mode=1,只是变更为了from
0 to 4。以此类推,下述第四点即为from 2 to 4。

下面是我用Node.Js写的一个转换工具:

/**
* Created with JetBrains WebStorm.
* User: mrj
* Date: 13-4-11
* Time: 上午9:48
* To change this template use File | Settings | File Templates.
*/
var http = require('http');

function convertToBaiduMap(type,point,callback){
//  baidu 坐标的type=4
var url= 'http://api.map.baidu.com/ag/coord/convert?from='+type+'&to=4&x='+point.lng+'&y='+point.lat;
console.log('url: '+url);
var returnData={isSuccess:false,url:url};
http.get(url, function(res) {
var baiduMapCoords={error:1};
var resText='';
res.setEncoding('utf8');
res.on('data', function (chunk) {resText+=chunk;})
.on('end',function(){
baiduMapCoords = eval('('+resText+')');
if(parseInt(baiduMapCoords.error)==0){
returnData={
isSuccess:true,
lng:parseFloat(new Buffer(baiduMapCoords.x, 'base64')),
lat:parseFloat(new Buffer(baiduMapCoords.y, 'base64'))
}
}
callback(returnData);
});
}).on('error', function(e) {
callback(returnData);
});
}

//  gps坐标的type=0
//  google坐标的type=2
var googlePoint={lng:116.39534009082035,lat:39.907432133833574};
convertToBaiduMap(2,googlePoint,function(data){
console.log('convertToBaiduMap: ',data);
});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: