给定两点的经纬度,计算它们之间的距离

17

可能是重复问题:
MySQL经纬度表设置

我知道这个问题可能已经被问过很多次了,我做了很多研究,但我需要帮助解决一个具体的问题。

假设我有一个表单,用户输入经度和纬度,我有一个包含经度和纬度的数据库表格,如何在那个表格中搜索距离15英里半径内的点或点集?


4
请查看右侧的“相关”部分中排名前10的链接。 - D.N.
2个回答

45
您可以使用计算两点之间距离的公式,例如:
function get_distance($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)); 
}

你也可以这样做:

$query = "SELECT *,(((acos(sin((".$latitude."*pi()/180)) * 
            sin((`Latitude`*pi()/180))+cos((".$latitude."*pi()/180)) * 
            cos((`Latitude`*pi()/180)) * cos(((".$longitude."- `Longitude`)* 
            pi()/180))))*180/pi())*60*1.1515
        ) as distance 
        FROM `MyTable` 
        HAVING distance >= ".$distance.";

1
你使用的是哪个版本的MySQL?尝试将WHERE改为HAVING。MySQL 5.x在WHERE子句方面存在一些问题。http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html - claire
3
为您提供所有信息,MySQL-Query会计算英里数距离。如需确定公里数距离,必须将其乘以1.609344(就像PHP示例中那样)。 - cldrr
@claire 这是英里的距离吗?我该如何将其改为米? - user2363025
@claire 我需要将 601.1515 替换为 (601.1515*1.609344)/1000) 吗? - user2363025
我认为您在查询的末尾省略了双引号。 - David Addoteye
显示剩余3条评论

3
如果您有两点的经纬度,可以计算出纬度和经度的差值并将其转换为沿纬度和经度的距离,并使用勾股定理。 您是否看过类似http://www.movable-type.co.uk/scripts/latlong.html这样的页面?该页面提供了多种计算距离的方法。因此,遍历您的点列表时,使用公式计算每个点到目标点的距离,并仅保留满足R<15英里的点。

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