最近做項目的時候,有一塊需求是在地圖上畫圖,涉及到經緯度。但是我們拿到的數據是北京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度,因為業務范圍就是這個地區,不會超出,后期有拓展可以再次修改,改成計算模式。
