需求
線段:算出地圖上線段的實際長度 面積:算出地圖上不規則多邊形的實際面積
解決方案
1.線段的實際長度 直接使用高德的AMapUtils.calculateLineDistance(latLng,latLng)方法計算。
2.任意多邊形面積的計算 思路:blog.csdn.net/xxdddail/ar…
具體程式碼:
/**
* 計算任意多邊形的面積
* @param latLngLines 經緯度座標點
* @return
*/
public float calculateArea(List<LatLng> latLngLines) {
List<double[]> pointFList = new ArrayList<>();
for (int i = 0; i < latLngLines.size(); i++) {
LatLng latLng = latLngLines.get(i);
//經緯度轉換成平面直角座標系
pointFList.add(AMapUtil.WGS2flat(latLng.longitude, latLng.latitude));
}
int iCycle, iCount;
iCycle = 0;
double iArea = 0;
iCount = pointFList.size();
for (iCycle = 0; iCycle < iCount; iCycle++) {
iArea = iArea + (pointFList.get(iCycle)[0] * pointFList.get((iCycle + 1) % iCount)[1] - pointFList.get((iCycle + 1) % iCount)[0] * pointFList.get(iCycle)[1]);
}
return (float) Math.abs(0.5 * iArea);
}
複製程式碼
經緯度轉平面直角座標系
// 地球長半軸
public static final double EARTH_RADIUS = 6378.137;
/**
* 經緯度轉換成以米為單位的平面直角座標
*
* @param lon 經度
* @param lat 緯度
* @return 平面直角座標double型陣列,以米為單位
*/
public static double[] WGS2flat(double lon, double lat) {
double L = CalcRad(lon);
double l = L - CalcRad(120);
double B = CalcRad(lat);
double cosb = Math.cos(B);
double sinb = Math.sin(B);
double a = EARTH_RADIUS * 1000;
// 地球短半軸
double b = 6356752.3142451793;
double t = Math.tan(B);
// double r = 3600 * 180 / Math.PI;
double e2 = (Math.pow(a, 2) - Math.pow(b, 2)) / Math.pow(a, 2);
double e12 = (Math.pow(a, 2) - Math.pow(b, 2)) / Math.pow(b, 2);
double n2 = e12 * Math.pow(cosb, 2);
double N = a / Math.sqrt(1 - e2 * Math.pow(sinb, 2));
double x = 6367449.1458 * B - 32009.8185 * cosb * sinb - 133.9975
* cosb * Math.pow(sinb, 3) - 0.6975 * cosb * Math.pow(sinb, 5);
double X = x + N / 2 * t * Math.pow(cosb, 2) * Math.pow(l, 2) + N / 24
* t * Math.pow(cosb, 4)
* (5 - Math.pow(t, 2) + 9 * n2 + 4 * Math.pow(n2, 2))
* Math.pow(l, 4);
double Y = N * cosb * l + N / 6 * Math.pow(cosb, 3)
* (1 - Math.pow(t, 2) + n2) * Math.pow(l, 3);
double[] coord = {X, Y};
return coord;
}
/**
* 計算弧度
*
* @param d 以度為單位的經緯度數值
* @return 以弧度為單位的經緯度數值
*/
public static double CalcRad(double d) {
return d * Math.PI / 180.0;
}
複製程式碼