我正在用PHP做一个项目。我有一个包含LAT
和LONG
字段的餐馆表。我想从cuisine_id
获得 10 餐厅(具有特定USER
),其距离小于 5km 。
我使用以下函数来计算距离:
// Function for Getting distance between two coordinates.
function getDistance( $latitude1, $longitude1, $latitude2, $longitude2 ) {
$earth_radius = 6371;
$dLat = deg2rad( $latitude2 - $latitude1 );
$dLon = deg2rad( $longitude2 - $longitude1 );
$a = sin($dLat/2) * sin($dLat/2) + cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * sin($dLon/2) * sin($dLon/2);
$c = 2 * asin(sqrt($a));
$d = $earth_radius * $c;
return $d;
}
从数据库中选择记录时是否可以使用该功能?
有人可以告诉我一个示例查询获取(使用LIMIT
值)餐馆距离 5km 或更少(用户LAT
和{{可以一次性使用1}}(如果可能的话,使用上面提到的LONG
函数)。
答案 0 :(得分:1)
答案 1 :(得分:1)
这个问题与mysql-great-circle-distance-haversine-formula
有点类似SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance
FROM markers HAVING distance < 25 ORDER BY distance LIMIT 0 , 20;
答案 2 :(得分:1)
看看这个question。我想如果你用mysql编写你的函数,那么使用查询就更容易了。我试图编写你的函数版本..(语法可能不完美)
DELIMITER $$
CREATE FUNCTION distance(LAT1 DOUBLE(10,6), LON1 DOUBLE(10,6), LAT2 DOUBLE(10,6), LON2 DOUBLE(10,6))
RETURNS DOUBLE(10,2)
DETERMINISTIC
BEGIN
DECLARE r, dLat, dLon, a, c, d DOUBLE(10,6);
SET r=6371.0;
SET LAT1 = RADIANS(LAT1);
SET LON1 = RADIANS(LON1);
SET LAT2 = RADIANS(LAT2);
SET LON2 = RADIANS(LON2);
SET dLat = LAT2-LAT1;
SET dLon = LON2-LON1;
SET a = SIN(dLat/2.0) * SIN(dLat/2.0) + COS(LAT1) * COS(LAT2) * SIN(dLon/2.0) * SIN(dLon/2.0);
SET c = 2 * ASIN(SQRT(a));
SET d = c * r;
RETURN d;
END
$$
DELIMITER ;
然后,你可以这样做......
$userLatitude = ...
$userLongitude = ...
$cuisine = ...
SELECT cuisine_id, distance(LAT,LONG,$userLatitude,$userLongitude) as Distance FROM Restaurants WHERE cuisine_id = $cuisine HAVING Distance < 5 ORDER BY Distance LIMIT 10;