2

我正在用 PHP 做一个项目。我有一个带有LATLONG字段的餐厅表。我想获得10家餐厅(带有特定的 ),它们的距离cuisine_id小于5 公里USER。我正在使用以下函数来计算距离:

// 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使用价值)距离为5 公里或更短(用户LATLONG可用)的餐厅(如果可能,使用上述getDistance功能)。

4

3 回答 3

1

sql server 查询和 php 函数执行是两个独立的东西,不能混用。您要么必须在单独的步骤中完成该任务(因此首先计算,然后查询),或者您必须在 sql server 中实现您的函数,而不是在 php.ini 中。这是可能的,它被称为存储过程

于 2013-07-31T13:10:45.580 回答
1

这个问题在某种程度上与mysql-great-circle-distance-havesine-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;
于 2013-07-31T13:21:10.533 回答
1

看看这个问题。我认为如果你用 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;
于 2013-07-31T14:20:15.503 回答