package com.dji.sample.utils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.dji.sample.wayline.dao.IWaylineJobMapper; import com.dji.sample.wayline.model.dto.WaylineJobDTO; import com.dji.sample.wayline.model.entity.WaylineJobEntity; import com.dji.sample.wayline.model.param.PointPOJO; import com.dji.sample.wayline.service.IWaylineJobService; import com.dji.sample.wayline.service.impl.WaylineJobServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import java.util.List; import java.util.Optional; /** * 空间计算工具类 */ public class GeoUtils { /** * 默认地球半径 */ private static double EARTH_RADIUS = 6371000;//赤道半径(单位m) /** * 转化为弧度(rad) */ private static double rad(double d) { return d * Math.PI / 180.0; } /** * 计算中心经纬度与目标经纬度的距离(米) * * @param centerLon 中心精度 * @param centerLat 中心纬度 * @param targetLon 需要计算的精度 * @param targetLat 需要计算的纬度 * @return 米 */ public static double distance(double centerLon, double centerLat, double targetLon, double targetLat) { double jl_jd = 102834.74258026089786013677476285;// 每经度单位米; double jl_wd = 111712.69150641055729984301412873;// 每纬度单位米; double b = Math.abs((centerLat - targetLat) * jl_jd); double a = Math.abs((centerLon - targetLon) * jl_wd); return Math.sqrt((a * a + b * b)); } /** * 根据多个点计算中心点 * @param list * @return */ public static PointPOJO getCenterPoint(List list) { int total = list.size(); double X = 0, Y = 0, Z = 0; for (int i = 0; i < list.size(); i++) { PointPOJO point = list.get(i); double lat, lon, x, y, z; lon = point.getLon() * Math.PI / 180; lat = point.getLat() * 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); PointPOJO centerPoint = new PointPOJO(); centerPoint.setLon( Lon * 180 / Math.PI); centerPoint.setLat(Lat * 180 / Math.PI); return centerPoint; } }