将经纬度与另一个经纬度进行比较

3

我在数据库中存储了场馆的纬度和经度。

同时,我也有登录用户的纬度和经度信息。

我正在开发一个函数,允许用户在给定的范围内查找场馆,比如20英里。

是否可能从用户的纬度和经度信息中找到距离20英里最远的纬度和经度,并以某种方式编写MySQL查询以在距离圆内查找场馆?

谢谢。


1
如果你简单搜索一下,这个问题有成千上万个答案。好的关键词是“Haversine”或“Vincenty”。 - Mark Baker
如果你需要进行大量的这些计算,你可以考虑使用具有空间能力的数据库,如PostGIS或MongoDB,它们可以为你完成这些计算。 - Alex Howansky
我看到了链接@insertusernamehere,但这需要我循环遍历数据库中的每个值?我正在寻找一种方法来计算用户位置向外20英里的经纬度,并在圆圈内搜索数据库中的内容! - sark9012
使用方形而不是圆形来预选您的数据。 - nibra
正方形的角是否比期望的距离更远? - sark9012
@Luke - 他们可能会这样做,但是一个边界框可以让你针对数据库行的一个小子集执行SQL查询,而不是对每一行执行缓慢、昂贵的哈弗赛恩或文森蒂计算。 - Mark Baker
2个回答

2
我找到了一个可用的PHP函数:
function getDistanceBetweenPoints($latitude1, $longitude1, $latitude2, $longitude2, $unit = 'Mi') {

    $theta = $longitude1 - $longitude2;
    $distance = (sin(deg2rad($latitude1)) * sin(deg2rad($latitude2))) + (cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * cos(deg2rad($theta)));
    $distance = acos($distance);
    $distance = rad2deg($distance);
    $distance = $distance * 60 * 1.1515; switch($unit) {
        case 'Mi': break; case 'Km' : $distance = $distance * 1.609344;
    }
    return (round($distance,2));

}  

希望这能对其他人有所帮助。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接