我有一个包含不同位置的数据库,每个位置都有自己的经度和纬度变量。我希望能够使用我所做的距离函数来返回我的WHERE语句中两个经度和纬度之间的距离。所以我正在寻找两点之间的距离,如果它小于我正在搜索的半径,它会传递WHERE语句。
距离函数:
function distance($lat1, $lon1, $lat2, $lon2) {
$theta = $lon1 - $lon2;
$dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta));
$dist = acos($dist);
$dist = rad2deg($dist);
$miles = $dist * 60 * 1.1515;
return $miles;
}
在我的SELECT语句中我想要这样的东西:
SELECT * FROM Locations WHERE distance($latitude, $longitude, 'latitude', 'longitude')
然而,这是行不通的。
我没试过就试过这些......
"SELECT * FROM Locations WHERE distance($latitude, $longitude, 'latitude', 'longitude') < $radius"
和
sprintf("SELECT * FROM Locations WHERE %f < $radius", distance($latitude, $longitude, 'latitude', 'longitude'))
这甚至可以预制吗?如果不是这个问题的好方法是什么?谢谢!
编辑:我试图做"SELECT * FROM Locations WHERE '" . distance('Latitude', 'Longitude', $latitude, $longitude) . "' < $radius"
但它不起作用,但是如果我只是回应它它输出我正在寻找的结果。但是当我尝试在mysqli_query
中使用它时,它无法正常工作答案 0 :(得分:1)
我使用了同样但一个问题: 我在查询中使用如下:
///////////////////////////////////////////////////
$sql = "select ... AND '".distance2($lat,$long,'tbl_parkinglocations.lat',`tbl_parkinglocations.lat`) ."'<=20 ";
///////////////////////////////////////////////////
但在功能上:
function distance2($lat1,$long1,$lat2,$long2){
//Google api
echo $fromAddress=$lat1.','.$long1;
echo $toAddress=$lat2.','.$long2;
// echo "https://maps.googleapis.com/maps/api/distancematrix/json?origins=$fromAddress&destinations=$toAddress&sensor=false";
$URL = json_decode(file_get_contents("https://maps.googleapis.com/maps/api/distancematrix/json?origins=$fromAddress&destinations=$toAddress&sensor=false"));
echo "<br>".$URL; exit;
$status = $URL->rows[0]->elements[0]->status;
if($status != 'ZERO_RESULTS'){
$res = round($URL->rows[0]->elements[0]->distance->value/1000);
return $res;
}
}
它得到第3和第4个参数如下: 3rd-&GT; tbl_parkinglocations.lat 4th-&GT; tbl_parkinglocations.lat
答案 1 :(得分:0)
简单的方法是将函数的结果存储在变量中,然后将其添加到选择查询中。
答案 2 :(得分:0)
试试这个..
$sql = "SELECT * FROM Locations WHERE " . distance($latitude, $longitude, 'latitude', 'longitude') . " < $radius";
答案 3 :(得分:0)
不,你不能那样做。
您可以创建一个存储过程,该存储过程可以计算位置与指定坐标的距离,然后在SQL查询中使用该存储过程。
或者您可以在SQL查询中内联您的距离计算,例如显示为here in this linked answer。