Jay*_*yce 6 php mysql latitude-longitude
我一直在阅读radius和mysql,我对如何使用多个搜索变量精确实现代码感到困惑,所以有人可能会为我分解它.
我的数据库有以下表格:
idx | 类型 | 价格 | item_desc | s_lat | s_long | 创建日期
这是我目前的代码.
$search_origin_radius = "200";
$search_dest_radius = "100";
$search_origin_lat = "37.2629742";
$search_origin_long = "-98.286158";
$search_dest_lat = "37.2629742";
$search_dest_long = "-98.286158";
$type = "consumers";
$price = "100";
$sql = "SELECT * FROM products WHERE `price` = '$price'";
if($type && !empty($type))
{
$sql .= " AND `type` = '$type'";
}
Run Code Online (Sandbox Code Playgroud)
到目前为止我发现的一切都说使用:
SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( latitude ) )
* cos( radians( longitude ) - radians(-122) ) + sin( radians(37) ) * sin(radians(lat)) ) ) AS distance
FROM myTable
HAVING distance < 50
ORDER BY distance
Run Code Online (Sandbox Code Playgroud)
但是我对我如何实现它的超级困惑$search_origin_radius和$search_dest_radius.基本上我要做的就是在两个城市的价格范围和半径范围内找到所有待售的东西.
示例我想找到俄克拉荷马城周围100美元的价格,200英里内的OK和100英里内的堪萨斯城.
编辑**正如建议的那样,将其添加为存储函数.
function Calc_Distance($latitudeFrom, $longitudeFrom, $latitudeTo, $longitudeTo, $earthRadius = 3959)
{
// convert from degrees to radians
$latFrom = deg2rad($latitudeFrom);
$lonFrom = deg2rad($longitudeFrom);
$latTo = deg2rad($latitudeTo);
$lonTo = deg2rad($longitudeTo);
$latDelta = $latTo - $latFrom;
$lonDelta = $lonTo - $lonFrom;
$angle = 2 * asin(sqrt(pow(sin($latDelta / 2), 2) +
cos($latFrom) * cos($latTo) * pow(sin($lonDelta / 2), 2)));
return $angle * $earthRadius;
}
Run Code Online (Sandbox Code Playgroud)
使用新查询但仍然没有显示:
$sql = "
SELECT *
FROM products
WHERE Calc_Distance(s_lat, s_long, $search_origin_lat, $search_origin_long) < 200
AND Calc_Distance(s_lat, s_long, $search_dest_lat, $search_dest_long) < 100
AND price = $price
";
Run Code Online (Sandbox Code Playgroud)
俄克拉荷马城和堪萨斯城距离彼此相距300英里.
AND距离堪萨斯城100英里以外的俄克拉荷马城200英里以下的土地很少,所以我对你的查询没有结果感到惊讶.
也许你想要OR逻辑......
SELECT id
FROM products
WHERE (*Oklahoma City distance calc miles* < 200
OR *Kansas City distance calc miles* < 100)
AND price = 100;
Run Code Online (Sandbox Code Playgroud)
..或者你可以UNION ALL一个SELECT为每个城市:
SELECT id, 'Oklahoma City' as city
FROM products
WHERE *Oklahoma City distance calc miles* < 200
AND price = 100
UNION ALL
SELECT id, 'Kansas City'
FROM products
WHERE *Kansas City distance calc miles* < 100
AND price = 100;
Run Code Online (Sandbox Code Playgroud)
我个人倾向于第二,因为它很容易构建代码,并为您提供整齐地找到产品的城市.
虽然正如@PaulSpiegel指出的那样,如果搜索区域相交,这个(未经修改的)可以多次返回一些产品.
编写一个存储函数,它接受两对纬度和经度,并返回距离。
$sql = "
SELECT ...
FROM MyTbl
WHERE Distance(s_lat, s_long, $search_origin_lat, $search_origin_long) < 200
AND Distance(s_lat, s_long, $search_dest_lat, $search_dest_long) < 100
AND price = $price
";
Run Code Online (Sandbox Code Playgroud)
或者将表达式拼写两次。