经过大量研究而没有找到解决方案,我不得不问。 如何计算Mysql中两个长/点之间的距离? (有效的方式?)
我也找到了this解决方案,但是我不知道@lat @long是哪个而且我没有使用Points因为spring-data-jpa不允许使用Geometry Type(除了使用MysqlSpatial方言)
在Java中我的计算方式如下:
private double getDistanceFromLatLonInKm(double lat1,double lon1,double lat2,double lon2) {
int R = 6371; //Earth Radius
double dLat = degreeToRadiant(lat2-lat1);
double dLon = degreeToRadiant(lon2-lon1);
double a =
Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(degreeToRadiant(lat1)) * Math.cos(degreeToRadiant(lat2)) *
Math.sin(dLon/2) * Math.sin(dLon/2)
;
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
return R * c; //Distance in km
}
我的表/实体包含一个经度列和另一个纬度列。
另一个问题,是否有可能用如前所述的弹簧数据jpa来解决这个问题?
我尝试将Java代码翻译为Mysql,但距离很远。
SELECT name, (6371 * (
2 * ATAN2(
SQRT(
SIN(RADIANS((48.3069400-latitude))/2) * SIN(RADIANS((48.3069400-latitude)/2)) +
COS(RADIANS(latitude)) * COS(RADIANS(48.3069400)) * SIN(RADIANS((48.3069400-longitude)/2)) *
SIN(RADIANS((48.3069400-longitude)/2))
),SQRT(
1-(SIN(RADIANS((48.3069400-latitude))/2) * SIN(RADIANS((48.3069400-latitude)/2)) +
COS(RADIANS(latitude)) * COS(RADIANS(48.3069400)) * SIN(RADIANS((48.3069400-longitude)/2)) *
SIN(RADIANS((48.3069400-longitude)/2)))
)
)
)) as distance FROM event
答案 0 :(得分:2)
在MySQL 5.7.x中,IMHO最有效的方法是使用几何函数:
SELECT st_distance_sphere( POINT( lat1, long1) , POINT(lat2, long2 ));
你会得到以米为单位的距离。
在MariaDB上,st_distance(...)将返回类似的结果。
答案 1 :(得分:1)
好的,我在上面的代码中找到了解决方案和错误,我忘了插入经度哈哈
对于那些也在搜索此类代码的人,以下代码计算给定点与表格行中坐标之间的距离。
带有48.306... is the given latitude
的数字和带有14.28... is the given longitude
的数字
距离以km计算,数字6371是地球半径。
SELECT name, (6371 * (
2 * ATAN2(
SQRT(
SIN(RADIANS((48.3069400-latitude))/2) * SIN(RADIANS((48.3069400-latitude)/2)) +
COS(RADIANS(latitude)) * COS(RADIANS(48.3069400)) * SIN(RADIANS((14.2858300-longitude)/2)) *
SIN(RADIANS((14.2858300-longitude)/2))
),SQRT(
1-(SIN(RADIANS((48.3069400-latitude))/2) * SIN(RADIANS((48.3069400-latitude)/2)) +
COS(RADIANS(latitude)) * COS(RADIANS(48.3069400)) * SIN(RADIANS((14.2858300-longitude)/2)) *
SIN(RADIANS((14.2858300-longitude)/2)))
)
)
)) as distance FROM event