NutzCN Logo
问答 业务场景:20人报名参加活动,找聚会地点,有什么算法可以推荐地点
发布于 258天前 作者 sunhai1988 279 次浏览 复制 上一个帖子 下一个帖子
标签:

业务场景:20人报名参加活动,找聚会地点

3 回复

20人在不同的方向位置,推荐一个中心位置!!!

  /**
     * Calculation of the geographic midpoint (also known as the geographic center,
     * or center of gravity) for two or more points on the earth's surface Ref:
     * http://www.geomidpoint.com/calculation.html
     *
     * @param points
     * @return
     */
    public static Point2D.Double midpoint(List<Point2D.Double> points) {
        double Totweight = 0;
        double xt = 0;
        double yt = 0;
        double zt = 0;
        for (Point2D.Double point : points) {
            Double latitude = point.x;
            Double longitude = point.y;

            /**
             * Convert Lat and Lon from degrees to radians.
             */
            double latn = latitude * Math.PI / 180;
            double lonn = longitude * Math.PI / 180;

            /**
             * Convert lat/lon to Cartesian coordinates
             */
            double xn = Math.cos(latn) * Math.cos(lonn);
            double yn = Math.cos(latn) * Math.sin(lonn);
            double zn = Math.sin(latn);

            /**
             * Compute weight (by time) If locations are to be weighted equally,
             * set wn to 1
             */
            double years = 0;
            double months = 0;
            double days = 0;
            double wn = true ? 1 : (years * 365.25) + (months * 30.4375) + days;

            /**
             * Compute combined total weight for all locations.
             */
            Totweight = Totweight + wn;
            xt += xn * wn;
            yt += yn * wn;
            zt += zn * wn;
        }

        /**
         * Compute weighted average x, y and z coordinates.
         */
        double x = xt / Totweight;
        double y = yt / Totweight;
        double z = zt / Totweight;

        /**
         * If abs(x) < 10-9 and abs(y) < 10-9 and abs(z) < 10-9 then the
         * geographic midpoint is the center of the earth.
         */
        double lat = -0.001944;
        double lon = -78.455833;
        if (Math.abs(x) < Math.pow(10, -9) && Math.abs(y) < Math.pow(10, -9) && Math.abs(z) < Math.pow(10, -9)) {
        } else {

            /**
             * Convert average x, y, z coordinate to latitude and longitude.
             * Note that in Excel and possibly some other applications, the
             * parameters need to be reversed in the atan2 function, for
             * example, use atan2(X,Y) instead of atan2(Y,X).
             */
            lon = Math.atan2(y, x);
            double hyp = Math.sqrt(x * x + y * y);
            lat = Math.atan2(z, hyp);

            /**
             * Convert lat and lon to degrees.
             */
            lat = lat * 180 / Math.PI;
            lon = lon * 180 / Math.PI;
        }
        return new Point2D.Double(lat, lon);
    }
添加回复
请先登陆
回到顶部