计算两个long / lat之间的距离

时间:2017-09-19 08:33:47

标签: java mysql spring jpa

经过大量研究而没有找到解决方案,我不得不问。 如何计算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

2 个答案:

答案 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