google-map經緯度轉換算法;


import java.util.ArrayList;
import java.util.List;
/*****
 * 
 * <p> Copyright: Copyright (c) 2012</p>
 * <p>Company: hongyu</p>
 * @author hongyuji
 * @version 1.0.2
 *
 */
public class LatLng {
	
	public static void main(String[] args) {
		//String aString=	LatLng.computation(36.381, 109.243,45, 10*1000*1.41421356);
		//String aString=	LatLng.computation(36.381, 109.243,315, 10*1000*1.41421356);
		for(String item:getLatLonList(36.381,109.243,10))	
			System.out.println(item);
		}
		
		/*****
		 * 對給定半徑和經緯度 算出九宮格的各個中心點經緯度
		 * 九宮格的半徑R=R*0.333333*1.4142135
		 * author hongyuji<br>
	     * date 2012-06-5<br>
		 * @param lat 緯度
		 * @param lng 經度
		 * @param R 半徑 單位千米km
		 * @return
		 */
		private static List<String> getLatLonList(double lat,double lng,double R) {
			/*********根號2取值*********/
			double sum=1.4142135;
			/*****半徑的3分之2爲基數****/
			 R=0.666666*R*1000;
			String leftUp=LatLng.computation(lat, lng,315, R*sum);
			String centreUp=LatLng.computation(lat, lng,0, R);
			String rightUp=LatLng.computation(lat, lng,45, R*sum);
			
			String centreLeft=LatLng.computation(lat, lng,270, R);
			String centre=lat+","+lng;
			String centreRight=LatLng.computation(lat, lng,90, R);
			
			String leftDown=LatLng.computation(lat, lng,225,R*sum);
			String centreDown=LatLng.computation(lat, lng,180, R);
			String rightDown=LatLng.computation(lat, lng,135,R*sum);
			ArrayList<String>  al=new ArrayList<String>(9);
			al.add(leftUp);
			al.add(centreUp);
			al.add(rightUp);
			
			al.add(centreLeft);
			al.add(centre);
			al.add(centreRight);
			
			al.add(leftDown);
			al.add(centreDown);
			al.add(rightDown);
			return al;
		}
	
	
	
