| 
					
				 | 
			
			
				@@ -0,0 +1,144 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+package com.huaxu.common; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.apache.commons.lang3.StringUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.math.BigDecimal; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.List; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+public class ConvertXY { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	private static double a = 0, e2, e1, C0, C1, C2, C3, Ro0, Ro2; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	public ConvertXY() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		a = 6378245.0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		e2 = 0.00669342162297; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		e1 = 0.00673852541468; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		C0 = 6367558.49686; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		C1 = 32005.79642; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		C2 = 133.86115; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		C3 = 0.7031; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Ro0 = 180 / 3.1415926535897932; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Ro2 = 3600 * Ro0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	private MyPoint JWtoXY(WTDFM J, WTDFM W, double Lo) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		double L, B, T, ng2, N, Mo, X0, X1, X2, X3, X4, X5, X6, X7, X8; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		L = J.m_DEGREE;// 计算°数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		B = W.m_RADIAN;// 计算弧°已将°数转换为弧° 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		T = Math.tan(B); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		ng2 = e1 * Math.pow(Math.cos(B), 2.0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		N = a / Math.pow((1.0 - e2 * Math.pow(Math.sin(B), 2.0)), (1.0 / 2.0)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Mo = (L - Lo) * Math.cos(B) / Ro0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		X0 = C0 * B 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				- Math.cos(B) * (C1 * Math.sin(B) + C2 * Math.pow(Math.sin(B), 3.0) + C3 * Math.pow(Math.sin(B), 5.0)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		X1 = N * Mo; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		X2 = C0 * B; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		X3 = Math.cos(B) * (C1 * Math.sin(B) + C2 * Math.pow(Math.sin(B), 3.0) + C3 * Math.pow(Math.sin(B), 5.0)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		X4 = N * T * Math.pow(Mo, 2.0) / 2.0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		X5 = (5.0 - Math.pow(T, 2.0) + 9.0 * ng2 + 4.0 * Math.pow(ng2, 2.0)) * N * T * Math.pow(Mo, 4.0) / 24.0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		X6 = (61.0 - 58.0 * Math.pow(T, 2.0) + Math.pow(T, 4.0)) * N * T * Math.pow(Mo, 6.0) / 720.0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		X7 = (1.0 - Math.pow(T, 2.0) + ng2) * N * Math.pow(Mo, 3.0) / 6.0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		X8 = (5.0 - 18.0 * Math.pow(T, 2.0) + Math.pow(T, 4.0) + 14.0 * ng2 - 58.0 * ng2 * Math.pow(T, 2.0)) * N 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				* Math.pow(Mo, 5.0) / 120.0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		double dblX = X2 - X3 + X4 + X5 + X6;// 计算式 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		double dblY = X1 + X7 + X8;// +500000.0;//计算式 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		MyPoint pPoint = new MyPoint(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		pPoint.Y = (int) (dblX) + (int) ((dblX - (int) (dblX)) * 1000.0) / 1000.0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		pPoint.X = (int) (dblY) + (int) ((dblY - (int) (dblY)) * 1000.0) / 1000.0 + 500000.0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return pPoint; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	public MyPoint Convert(String x, String y) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		WTDFM J = new WTDFM(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		WTDFM W = new WTDFM(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		J.m_DEGREE = Double.valueOf(x); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		W.m_DEGREE = Double.valueOf(y); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		J.DEGtoDFM(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		W.DEGtoDFM(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// 中央子午线 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		MyPoint pPoint = JWtoXY(J, W, 116.3502518055556); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// pPoint.X = pPoint.X - 400000; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// Y坐标偏移 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		pPoint.Y = pPoint.Y - 4114702.5; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// 坐标校正 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// X - 50 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// Y - 32 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		pPoint.X = pPoint.X - 50; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		pPoint.Y = pPoint.Y - 32; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return pPoint; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	/* 经纬度转西安80坐标 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	public static MyPoint ConvertXYToXian80(String x, String y,String moveXY) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		MyPoint pPoint = new MyPoint(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		double dblLon = Double.parseDouble(x), dblLat = Double.parseDouble(y); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		StringBuilder dblX80 = new StringBuilder(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		StringBuilder dblY80 = new StringBuilder(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		ICoordinate pCoordinate = CoordinateFactory.CreateCoordinate(Spheroid.Xian80); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		pCoordinate.GaussPrjCalculate(dblLon, dblLat, dblX80, dblY80); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		double X80 = Double.parseDouble(String.format("%.4f", Double.parseDouble(dblX80.toString()))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		double Y80 = Double.parseDouble(String.format("%.4f", Double.parseDouble(dblY80.toString()))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		X80 += -196600; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Y80 += 270; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		int moveX=0,moveY=0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if(!StringUtils.isEmpty(moveXY)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			moveX=Integer.parseInt(moveXY.split(",")[0]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			moveY=Integer.parseInt(moveXY.split(",")[1]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		pPoint.X = X80+moveX; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		pPoint.Y = Y80+moveY; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return pPoint; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	/* 经纬度转墨卡托投影坐标 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	public static MyPoint ConvertXYToMercato(String x, String y,String moveXY) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		MyPoint mercator = new MyPoint(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		double dblLon = Double.parseDouble(x) * 20037508.34 / 180; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		double dblLat = Math.log(Math.tan((90 + Double.parseDouble(y)) * Math.PI / 360)) / (Math.PI / 180); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		dblLat = dblLat * 20037508.34 / 180; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		int moveX=0,moveY=0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if(!StringUtils.isEmpty(moveXY)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			moveX=Integer.parseInt(moveXY.split(",")[0]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			moveY=Integer.parseInt(moveXY.split(",")[1]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		mercator.X = dblLon+moveX; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		mercator.Y = dblLat+moveY; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return mercator; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	public static void main(String[] args) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		//String password = MD5Util.md5Encode("a83c71250a7363ea492aed2640d402ef"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		//System.out.println(password); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		//93.011981,43.601386 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		ConvertXY convert = new ConvertXY();//93.024905,43.597244 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		MyPoint pt = convert.ConvertXYToMercato("93.024905", "43.597244",null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		//pt = convert.LonlatToMercator("93.011981", "43.601386"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		BigDecimal bdX= new BigDecimal(pt.X); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		BigDecimal bdY= new BigDecimal(pt.Y); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		System.out.println("latitude,longtitude:" + String.valueOf(bdX.toPlainString()) + "," + String.valueOf(bdY.toPlainString())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//		 pt = convert.LonlatToMercator("121.398804", "29.944973"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//			 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//		 bdX= new BigDecimal(pt.X); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//		 bdY= new BigDecimal(pt.Y); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//			 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//	     System.out.println("latitude,longtitude:" + String.valueOf(bdX.toPlainString()) + "," + String.valueOf(bdY.toPlainString())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//			 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//	     pt = convert.LonlatToMercator("121.746342", "29.823072"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//		bdX= new BigDecimal(pt.X); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//	    bdY= new BigDecimal(pt.Y); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//		 System.out.println("latitude,longtitude:" + String.valueOf(bdX.toPlainString()) + "," + String.valueOf(bdY.toPlainString())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |