计算多边形围栏的面积
程序员文章站
2022-04-01 17:55:12
...
/**
* 计算多边形围栏的面积
*
* @param text 纬度 经度"39.919577748075305 116.39659531354242,39.914043815990176 116.39659531354242,39.914043815990176 116.40459978593587"
* @return 面积 单位/平方米
* <p>
* 经纬度系数由计算距离的方法换算出来的,目的为了使经纬度的长度统一
* 经度系数85382.48398929447
* 纬度系数111319.49079327372
* <p>
* 多边形面积采用鞋带式或鞋带算法(也称为高斯的面积公式和测量员的式)是一种数学算法,
* 以确定区域一个的简单多边形,其顶点由它们的描述笛卡尔坐标中的平面。用户交叉倍增相应的坐标,找到包含多边形的区域,
* 并从周围的多边形中减去它,以找到其中的多边形区域。它被称为鞋带配方,因为构成多边形的坐标不断交叉倍增,就像绑鞋带一样
*/
private double calculateArea(String text) {
String[] points = text.split(",");
int size = points.length;
double area0 = 0;
double area1 = 0;
for (int i = 0; i < size; i++) {
String[] point = points[i].split(" ");
String[] point0 = points[0].split(" ");
double x = Double.parseDouble(point[0]) * 111319.49079327372D;
double y = i + 1 < size ? Double.parseDouble(points[i + 1].split(" ")[1]) * 85382.48398929447D : Double.parseDouble(point0[1]) * 85382.48398929447D;
area0 += x * y;
double lat = Double.parseDouble(point[1]) * 85382.48398929447D;
double lon = i + 1 < size ? Double.parseDouble(points[i + 1].split(" ")[0]) * 111319.49079327372D : Double.parseDouble(point0[0]) * 111319.49079327372D;
area1 += lat * lon;
}
return Math.round(Math.abs(0.5 * (area0 - area1)));
}