一、java
public class GeoUtil {
private static final double EARTH_RADIUS = 6371393; // 平均半径,单位:m
/**
* 通过AB点经纬度获取距离
* @param longitude1 A点(经)
* @param latitude1 A点(纬)
* @param longitude2 B点(经)
* @param latitude2 B点(纬)
* @return 距离(单位:米)
*/
public static double getDistance(Double longitude1,Double latitude1, Double longitude2,Double latitude2) {
Point2D pointA = new Point2D.Double(longitude1, latitude1);
Point2D pointB = new Point2D.Double(longitude2,latitude2);
// 经纬度(角度)转弧度。弧度用作参数,以调用Math.cos和Math.sin
double radiansAX = Math.toRadians(pointA.getX()); // A经弧度
double radiansAY = Math.toRadians(pointA.getY()); // A纬弧度
double radiansBX = Math.toRadians(pointB.getX()); // B经弧度
double radiansBY = Math.toRadians(pointB.getY()); // B纬弧度
// 公式中“cosβ1cosβ2cos(α1-α2)+sinβ1sinβ2”的部分,得到∠AOB的cos值
double cos = Math.cos(radiansAY) * Math.cos(radiansBY) * Math.cos(radiansAX - radiansBX)
+ Math.sin(radiansAY) * Math.sin(radiansBY);
double acos = Math.acos(cos); // 反余弦值
return EARTH_RADIUS * acos; // 最终结果
}
public static void main(String[] args) {
// 北京 天安门
Point2D pointTAM = new Point2D.Double(116.403882, 39.915139);
// 广州 越秀公园
System.out.println(getDistance(116.403882, 39.915139,113.272422,23.147387));
//1887KM
}
}
二、sql()
1、赤道半径
select 1, 6378137*2*ASIN(SQRT(POWER(SIN((39.915139-23.147387)*ACOS(-1)/360),2)
+COS(39.915139*ACOS(-1)/180)*COS(23.147387*ACOS(-1)/180)
*POWER(SIN((116.403882-113.272422)*ACOS(-1)/360),2))) AS distance
from user
-- 1889719.8835222987 6378137 地球赤道半径6378.137千米
2、平均半径
-- 1887721.7654363303 6371393 平均半径约6371千米
SELECT
1, (
6371393 * acos (
cos ( radians(39.915139) )
* cos( radians( 23.147387 ) )
* cos( radians( 116.403882 ) - radians(113.272422) )
+ sin ( radians(39.915139) )
* sin( radians( 23.147387 ) )
)
) AS distance
FROM user a