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