百度地图坐标转换

JS 代码:
http://lbsyun.baidu.com/jsdemo.htm#a5_2

var od = [
            [
              113.23123455047606,
              23.15176419008683
            ],
            [
              113.23041915893555,
              23.152711208220563
            ],
            [
              113.22773694992065,
              23.15369767832557
            ],
            [
              113.2255482673645,
              23.154506578391924
            ],
            [
              113.22209358215332,
              23.15716999531381
            ],
            [
              113.22157859802246,
              23.158255075915342
            ],
            [
              113.22129964828491,
              23.159813630853947
            ],
            [
              113.22144985198975,
              23.16034629737094
            ],
            [
              113.2226300239563,
              23.161628634000916
            ],
            [
              113.22468996047974,
              23.163818442013433
            ],
            [
              113.22503328323364,
              23.165376932211196
            ],
            [
              113.2245397567749,
              23.167349678601095
            ],
            [
              113.22232961654662,
              23.168119041814982
            ],
            [
              113.2221794128418,
              23.168651675296303
            ],
            [
              113.2206130027771,
              23.16953939305631
            ],
            [
              113.21913242340088,
              23.169973386263344
            ],
            [
              113.21763038635254,
              23.169953659329902
            ],
            [
              113.21666479110718,
              23.169835297668257
            ],
            [
              113.21561336517334,
              23.169421031028396
            ],
            [
              113.2145619392395,
              23.16938157699584
            ],
            [
              113.21449756622314,
              23.16892785478574
            ],
            [
              113.2136607170105,
              23.166047669244826
            ],
            [
              113.2126522064209,
              23.160425210748855
            ],
            [
              113.21235179901123,
              23.15949797562204
            ],
            [
              113.21218013763428,
              23.15681487611705
            ],
            [
              113.21239471435547,
              23.156676773952967
            ],
            [
              113.2124376296997,
              23.15460522440737
            ],
            [
              113.21531295776367,
              23.148784985228158
            ],
            [
              113.21705102920531,
              23.14708818994402
            ],
            [
              113.22140693664551,
              23.142925031435215
            ],
            [
              113.22142839431763,
              23.14264879833422
            ],
            [
              113.22243690490723,
              23.14195821309143
            ],
            [
              113.22413206100464,
              23.14395103511234
            ],
            [
              113.22481870651245,
              23.144404841926114
            ],
            [
              113.22780132293701,
              23.146989538394603
            ],
            [
              113.22996854782104,
              23.149436075389534
            ],
            [
              113.23110580444336,
              23.151152570651504
            ],
            [
              113.23123455047606,
              23.15176419008683
            ]
          ];

   var newData = [];
    //坐标转换完之后的回调函数
    translateCallback = function (data){
       var nd = data.points[0]; 
       newData.push([nd.lng, nd.lat]); 
    }

   function changeBaidu(x, y){
       var pointArr = [];
       var ggPoint = new BMap.Point(x,y);
       var convertor = new BMap.Convertor();
       
       pointArr.push(ggPoint);
       convertor.translate(pointArr, 1, 5, translateCallback);
   }

   for(var i=0;i<od.length; i++){
changeBaidu(od[i][0],od[i][1]);
   }
  console.log('newData:',newData);

JAVA 代码:


package com.hotent.mini.job;

public class Test {
	 public static double pi = 3.1415926535897932384626;  
	    public static double x_pi = 3.14159265358979324 * 3000.0 / 180.0;  
	    public static double a = 6378245.0;  
	    public static double ee = 0.00669342162296594323;  

	    public static double transformLat(double x, double y) {  
	        double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y  
	                + 0.2 * Math.sqrt(Math.abs(x));  
	        ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;  
	        ret += (20.0 * Math.sin(y * pi) + 40.0 * Math.sin(y / 3.0 * pi)) * 2.0 / 3.0;  
	        ret += (160.0 * Math.sin(y / 12.0 * pi) + 320 * Math.sin(y * pi / 30.0)) * 2.0 / 3.0;  
	        return ret;  
	    }  

