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;
	    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值