数据库语句:
select * from ls_region_user order by ACOS(SIN((39.975092 * 3.1415) / 180 ) *SIN((lat * 3.1415) / 180 ) +COS((39.975092 * 3.1415) / 180 ) * COS((lat * 3.1415) / 180 ) *COS((116.385476 * 3.1415) / 180 - (lng * 3.1415) / 180 ) ) * 6378.140 asc;
select id,lat,lng, ACOS(SIN((39.975092 * 3.1415) / 180 ) *SIN((lat * 3.1415) / 180 ) +COS((39.975092 * 3.1415) / 180 ) * COS((lat * 3.1415) / 180 ) *COS((116.385476 * 3.1415) / 180 - (lng * 3.1415) / 180 ) ) * 6378.140 from ls_region_user;
Hibernate语句:
String hql="from RegionUser u where u.lat is not null and u.lng is not null order by ACOS(SIN(("+lat.toString()+" * 3.1415) / 180 ) *SIN((u.lat * 3.1415) / 180 ) +COS(("+lat.toString()+" * 3.1415) / 180 ) * COS((u.lat * 3.1415) / 180 ) *COS(("+lng.toString()+" * 3.1415) / 180 - (u.lng * 3.1415) / 180 ) ) * 6378.140 asc";
Java方法:
public class LocationUtil {
private static double EARTH_RADIUS = 6378.140;
private static double rad(double d) {
return d * Math.PI / 180.0;
}
/**
* 计算地球上任意两点(经纬度)距离
*
* @param lat1
* @param lng1
* @param lat2
* @param lng2
* @return 千米
*/
public static double getDistance(double lat1, double lng1, double lat2,
double lng2) {
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 * EARTH_RADIUS;
// s = Math.round(s * 10000) / 10000;
return s;
}
public static void main(String[] args) {
double lat1 = 39.975092;
double lng1 = 116.385476;
double lat2 = 39.985092;
double lng2 = 116.395476;
double aa = getDistance(lat1, lng1, lat2, lng2);
System.out.println(StringUtil.doubleFormatByTwoA(aa*1000));
}
}