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<PointPOJO> 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;
|
}
|
}
|