google-map经纬度转换算法;

it2022-05-05  128

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)