欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

计算多边形围栏的面积

程序员文章站 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)));
    }