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 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 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()); } }