Geographic search radius search using PHP and MySQL

I am developing a job portal where end users will search for jobs according to their location and proximity radius. The REST API is currently powered by SLIM and MySQL. The jobs table has latitude and longitude in each row. I searched for it here and came across Geo Distance search with MySQL .

SELECT latitude, longitude, SQRT(
POW(69.1 * (latitude - $lat), 2) +
POW(69.1 * ($long - $long) * COS(latitude / 57.3), 2)) AS distance
FROM TableName HAVING distance < 25 ORDER BY distance;


Where 

$lat =  User latitude

$long = User longitude

Now I have two more problems.

  • Should MySQL query alone be sufficient, or do I need to set up Elastic Search with it?
  • If there is any library or packages that can help me with this particular problem?

And if you could offer anything for search efficiency that could be useful.

+4
3

-

SELECT id,name,lat,lng, ROUND(( 6371 * acos( cos( radians($lat) ) * cos( radians( lat ) ) * cos( radians( lng )β€Šβ€”β€Šradians($lng) ) + sin( radians($lat) ) * sin( radians( lat ) ) ) ),(2) ) AS distance FROM jobs HAVING distance < 50 ORDER BY distance;

, Mukesh, 2x , @jision.

0
SELECT latitude, longitude, SQRT(
POW(69.1 * (latitude - $lat), 2) +
POW(69.1 * ($long - longitude) * COS(latitude / 57.3), 2)) AS distance
FROM TableName HAVING distance < 25 ORDER BY distance;

$lat =

$long =

+6
You have two option to find job by location 

you required 
1. Search users lat long
2. Job users Posted Lat long (it may be job location or job posted user location from database)
3. Query will be like - 
SELECT zip,Round(((ACOS(SIN('$lat' * PI() / 180) * SIN(latitude * PI() / 180) + COS('$lat' * PI() / 180) * COS(latitude * PI() / 180) * COS(('$lon'-longitude) * PI() / 180)) * 180 / PI()) * 60 * 1.1515),(2)) AS distance FROM Jobs Having distance <= 30 

Else 
1. You have to call all jobs data in single query.

     foreach($joblist as $job){
        $milesresult = $this->calculateDistance($user_lat,$user_lon,$job['latitude'],$jobr['longitude']);
        $miles = explode("-",$vendor['miles']);
         $vendor_max_miles = $miles[1];
        }

2. PHP function for lat long

      function calculateDistance($lat1, $lon1, $lat2, $lon2, $unit) {

            $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;
            $unit = strtoupper($unit);

            if ($unit == "K") {
              return ($miles * 1.609344);
            } else if ($unit == "N") {
                return ($miles * 0.8684);
              } else {
                  return $miles;
                }
        }
+2
source

Source: https://habr.com/ru/post/1585089/


All Articles