Christo S
Christo S

Reputation: 29

How to implement distance calculation in laravel?

I am beginner in laravel. I don't know how to implement the distance calculation in laravel framework.

my code:

 function distanceCalculation($point1_lat, $point1_long, $point2_lat,$point2_long, $unit = 'km', $decimals = 2) 
 {
     $degrees = rad2deg(acos((sin(deg2rad($point1_lat))*sin(deg2rad($point2_lat))) + (cos(deg2rad($point1_lat))*cos(deg2rad($point2_lat))*cos(deg2rad($point1_long-$point2_long)))));
     switch($unit) 
     {
         case 'km': 
             $distance = $degrees * 111.13384;
             break;
         case 'mi':
             $distance = $degrees * 69.05482;
             break;
         case 'nmi':
             $distance =  $degrees * 59.97662;
     }
     return round($distance, $decimals);
}

and latitude and longitude variable given below.

$point1 = array("lat" => "11.000243", "long" => "76.972726"); 

$point2 = array("lat" => "9.282275", "long" => "79.235395"); 

$km = distanceCalculation($point1['lat'], $point1['long'], $point2['lat'], $point2['long']); 

$mi = distanceCalculation($point1['lat'], $point1['long'], $point2['lat'], $point2['long'], 'mi'); 

$nmi = distanceCalculation($point1['lat'], $point1['long'], $point2['lat'], $point2['long'], 'nmi'); 

it we work fine in core php, but I want to implement this code in laravel 5.

Upvotes: 0

Views: 1036

Answers (2)

Riaz Laskar
Riaz Laskar

Reputation: 1322

save this file in /app/Helpers/CommonHelper.php

    namespace App\Helpers;
    class CommonHelper
    {
         public static function distanceCalculation($point1_lat, $point1_long, $point2_lat, $point2_long, $unit = 'km', $decimals = 2) 
         {

               $degrees = rad2deg(acos((sin(deg2rad($point1_lat))*sin(deg2rad($point2_lat))) + (cos(deg2rad($point1_lat))*cos(deg2rad($point2_lat))*cos(deg2rad($point1_long-$point2_long)))));


              switch($unit) 
              {
                  case 'km': 
                       $distance = $degrees * 111.13384;
                       break;
                  case 'mi':
                       $distance = $degrees * 69.05482;
                       break;
                  case 'nmi':
                       $distance =  $degrees * 59.97662;
              }

              return round($distance, $decimals);
        }

    }

you can access this by importing the namespace use App\Helpers\CommonHelper; CommonHelper::distanceCalculation()

i hope you got it.

Upvotes: 1

pBuch
pBuch

Reputation: 1001

You could implement your own point class that holds $latitude and $longitude properties and has your logic as a distance calculation method like:

class GeoPoint {

    public $lat;
    public $long;

    public __constuct($latitude, $longitude) {
        $this->lat = $latitude;
        $this->long = $longitude;
    }

    public distanceTo($point, $unit = 'km', $decimals = 2) {
        //your code
        $degrees = rad2deg(acos((sin(deg2rad($this->lat))*sin(deg2rad($point->lat))) + (cos(deg2rad($this->lat))*cos(deg2rad($point->lat))*cos(deg2rad($this->long-$point->long)))));


        switch($unit) 
        {
            case 'km': 
               $distance = $degrees * 111.13384;
               break;
            case 'mi':
               $distance = $degrees * 69.05482;
               break;
            case 'nmi':
               $distance =  $degrees * 59.97662;
        }

        return round($distance, $decimals);
    }
}

You could use it then (in a model or controller) like

$point1 = new GeoPoint(11.000243, 76.972726);
$point2 = new GeoPoint(9.282275, 79.235395);

$km = $point1->distanceTo($point2);
$mi = $point1->distanceTo($point2, 'mi');
$nmi = $point1->distanceTo($point2, 'nmi');

If you use a MySQL database to get your coordinates from, there is an even handier solution: https://www.codetutorial.io/geo-spatial-mysql-laravel-5/ At the best, you could put that into an abstract class (derive from Eloquent) for later code reuse.

Upvotes: 1

Related Questions