Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I use the PHP radius function with multiple variables?

I have been reading up on radius and mysql and I am very confused on how to exactly implement the code with multiple search variables, so could someone break it down for me.

My database has the following tables:

idx | type | price | item_desc | s_lat | s_long | created date

Here is my current code.

$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'";    
}

Everything I have found so far says to use :

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 

But I am super confused on how I implement it for $search_origin_radius and $search_dest_radius. Basically what I am trying to do is find everything that is for sale within the price range and radius around the two cities.

Example I want to find everything priced for $100 around Oklahoma City, OK within 200 miles and Kansas City, MO within 100 miles.

EDIT** As suggested added this as a stored function.

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;
}

Using new query but still nothing shows up:

$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
";
like image 742
Jayce Avatar asked Oct 29 '16 02:10

Jayce


1 Answers

Oklahoma City and Kansas City are pretty much 300 miles away from each other.

There is very little land that could be considered both under 200 miles from Oklahoma City AND under 100 miles from Kansas City, so I am not surprised your query returns no results.

Perhaps you wanted OR logic here..

SELECT id
  FROM products
 WHERE (*Oklahoma City distance calc miles* < 200
    OR *Kansas City distance calc miles* < 100)
   AND price = 100;

..or you could UNION ALL a SELECT for each city:

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;

Personally I'd lean towards the second as it is easy to build in code and gives you which city the product is found for neatly.

Although as pointed out by @PaulSpiegel this (unmodified) could return some products more than once if the search areas intersect.

like image 152
Arth Avatar answered Oct 17 '22 00:10

Arth