import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
/**
* 计算经纬度工具类
* @author chenxd
* @create 2020-08-31 18:52
*/
public class DistinceUtil {
/**
*
* @Description 计算给定经纬度附近相应公里数的经纬度范围
* @param longitude 经度
* @param latitude 纬度
* @param distince 距离(千米)
* @return String 格式:经度最小值-经度最大值-纬度最小值-纬度最大值
**/
public static String getNearbyByLongitudeAndLatitudeAndDistince(BigDecimal longitude, BigDecimal latitude, Integer distince) {
double r = 6371.393; // 地球半径千米
double lng = longitude.doubleValue();
double lat = latitude.doubleValue();
double dlng = 2 * Math.asin(Math.sin(distince / (2 * r)) / Math.cos(lat * Math.PI / 180));
dlng = dlng * 180 / Math.PI;// 角度转为弧度
double dlat = distince / r;
dlat = dlat * 180 / Math.PI;
double minlat = lat - dlat;
double maxlat = lat + dlat;
double minlng = lng - dlng;
double maxlng = lng + dlng;
return minlng + "-" + maxlng + "-" + minlat + "-" + maxlat;
}
/**
*
* @Description 计算给定经纬度附近相应公里数的经纬度范围
* @param longitude 经度
* @param latitude 纬度
* @param distince 距离(千米)
* @return Map
**/
public static Map<String,Object> getNearbyByLongitudeAndLatitudeAndDistinceMap(BigDecimal longitude, BigDecimal latitude, Integer distince) {
Map<String,Object> map = new HashMap<>();
double r = 6371.393; // 地球半径千米
double lng = longitude.doubleValue();
double lat = latitude.doubleValue();
double dlng = 2 * Math.asin(Math.sin(distince / (2 * r)) / Math.cos(lat * Math.PI / 180));
dlng = dlng * 180 / Math.PI;// 角度转为弧度
double dlat = distince / r;
dlat = dlat * 180 / Math.PI;
double minlat = lat - dlat;
double maxlat = lat + dlat;
double minlng = lng - dlng;
double maxlng = lng + dlng;
map.put("minlng",minlng);
map.put("maxlng",maxlng);
map.put("minlat",minlat);
map.put("maxlat",maxlat);
return map;
}
/**
* @Description 根据经纬度获取两点之间的距离
* @param longitude1 地点1经度
* @param latitude1 地点1纬度
* @param longitude2 地点2经度
* @param latitude2 地点2纬度
* @return 距离:单位 千米,保留三位小数
*/
public static Double getDistince(BigDecimal longitude1, BigDecimal latitude1, BigDecimal longitude2, BigDecimal latitude2) {
double r = 6371.393; // 地球半径千米
double lat1 = latitude1.doubleValue();
double lng1 = longitude1.doubleValue();
double lat2 = latitude2.doubleValue();
double lng2 = longitude2.doubleValue();
double radLat1 = rad(lat1);
double radLat2 = rad(lat2);
double a = radLat1 - radLat2;
double b = rad(lng1) - rad(lng2);
double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a/2),2) +
Math.cos(radLat1)*Math.cos(radLat2)*Math.pow(Math.sin(b/2),2)));
s = s * r;
s = (double) Math.round(s * 1000) / 1000;
return s;
}
private static Double rad(double d) {
return d * Math.PI / 180.0;
}
public static void main(String[] args) {
System.out.println(getDistince(
new BigDecimal("120.21"),
new BigDecimal("30.22"),
new BigDecimal("120.21266"),
new BigDecimal("30.2086")
));
}
}
经纬度工具类
最新推荐文章于 2024-08-12 02:05:36 发布