//微信小程序调用接口,存储经纬度
@PostMapping("/update/location")
public R updateLocation(@RequestBody UserQuery userQuery) {
if (!userService.getLoginToken(userQuery.getUserId()).equals(userQuery.getUserToken())) {
return R.error(RespCode.NO_REG.getCode(), "请登录");
}
UserEntity userEntity = userService.selectById(userQuery.getUserId());
if (userEntity != null) {
if (userQuery.getLongitude() != null && userQuery.getLatitude() != null) {
boolean flag = userService.updateLocation(userQuery);
return flag ? R.ok() : R.error(RespCode.CODE_102.getCode(), RespCode.CODE_102.getMsg());
} else {
return R.error(RespCode.CODE_101.getCode(), "传递的经纬度不正确");
}
} else {
return R.error(RespCode.CODE_101.getCode(), "用户不存在");
}
}
//通过经纬度计算距离
double distance = MapDistanceUtils.LantitudeLongitudeDist(userEntity.getLongitude(), userEntity.getLatitude(), userEntity.getLongitude(), userEntity.getLatitude());
//计算经纬度的工具类
public class MapDistanceUtils {
private static final double EARTH_RADIUS = 6378137;//赤道半径(单位m)
private static final double RAD = Math.PI / 180.0;
/**
* 转化为弧度(rad)
*/
private static double rad(double d) {
return d * PI / 180.0;
}
/**
* 基于余弦定理求两经纬度距离
*
* @param lon1 第一点的精度
* @param lat1 第一点的纬度
* @param lon2 第二点的精度
* @param lat2 第二点的纬度
* @return 返回的距离,单位km
*/
public static double LantitudeLongitudeDist(double lon1, double lat1, double lon2, double lat2) {
double radLat1 = rad(lat1);
double radLat2 = rad(lat2);
double radLon1 = rad(lon1);
double radLon2 = rad(lon2);
if (radLat1 < 0)
radLat1 = PI / 2 + Math.abs(radLat1);// south
if (radLat1 > 0)
radLat1 = PI / 2 - Math.abs(radLat1);// north
if (radLon1 < 0)
radLon1 = PI * 2 - Math.abs(radLon1);// west
if (radLat2 < 0)
radLat2 = PI / 2 + Math.abs(radLat2);// south
if (radLat2 > 0)
radLat2 = PI / 2 - Math.abs(radLat2);// north
if (radLon2 < 0)
radLon2 = PI * 2 - Math.abs(radLon2);// west
double x1 = EARTH_RADIUS * Math.cos(radLon1) * Math.sin(radLat1);
double y1 = EARTH_RADIUS * Math.sin(radLon1) * Math.sin(radLat1);
double z1 = EARTH_RADIUS * Math.cos(radLat1);
double x2 = EARTH_RADIUS * Math.cos(radLon2) * Math.sin(radLat2);
double y2 = EARTH_RADIUS * Math.sin(radLon2) * Math.sin(radLat2);
double z2 = EARTH_RADIUS * Math.cos(radLat2);
double d = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) + (z1 - z2) * (z1 - z2));
//余弦定理求夹角
double theta = Math.acos((EARTH_RADIUS * EARTH_RADIUS + EARTH_RADIUS * EARTH_RADIUS - d * d) / (2 * EARTH_RADIUS * EARTH_RADIUS));
double dist = theta * EARTH_RADIUS / 1000L;
return dist;
}
/**
* 根据提供的经度和纬度、以及半径,取得此半径内的最大最小经纬度
*
* @param raidus 单位米 *
* @return minLat, minLng, maxLat, maxLng
*/
public static Double[] getAround(Double lat, Double lon, int raidus) {
Double latitude = lat;//纬度
Double longitude = lon;//经度
Double degree = (24901 * 1609) / 360.0;//度
double raidusMile = raidus;//半径
Double dpmLat = 1 / degree;
Double radiusLat = dpmLat * raidusMile;
Double minLat = latitude - radiusLat;
Double maxLat = latitude + radiusLat;
Double mpdLng = degree * Math.cos(latitude * (PI / 180));
Double dpmLng = 1 / mpdLng;
Double radiusLng = dpmLng * raidusMile;
Double minLng = longitude - radiusLng;
Double maxLng = longitude + radiusLng;
System.out.println(minLat + " " + maxLat + " " + minLng + " " + maxLng);
// System.out.println("["+minLat+","+minLng+","+maxLat+","+maxLng+"]");
return new Double[]{minLat, maxLat, minLng, maxLng};
}
/**
* 根据两点间经纬度坐标(double值),计算两点间距离,单位为米 *
*
* @param lng1 *
* @param lat1
* @param lng2
* @param lat2
* @return
*/
public static Double getDistance(Double lng1, Double lat1, Double lng2, Double lat2) {
double radLat1 = lat1 * RAD;
double radLat2 = lat2 * RAD;
double a = radLat1 - radLat2;
Double b = (lng1 - lng2) * RAD;
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_RADIUS;
s = Math.round(s * 10000) / 10000.0;
return s;
}
public static void main(String[] args) {
//测试经纬度:117.11811 36.68484
//测试经纬度2:117.00999000000002 36.66123
//System.out.println(getDistance("117.11811","36.68484","117.00999000000002","36.66123"));
System.out.println(getAround(117.11811, 36.68484, 13000));
//117.01028712333508(Double), 117.22593287666493(Double),
//36.44829619896034(Double), 36.92138380103966(Double)
}
}