Reputation: 29
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
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
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