package com.panzhihua.service_community.util;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import java.util.HashMap;
|
import java.util.Map;
|
|
/**
|
* @ClassName: MapDistance
|
* @Author: yh
|
* @Date: 2022/11/11 15:21
|
* @Description: 经纬度处理
|
*/
|
@Slf4j
|
public class MapDistance {
|
private static double EARTH_RADIUS = 6378.137;
|
|
|
private static double rad(double d) {
|
return d * Math.PI / 180.0;
|
}
|
|
private static final double EARTH_RADIUS1 = 6370996.81;
|
|
// 弧度
|
private static double radian(double d) {
|
return d * Math.PI / 180.0;
|
}
|
|
public static Double distanceOfTwoPoints(String lat1Str, String lng1Str, String lat2Str, String lng2Str) {
|
Double lat1 = Double.parseDouble(lat1Str);
|
Double lng1 = Double.parseDouble(lng1Str);
|
Double lat2 = Double.parseDouble(lat2Str);
|
Double lng2 = Double.parseDouble(lng2Str);
|
|
double radLat1 = radian(lat1);
|
double radLat2 = radian(lat2);
|
double a = radLat1 - radLat2;
|
double b = radian(lng1) - radian(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 * EARTH_RADIUS1;
|
s = Math.round(s * 10000) / 10000;
|
return s;
|
}
|
|
|
/**
|
* 根据两个位置的经纬度,来计算两地的距离(单位为KM)
|
* 参数为String类型
|
* @return
|
*/
|
public static String getDistance(String lat1Str, String lng1Str, String lat2Str, String lng2Str) {
|
Double lat1 = Double.parseDouble(lat1Str);
|
Double lng1 = Double.parseDouble(lng1Str);
|
Double lat2 = Double.parseDouble(lat2Str);
|
Double lng2 = Double.parseDouble(lng2Str);
|
double patm = 2;
|
double radLat1 = rad(lat1);
|
double radLat2 = rad(lat2);
|
double difference = radLat1 - radLat2;
|
double mdifference = rad(lng1) - rad(lng2);
|
double distance = patm * Math.asin(Math.sqrt(Math.pow(Math.sin(difference / patm), patm)
|
+ Math.cos(radLat1) * Math.cos(radLat2)
|
* Math.pow(Math.sin(mdifference / patm), patm)));
|
distance = distance * EARTH_RADIUS;
|
String distanceStr = String.valueOf(distance);
|
return distanceStr;
|
}
|
|
/**
|
* 获取当前用户一定距离以内的经纬度值
|
* 单位米 return minLat
|
* 最小经度 minLng
|
* 最小纬度 maxLat
|
* 最大经度 maxLng
|
* 最大纬度 minLat
|
*/
|
public static Map<Object,Object> getAround(String latStr, String lngStr, double raidusMile) {
|
log.info("latStr:"+latStr+",lngStr:"+lngStr+",raidusMile:"+raidusMile);
|
Map<Object,Object> map = new HashMap<Object,Object>();
|
|
Double latitude = Double.parseDouble(latStr);// 传值给经度
|
Double longitude = Double.parseDouble(lngStr);// 传值给纬度
|
|
Double degree = (24901 * 1609) / 360.0; // 获取每度
|
// double raidusMile = Double.parseDouble(raidus);
|
|
Double mpdLng = Double.parseDouble((degree * Math.cos(latitude * (Math.PI / 180))+"").replace("-", ""));
|
Double dpmLng = 1 / mpdLng;
|
Double radiusLng = dpmLng * raidusMile;
|
//获取最小经度
|
Double minLat = longitude - radiusLng;
|
// 获取最大经度
|
Double maxLat = longitude + radiusLng;
|
|
Double dpmLat = 1 / degree;
|
Double radiusLat = dpmLat * raidusMile;
|
// 获取最小纬度
|
Double minLng = latitude - radiusLat;
|
// 获取最大纬度
|
Double maxLng = latitude + radiusLat;
|
|
map.put("minLat", minLat+"");
|
map.put("maxLat", maxLat+"");
|
map.put("minLng", minLng+"");
|
map.put("maxLng", maxLng+"");
|
|
return map;
|
}
|
|
public static void main(String[] args) {
|
//济南国际会展中心经纬度:117.11811 36.68484
|
//趵突泉:117.00999000000002 36.66123
|
//103.962128,30.57568
|
//103.957232,30.636726
|
// System.out.println(getDistance("30.57568","103.962128","30.636726","103.957232"));
|
|
//103.842654,30.560987
|
System.out.println(getAround("104.082679", "30.592872", 900000d));
|
//117.01028712333508(Double), 117.22593287666493(Double),
|
//36.44829619896034(Double), 36.92138380103966(Double)
|
//104.03035080138962(String), 104.12020319861038(String), 30.271352899925574(String), 30.64081710007443(String)
|
// distanceOfTwoPoints("30.57568","103.962128","30.636726","103.957232");
|
}
|
|
}
|