	    public static double transformLon(double x, double y) {  
	        double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1  
	                * Math.sqrt(Math.abs(x));  
	        ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;  
	        ret += (20.0 * Math.sin(x * pi) + 40.0 * Math.sin(x / 3.0 * pi)) * 2.0 / 3.0;  
	        ret += (150.0 * Math.sin(x / 12.0 * pi) + 300.0 * Math.sin(x / 30.0  
	                * pi)) * 2.0 / 3.0;  
	        return ret;  
	    }  
	    public static double[] transform(double lat, double lon) {  
	        if (outOfChina(lat, lon)) {  
	            return new double[]{lat,lon};  
	        }  
	        double dLat = transformLat(lon - 105.0, lat - 35.0);  
	        double dLon = transformLon(lon - 105.0, lat - 35.0);  
	        double radLat = lat / 180.0 * pi;  
	        double magic = Math.sin(radLat);  
	        magic = 1 - ee * magic * magic;  
	        double sqrtMagic = Math.sqrt(magic);  
	        dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);  
	        dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);  
	        double mgLat = lat + dLat;  
	        double mgLon = lon + dLon;  
	        return new double[]{mgLat,mgLon};  
	    }  
	    public static boolean outOfChina(double lat, double lon) {  
	        if (lon < 72.004 || lon > 137.8347)  
	            return true;  
	        if (lat < 0.8293 || lat > 55.8271)  
	            return true;  
	        return false;  
	    }  
	    /** 
	     * 84 to 火星坐标系 (GCJ-02) World Geodetic System ==> Mars Geodetic System 
	     * 
	     * @param lat 
	     * @param lon 
	     * @return 
	     */  
	    public static double[] gps84_To_Gcj02(double lat, double lon) {  
	        if (outOfChina(lat, lon)) {  
	            return new double[]{lat,lon};  
	        }  
	        double dLat = transformLat(lon - 105.0, lat - 35.0);  
	        double dLon = transformLon(lon - 105.0, lat - 35.0);  
	        double radLat = lat / 180.0 * pi;  
	        double magic = Math.sin(radLat);  
	        magic = 1 - ee * magic * magic;  
	        double sqrtMagic = Math.sqrt(magic);  
	        dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);  
	        dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);  
	        double mgLat = lat + dLat;  
	        double mgLon = lon + dLon;  
	        return new double[]{mgLat, mgLon};  
	    }  

	    /** 
	     * * 火星坐标系 (GCJ-02) to 84 * * @param lon * @param lat * @return 
	     * */  
	    public static double[] gcj02_To_Gps84(double lat, double lon) {  
	        double[] gps = transform(lat, lon);  
	        double lontitude = lon * 2 - gps[1];  
	        double latitude = lat * 2 - gps[0];  
	        return new double[]{latitude, lontitude};  
	    }  
	    /** 
	     * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法 将 GCJ-02 坐标转换成 BD-09 坐标 
	     * 
	     * @param lat 
	     * @param lon 
	     */  
	    public static double[] gcj02_To_Bd09(double lat, double lon) {  
	        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);  
	        double tempLon = z * Math.cos(theta) + 0.0065;  
	        double tempLat = z * Math.sin(theta) + 0.006;  
	        double[] gps = {tempLat,tempLon};  
	        return gps;  
	    }  

	    /** 
	     * * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法 * * 将 BD-09 坐标转换成GCJ-02 坐标 * * @param 
	     * bd_lat * @param bd_lon * @return 
	     */  
	    public static double[] bd09_To_Gcj02(double lat, double lon) {  
	        double x = lon - 0.0065, y = lat - 0.006;  
	        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);  
	        double tempLon = z * Math.cos(theta);  
	        double tempLat = z * Math.sin(theta);  
	        double[] gps = {tempLat,tempLon};  
	        return gps;  
	    }  

	    /**将gps84转为bd09 (百度地图)
	     * @param lat 
	     * @param lon 
	     * @return 
	     */  
	    public static double[] gps84_To_bd09(double lat,double lon){  
	        double[] gcj02 = gps84_To_Gcj02(lat,lon);  
	        double[] bd09 = gcj02_To_Bd09(gcj02[0],gcj02[1]);  
	        return bd09;  
	    }  
	    public static double[] bd09_To_gps84(double lat,double lon){  
	        double[] gcj02 = bd09_To_Gcj02(lat, lon);  
	        double[] gps84 = gcj02_To_Gps84(gcj02[0], gcj02[1]);  
	        //保留小数点后六位  
	        gps84[0] = retain6(gps84[0]);  
	        gps84[1] = retain6(gps84[1]);  
	        return gps84;  
	    }  

	    /**保留小数点后六位 
	     * @param num 
	     * @return 
	     */  
	    private static double retain6(double num){  
	        String result = String .format("%.6f", num);  
	        return Double.valueOf(result);  
	    }
 
	
	public static void main(String[] args) throws Exception {
		 double[] bd01 = Test.gps84_To_bd09( 
				 113.23123455047606,
	              23.15176419008683
		);
		 
		System.out.println(
				bd01[0]+","+bd01[1]
				);		
		 
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值