MySQL 计算给定2个点,纬度和经度的距离

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/8599200/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-31 22:08:14  来源:igfitidea点击:

Calculate distance given 2 points, latitude and longitude

mysqlmapslatitude-longitude

提问by Grigor

Possible Duplicate:
MySQL latitude and Longitude table setup

可能的重复:
MySQL 纬度和经度表设置

I know this question has probably been asked many times, I've researched a lot and I need help with specific thing.

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

Lets say I have a form and user enters longitude and latitude, and I have a database which has table containing longitudes and latitudes, how would I search for a point or points in that table that are within 15 miles of radius?

假设我有一个表单,用户输入经度和纬度,并且我有一个包含经度和纬度的表的数据库,我将如何在该表中搜索半径 15 英里内的一个或多个点?

回答by claire

You can use the formula that calculates distances between two points. For example:

您可以使用计算两点之间距离的公式。例如:

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)); 
}

You can also do something like:

您还可以执行以下操作:

$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.";

回答by Oliver

If you have the Lat/Lon of two points, you can get delta Lat and delta Lon and convert this to a distance along latitude and a distance along longitude, and use Pythagorean theorem.

如果你有两个点的纬度/经度,你可以得到 delta Lat 和 delta Lon 并将其转换为沿纬度的距离和沿经度的距离,并使用勾股定理。

Have you looked at pages like http://www.movable-type.co.uk/scripts/latlong.html? This has several ways of computing distance. So as you go through your list of points, you use the formula to calculate the distance from each point to the point of interest and keep only those that satisfy R<15 miles.

你看过像http://www.movable-type.co.uk/scripts/latlong.html这样的页面吗?这有几种计算距离的方法。因此,当您浏览点列表时,您可以使用公式计算从每个点到兴趣点的距离,并仅保留满足 R<15 英里的那些点。