java转换手机腾讯地图和百度地图坐标
最近项目中有这样一个需求,需要将安卓手机app腾讯地图,百度地图备份后,把tar压缩文件复制到pc端解压,使用java连接sqlite数据库,取出腾讯地图和百度地图上的坐标数据。需要将坐标转换为百度坐标,类似这样的经度和纬度(116.383859,39.940387),才能供前端愉快的使用。
然而
在我国,使用的坐标系不能为地球坐标(WGS84),这是国际标准坐标。
所以我国采用的坐标必须至少采用GCJ-02对地理位置进行加密,火星坐标(GCJ-02)也叫国测局坐标系,经过查找大量资料,腾讯地图和百度地图都是使用的(GCJ-02)标准。这下我以为很舒服了。But 我们的百度同学需要皮一下。
百度地图在(GCJ-02)的基础上再来一次加密,就有了自己的一套百度坐标 (BD-09),是不是很独树一帜呀!嘿嘿。
再一次,然而。
我在sqlite中取出的数据,给你们看一下。
腾讯地图的:(104057556,30615478)我去这是啥玩意儿。怎么转换!
然后我去腾讯地图坐标拾取系统随便点了一个点看了标准坐标。长这样(30.611618,104.063530)前面的为纬度,后面的为经度。
说下我的思路。把这个坐标经纬度同时除以1000000(104057556,30615478)得到
(104.057556,30.615478)这下标准坐标和我的坐标长的是不是就很相似啦。没错除以100万后腾讯地图确实得到了GCJ-02坐标。只是经纬度坐标相反,我想你们用代码转换一下这两个坐标的位置,应该没问题的。
但是项目需要将腾讯的坐标转换为百度坐标BD-09。下面直接上代码,把我们除以100万的坐标(30.615478,104.057556)扔进去,跑起来。就好了
public static double[] map_tx2bd(double lat, double lon){
double bd_lat;
double bd_lon;
double x_pi=3.14159265358979324;
double x = lon, y = lat;
double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi);
double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi);
bd_lon = z * Math.cos(theta) + 0.0065;
bd_lat = z * Math.sin(theta) + 0.006;
double[] doubles = new double[2];
doubles[0]= bd_lat;
doubles[1] =bd_lon;
return doubles;
}