我的数据库中有一个名为users
的表,并且已经创建了一个模型User
。我数据库中的每个用户都有特定的latitude
和longitude
。因此,我想根据用户的位置对他们进行排序。例如:
假设我的一位用户的纬度为34.567,经度为56.983。现在,我想显示所有纬度和经度与我的纬度非常接近的用户。假设:34.975和56.884。因此,我想显示位置接近我的用户位置的特定用户。因此,我该如何在Laravel中进行排序。
注意:是的,这个问题没有代码。但是,我已经在文档中搜索了类似的内容,但是他们有针对特定情况的文档,例如
sorting on the basis of posted time and so on.
,谢谢。
答案 0 :(得分:0)
用于按距离排序的通用PHP代码:
// Get the requested latitude and longitude (from whatever source)
$lat = $coords['latitude'];
$lng = $coords['longitude'];
$distance = 81; // Radius of distance in kilometers
$earthRadius = 6731; // accepted mean radius of the Earth in kilometres
if ($distance == 0) {
$distance = 81; // Default to 50 miles (in km) if no distance given!
}
$latDistance = $distance / 111.325;
$lngDistance = (cos(abs($lat)) * $distance) / 111.325;
$minLat = $lat - $latDistance;
$maxLat = $lat + $latDistance;
$minLng = $lng - $lngDistance;
$maxLng = $lng + $lngDistance;
$boundaryCalculation = "(users.latitude >= {$minLat} AND users.latitude <= {$maxLat} AND users.longitude >= {$minLng} AND users.longitude <= {$maxLng})";
$distanceCalculation = "(ACOS(SIN({$lat}*PI()/180) * SIN(users.latitude*PI()/180) + (COS({$lat}*PI()/180)*COS(users.latitude*PI()/180) * COS((({$lng}-users.longitude)*PI()/180)))) * {$earthRadius})";
// Create the query
// Note, should be parameterized but this gives the idea
$query = "SELECT * FROM users WHERE " . $boundaryCalculation . " AND " . $distanceCalculation;
这提供了很好的介绍:https://www.scribd.com/presentation/2569355/Geo-Distance-Search-with-MySQL
请注意,从5.7版开始,MySQL提供了一个内置函数来计算球面上两个点之间的距离。可能有用!
https://dev.mysql.com/doc/refman/5.7/en/spatial-convenience-functions.html