一。java
public class DistanceUtil {
/**
* 转化为弧度(rad)
*/
private static double rad(double d) {
return d * Math.PI / 180.0;
}
/**
* @param lon1 第一点的精度
* @param lat1 第一点的纬度
* @param lon2 第二点的精度
* @param lat2 第二点的纬度
* @return 返回的距离,单位m
*/
public static String getDistance(double lon1, double lat1, double lon2, double lat2) {
double radLat1 = rad(lat1);
double radLat2 = rad(lat2);
double a = radLat1 - radLat2;
double b = rad(lon1) - rad(lon2);
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)));
//赤道半径(单位m)
double EARTH_RADIUS = 6371000;
s = s * EARTH_RADIUS;
//单位m
s = Math.round(s * 10000) / 10000;
//m转为km保留三个小数
return new DecimalFormat("0.000").format(s / 1000);
}
}
二。mysql
1.计算地图上的一个点和站点距离 单位m
传入参数 纬度 40.0497810000 经度 116.3424590000
lat是数据库站点纬度 lon是数据库站点精度
SELECT
*,
ROUND(
6378.138 * 2 * ASIN(
SQRT(
POW(
SIN(
(
40.0497810000 * PI() / 180 - lat * PI() / 180
) / 2
),
2
) + COS(40.0497810000 * PI() / 180) * COS(lat * PI() / 180) * POW(
SIN(
(
116.3424590000 * PI() / 180 - lon * PI() / 180
) / 2
),
2
)
)
) * 1000
) AS juli
FROM
org_station
ORDER BY juli ASC
2.查询距离 此地( 纬度 40.0497810000 ,经度 116.3424590000 )在 x米以内的站点数据
//latitude 是数据库站点纬度 longitude 是数据库站点精度
SELECT *
FROM org_station
WHERE ROUND(
6378.138 * 2 * ASIN(
SQRT(
POW(
SIN(
(
40.0497810000 * PI() / 180 - latitude * PI() / 180
) / 2
),
2
) + COS(40.0497810000 * PI() / 180) * COS(latitude * PI() / 180) * POW(
SIN(
(
116.3424590000 * PI() / 180 - longitude * PI() / 180
) / 2
),
2
)
)
) * 1000
) <= x