經緯度和高德地圖計算兩點距離面積
阿新 • • 發佈:2018-12-07
關於經緯度,可以看huanhuan的部落格根據兩點經緯度計算距離
文章詳細介紹了經緯度以及根據經緯度,計算兩點直接的距離。
高德地圖中,計算兩點直線距離的公式如下:
//根據經緯度獲取兩點距離
public static int calculateDistance(double x1, double y1, double x2, double y2) {
final double NF_pi = 0.01745329251994329; // 弧度 PI/180
x1 *= NF_pi;
y1 *= NF_pi;
x2 *= NF_pi;
y2 *= NF_pi;
double sinx1 = Math.sin(x1);
double siny1 = Math.sin(y1);
double cosx1 = Math.cos(x1);
double cosy1 = Math.cos(y1);
double sinx2 = Math.sin(x2);
double siny2 = Math.sin(y2);
double cosx2 = Math.cos(x2);
double cosy2 = Math.cos(y2);
double[] v1 = new double[3];
v1[0] = cosy1 * cosx1 - cosy2 * cosx2;
v1[1] = cosy1 * sinx1 - cosy2 * sinx2;
v1[2] = siny1 - siny2;
double dist = Math.sqrt(v1[0] * v1[0] + v1[1] * v1[1] + v1[2] * v1[2]);
return (int) (Math.asin(dist / 2) * 12742001.5798544);
}
獲取指定兩點間固定距離的點
//獲取指定兩點之間固定距離點
public static LatLng getPointForDis(LatLng sPt, LatLng ePt, double dis) {
double lSegLength = calculateDistance(sPt, ePt);
double preResult = dis / lSegLength;
return new LatLng((ePt.latitude - sPt.latitude) * preResult + sPt.latitude, (ePt.longitude - sPt.longitude) * preResult + sPt.longitude);
}
計算兩點之間的矩形面積
public static float calculateArea(LatLng leftTop, LatLng rightBottom) {
try {
double var2 = Math.sin(leftTop.latitude * 3.141592653589793D / 180.0D) - Math.sin(rightBottom.latitude * 3.141592653589793D / 180.0D);
double var4 = (rightBottom.longitude - leftTop.longitude) / 360.0D;
if (var4 < 0.0D) {
++var4;
}
return (float) (2.5560394669790553E14D * var2 * var4);
} catch (Throwable t) {
t.printStackTrace();
return 0.0F;
}
}
計算多點圍成的面積
public static float calculateArea(List<LatLng> points) {
byte i3 = 3;
if (points != null && points.size() >= i3) {
double var2 = 0.0D;
double var4 = 111319.49079327357D;
int size = points.size();
for(int i = 0; i < size; ++i) {
LatLng var8 = points.get(i);
LatLng var9 = points.get((i + 1) % size);
double var10 = var8.longitude * var4 * Math.cos(var8.latitude * 0.017453292519943295D);
double var12 = var8.latitude * var4;
double var14 = var9.longitude * var4 * Math.cos(var9.latitude * 0.017453292519943295D);
double var16 = var9.latitude * var4;
var2 += var10 * var16 - var14 * var12;
}
return (float)Math.abs(var2 / 2.0D);
} else {
return 0.0F;
}
}