最近做项目的时候,有一块需求是在地图上画图,涉及到经纬度。但是我们拿到的数据是北京54坐标,不是经纬度,辗转求方法不得,就自己在网上搜索算法并加以改造,实验得出在谷歌卫星地图上很准确,但是在百度地图、高德地图/腾讯地图会有偏差,估计也是国家保护的问题吧。下面是Java方法
1 public static void gsjs(double X ,double Y){ 2 double x,y,L0 = 0,B,L; 3 x = X; 4 y = Y; 5 double p=206264.80625; 6 for (int i = 1; Y/i >=10; i = i * 10)//对Y坐标处理并求出中央子午线经度 7 { 8 y = Y - (int)(Y / i) * i-500000; 9 L0 =117; 10 } 11 //按6°带克氏椭球反算 12 double bt = x / 6367558.4969*p; 13 double BT = x / 6367558.4969; 14 double c3=Math.cos(BT)*Math.cos(BT); 15 double c4=Math.sin(BT)*Math.cos(BT); 16 double Bf=(bt+(50221746+(293622+(2350+22*c3)*c3)*c3)*c4*Math.pow(10,-10)*p)/p; 17 double c5=Math.pow(Math.cos(Bf),2); 18 double c6=Math.sin(Bf)*Math.cos(Bf); 19 double Nf=6399698.902-(21562.267-(108.973-0.612*c5)*c5)*c5; 20 double Z=y/(Nf*Math.cos(Bf)); 21 double b2 = (0.5 + 0.003369 * c5) * c6; 22 double b3 = 0.333333 - (0.166667 - 0.001123 * c5) * c5; 23 double b4 = 0.25 + (0.16161 + 0.00562 * c5) * c5; 24 double b5=0.2-(0.1667-0.0088*c5)*c5; 25 double z2=Math.pow(Z,2); 26 B = (Bf*p - (1 - (b4 - 0.12 *z2) * z2) * z2 * b2 * p)/3600.0; 27 L = L0+((1 - (b3 - b5 * z2) * z2) * Z * p)/3600.0; 28 System.out.println("纬度:"+B+" 经度:"+L+" 中央子午线:"+L0); 29 }
在这里中央子午线是固定死的,为117度,因为业务范围就是这个地区,不会超出,后期有拓展可以再次修改,改成计算模式。