	    /*****
	     * 給定點的經緯度和角度及距離。算出相應的經緯度點
	     * @param STARTLAT 中心點的緯度
	     * @param STARTLONG 中心點的經度
	     * @param ANGLE1	角度0是y座標的+級 180是-級,90是x座標的+ 270是x-
	     * @param DISTANCE  距離是m  *1000是公里km
	     * @return
	     */
	    public static String computation(double STARTLAT,double  STARTLONG,double ANGLE1,double DISTANCE)
	    {
	    	 double a;
			 double b;
			 double c;
			 double alpha;
			 double e;
			 double e2;
			 double w;
			 double V;
		     double B1;
			 double L1;
			 double B2;
			 double L2;
		     double s ;
		     double A1;
			 double A2;
	        double sinu1, cosu1, sinA0, cotq1, sin2q1, cos2q1, cos2A0;
	        double k2, q0, sin2q1q0, cos2q1q0;
	        double q;
	        double theta;
	        double aa, BB, cc, EE22, AAlpha, BBeta;
	        double sinu2, lamuda;
	        double e1;
	        double W1;
	        B1 = STARTLAT;
	        L1 = STARTLONG;
	        A1 = ANGLE1;
	        s = DISTANCE;
	        a = 6378245;
	        b = 6356752.3142;
	        c = a * a / b;
	        alpha = (a - b) / a;
	        e = Math.sqrt(a * a - b * b) / a;
	        e2 = Math.sqrt(a * a - b * b) / b;
	       if(B1 == 0)
	       {
	            if(A1 == 90)
	            {
	                A2 = 270;
	                B2 = 0;
	                L2 = L1 + s / a * 180 / Math.PI;
	            }
	            if(A1 == 270)
	            {
	                A2 = 90;
	                B2 = 0;
	                L2 = L1 - s / a * 180 / Math.PI;
	            }
	            return "";
	       }
	       B1 =  B1* Math.PI / 180;
	       L1 = L1* Math.PI / 180;
	        A1 = A1* Math.PI / 180;
	        w = Math.sqrt(1 - e * e * (Math.sin(B1) * Math.sin(B1)));
	        V = w * (a / b);
	        e1 = e;
	        W1 = w;
	        sinu1 = Math.sin(B1) * Math.sqrt(1 - e1 * e1) / W1;
	        cosu1 = Math.cos(B1) / W1;
	        sinA0 = cosu1 * Math.sin(A1);
	        cotq1 = cosu1 * Math.cos(A1);
	        sin2q1 = 2 * cotq1 / (cotq1 * cotq1 + 1);
	        cos2q1 = (cotq1 * cotq1 - 1) / (cotq1 * cotq1 + 1);
	        cos2A0 = 1 - sinA0 * sinA0;
	        e2 = Math.sqrt(a * a - b * b) / b;
	        k2 = e2 * e2 * cos2A0;
	        aa = b * (1 + k2 / 4 - 3 * k2 * k2 / 64 + 5 * k2 * k2 * k2 / 256);
	        BB = b * (k2 / 8 - k2 * k2 / 32 + 15 * k2 * k2 * k2 / 1024);
	        cc = b * (k2 * k2 / 128 - 3 * k2 * k2 * k2 / 512);
	        e2 = e1 * e1;
	        AAlpha = (e2 / 2 + e2 * e2 / 8 + e2 * e2 * e2 / 16) - (e2 * e2 / 16 + e2 * e2 * e2 / 16) * cos2A0 + (3 * e2 * e2 * e2 / 128) * cos2A0 * cos2A0;
	        BBeta = (e2 * e2 / 32 + e2 * e2 * e2 / 32) * cos2A0 - (e2 * e2 * e2 / 64) * cos2A0 * cos2A0;
	        q0 = (s - (BB + cc * cos2q1) * sin2q1) / aa;
	        sin2q1q0 = sin2q1 * Math.cos(2 * q0) + cos2q1 * Math.sin(2 * q0);
	        cos2q1q0 = cos2q1 * Math.cos(2 * q0) - sin2q1 * Math.sin(2 * q0);
	        q = q0 + (BB + 5 * cc * cos2q1q0) * sin2q1q0 / aa;
	        theta = (AAlpha * q + BBeta * (sin2q1q0 - sin2q1)) * sinA0;
	        sinu2 = sinu1 * Math.cos(q) + cosu1 * Math.cos(A1) * Math.sin(q);
	        B2 = Math.atan(sinu2 / (Math.sqrt(1 - e1 * e1) * Math.sqrt(1 - sinu2 * sinu2))) * 180 / Math.PI;
	        lamuda = Math.atan(Math.sin(A1) * Math.sin(q) / (cosu1 * Math.cos(q) - sinu1 * Math.sin(q) * Math.cos(A1))) * 180 / Math.PI;
	          if(Math.sin(A1) > 0)
	          {
	            if((Math.sin(A1) * Math.sin(q) / (cosu1 * Math.cos(q) - sinu1 * Math.sin(q) * Math.cos(A1)) > 0))
	            {
	                lamuda = Math.abs(lamuda);
	            }
	            else
	            {
	                lamuda = 180 - Math.abs(lamuda);
	            }
	          }
	          else
	          {
	            if(Math.sin(A1) * Math.sin(q) / (cosu1 * Math.cos(q) - sinu1 * Math.sin(q) * Math.cos(A1)) > 0)
	            {
	                lamuda = Math.abs(lamuda) - 180;
	            }
	            else
	            {
	                lamuda = -Math.abs(lamuda);
	            }
	          }
	        L2 = L1 * 180 / Math.PI + lamuda - theta * 180 / Math.PI;
	        A2 = Math.atan(cosu1 * Math.sin(A1) / (cosu1 * Math.cos(q) * Math.cos(A1) - sinu1 * Math.sin(q))) * 180 / Math.PI;
	        if(Math.sin(A1) > 0)
	        {
	            if(cosu1 * Math.sin(A1) / (cosu1 * Math.cos(q) * Math.cos(A1) - sinu1 * Math.sin(q)) > 0)
	            {
	                A2 = 180 + Math.abs(A2);
	            }
	            else
	            {
	                A2 = 360 - Math.abs(A2);
	            }
	        }
	        else
	        {
	            if(cosu1 * Math.sin(A1) / (cosu1 * Math.cos(q) * Math.cos(A1) - sinu1 * Math.sin(q)) > 0)
	            {
	                A2 = Math.abs(A2);
	            }
	            else
	            {
	                A2 = 180 - Math.abs(A2);
	            }
	        }
	        return B2+","+L2;
	    }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章