package com.moral.api.utils; 
 | 
  
 | 
import com.moral.api.entity.GeoCoordinate; 
 | 
  
 | 
import java.util.ArrayList; 
 | 
import java.util.List; 
 | 
  
 | 
/** 
 | 
 * @program: screen 
 | 
 * @description: 计算多个地点的中心点 
 | 
 * @author: lizijie 
 | 
 * @create: 2021-12-09 16:37 
 | 
 **/ 
 | 
public class GetCenterPointFromListOfCoordinates { 
 | 
  
 | 
    /** 
 | 
     *  根据输入的地点坐标计算中心点 
 | 
     * @param geoCoordinateList 
 | 
     * @return 
 | 
     */ 
 | 
    public static GeoCoordinate getCenterPoint(List<GeoCoordinate> geoCoordinateList) { 
 | 
        int total = geoCoordinateList.size(); 
 | 
        double X = 0, Y = 0, Z = 0; 
 | 
        for (GeoCoordinate g : geoCoordinateList) { 
 | 
            double lat, lon, x, y, z; 
 | 
            lat = g.getLatitude() * Math.PI / 180; 
 | 
            lon = g.getLongitude() * Math.PI / 180; 
 | 
            x = Math.cos(lat) * Math.cos(lon); 
 | 
            y = Math.cos(lat) * Math.sin(lon); 
 | 
            z = Math.sin(lat); 
 | 
            X += x; 
 | 
            Y += y; 
 | 
            Z += z; 
 | 
        } 
 | 
  
 | 
        X = X / total; 
 | 
        Y = Y / total; 
 | 
        Z = Z / total; 
 | 
        double Lon = Math.atan2(Y, X); 
 | 
        double Hyp = Math.sqrt(X * X + Y * Y); 
 | 
        double Lat = Math.atan2(Z, Hyp); 
 | 
        return new GeoCoordinate(Lat * 180 / Math.PI, Lon * 180 / Math.PI); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 根据输入的地点坐标计算中心点(适用于400km以下的场合) 
 | 
     * @param geoCoordinateList 
 | 
     * @return 
 | 
     */ 
 | 
    public static GeoCoordinate getCenterPoint400(List<GeoCoordinate> geoCoordinateList) { 
 | 
        // 以下为简化方法(400km以内) 
 | 
        int total = geoCoordinateList.size(); 
 | 
        double lat = 0, lon = 0; 
 | 
        for (GeoCoordinate g : geoCoordinateList) { 
 | 
            lat += g.getLatitude() * Math.PI / 180; 
 | 
            lon += g.getLongitude() * Math.PI / 180; 
 | 
        } 
 | 
        lat /= total; 
 | 
        lon /= total; 
 | 
        return new GeoCoordinate(lat * 180 / Math.PI, lon * 180 / Math.PI); 
 | 
    } 
 | 
  
 | 
    public static void main(String[] args) { 
 | 
        List geoCoordinateList = new ArrayList(); 
 | 
        GeoCoordinate g = new GeoCoordinate(); 
 | 
        g.setLongitude(112.977324); 
 | 
        g.setLatitude(28.178376); 
 | 
        GeoCoordinate g2 = new GeoCoordinate(); 
 | 
        g2.setLongitude(112.975782); 
 | 
        g2.setLatitude(28.172258); 
 | 
        geoCoordinateList.add(g); 
 | 
        geoCoordinateList.add(g2); 
 | 
  
 | 
        GeoCoordinate  re = GetCenterPointFromListOfCoordinates.getCenterPoint(geoCoordinateList); 
 | 
        System.out.println(re.getLongitude() +"   "+ re.getLatitude()); 
 | 
    } 
 | 
  
 | 
  
 | 
} 
 |