IMMREX7
<?php
namespace App\Http\Controllers\API;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Database\QueryException;
use \App\Http\SendNotificationApi;
use Illuminate\Support\Facades\Artisan;
class GpsController extends Controller {
public function getGPSData($id){
$school = \App\School::where('idSchool', '=', $id)->first();
$endpoint = "http://track7.tpgpstrack.com/api/middleMan/getDeviceInfo";
$client = new \GuzzleHttp\Client(['http_errors' => false]);
//$school->api_token
$response = $client->request('GET', $endpoint, ['query' => [
'accessToken' => $school->api_token
]]);
$statusCode = $response->getStatusCode();
if($statusCode==404)
return "";
$content = $response->getBody();
$gpsData=json_decode($content,true);
if(isset($gpsData['object'])){
$gpsVehicle=$gpsData['object'];
foreach($gpsVehicle as $vehicles){
$stdtransport =DB::table('buses')
->where('buses.busNo', '=', $vehicles['name'])->first();
if($stdtransport != null){
$ins = [];
$apiData = [];
//fetch vehicle gps coordinates
$ins['v_no'] = $vehicles['name'];
$ins['speed'] = $vehicles['speed'];
if($vehicles['latitude'] != null)
$ins['latitude'] = $vehicles['latitude'];
else
$ins['latitude'] = $vehicles['lattitude'];
$ins['longitude'] = $vehicles['longitude'];
$ins['idSchool'] = $id;
//fetch route api for direction
$route = DB::table('busroutes')->where('busroutes.idBus', '=', $stdtransport->idBus)->latest()->first();
if($route != null){
$routes = DB::table('route_stops')->where('route_stops.idRoute', '=', $route->idRoute)->get();
$intermediate = [] ;
foreach($routes as $stop){
$loc['latitude'] = $stop->latitude;
$loc['longitude'] = $stop->longitude;
if(DB::table('gps_vehicle')->where('v_no','=', $vehicles['name'])->where('stop_latitude','=', $stop->latitude)->where('stop_longitude','=', $stop->longitude)->first() == null){
$ins['stop_latitude'] = $stop->latitude;
$ins['stop_longitude'] = $stop->longitude;
DB::table('gps_vehicle')->insert($ins);
}else{
DB::table('gps_vehicle')->where('v_no','=', $vehicles['name'])->update($ins);
}
array_push($intermediate, [
'location' => [
'latLng' => $loc
]
]);
}
if($route->routes == null){
$apiData["origin"] = $intermediate[0];
$apiData["destination"] = $intermediate[count($intermediate) - 1];
$apiData["travelMode"] = "DRIVE";
$apiData["routingPreference"] = "TRAFFIC_AWARE";
$apiData["computeAlternativeRoutes"] = false;
$modifiers = [];
$modifiers["avoidTolls"] = false;
$modifiers["avoidHighways"] = false;
$modifiers["avoidFerries"] = false;
$apiData["routeModifiers"] =$modifiers;
$apiData["languageCode"] = "en-US";
$apiData["units"] = "IMPERIAL";
$apiData["intermediates"] = $intermediate;
//call route api
$result = \App\Http\RouteApi::initiateRoute($apiData);
$lines = $result['routes'][0];
$polyline = $lines['polyline'];
$encodedPolyline = $polyline['encodedPolyline'];
DB::table('busroutes')->where('idBusRoute',$route->idBusRoute)->update(['routes' => $encodedPolyline]);
}
}
}
}
}
return response()->json(['success' => "1"], 404, ['app-status' => 'success']);
}
public function getDeviceData($id,$busId, Request $request){
$student = \App\AdmEntry::where('idStudent', '=', $id)->first();
$school = \App\School::where('idSchool', '=', $student->idSchool)->first();
$this->getGPSData($student->idSchool);
if($school->isActive == 'Y'){
$bus =DB::table('buses')
->where('buses.idBus', '=', $busId)->first();
$stdtransport = \App\StudentTransport::where('student_transport.idStudent', '=', $student->idStudent)->first();
$stop=DB::table('route_stops')
->select('stopName',DB::raw('IFNULL(longitude,0.0) as longitude'),DB::raw('IFNULL(latitude,0.0) as latitude'))
->where('idStop','=',$stdtransport->idStop)->first();
$intermediate = [] ;
$currentLocation = DB::table('gps_vehicle')->where('v_no','=', $bus->busNo)->where('stop_latitude','=', $stop->latitude)->where('stop_longitude','=', $stop->longitude)->first();
//check if difference is greater than 5 minutes
$to = \Carbon\Carbon::now();
$valid = $currentLocation->updated_at;
$diff_in_minutes = $to->diffInSeconds($valid);
//if($diff_in_minutes > 10 &&$currentLocation->speed > 0){
//check if distance is less than 100 meters
if($request->get('location') != "" && $request->get('location') != null){
$explode = explode(",",$request->get('location'));
$loc2['latitude'] = $explode[0];
$loc2['longitude'] = $explode[1];
array_push($intermediate, [
'location' => [
'latLng' => $loc2
]
]);
}
$loc1['latitude'] = $currentLocation->latitude;
$loc1['longitude'] = $currentLocation->longitude;
array_push($intermediate, [
'location' => [
'latLng' => $loc1
]
]);
/*$loc['latitude'] = $stop->latitude;
$loc['longitude'] = $stop->longitude;
array_push($intermediate, [
'location' => [
'latLng' => $loc
]
]);*/
$apiData["origin"] = $intermediate[0];
$apiData["destination"] = $intermediate[count($intermediate) - 1];
$apiData["travelMode"] = "DRIVE";
$apiData["routingPreference"] = "TRAFFIC_AWARE";
$apiData["computeAlternativeRoutes"] = false;
$modifiers = [];
$modifiers["avoidTolls"] = false;
$modifiers["avoidHighways"] = false;
$modifiers["avoidFerries"] = false;
$apiData["routeModifiers"] =$modifiers;
$apiData["languageCode"] = "en-US";
$apiData["units"] = "IMPERIAL";
$apiData["intermediates"] = $intermediate;
//call route api
if($diff_in_minutes > 10 && $currentLocation->speed > 0){
$durationApi = \App\Http\RouteApi::initGetDuration($currentLocation->latitude.",".$currentLocation->longitude, $stop->latitude.",".$stop->longitude);
$duration = $durationApi["rows"][0]["elements"][0]["duration"]["value"];
$result = \App\Http\RouteApi::initiateRoute($apiData);
$lines = $result['routes'][0];
if(isset($lines['distanceMeters']))
$distance = $lines['distanceMeters']/1000;
else $distance = 0;
$polyline = $lines['polyline'];
$encodedPolyline = $polyline['encodedPolyline'];
$data = array(
'latitude' => $currentLocation->latitude,
'longitude' => $currentLocation->longitude,
'distance' => $distance,
'duration' => $duration,
'polyline' => $encodedPolyline,
'speed' => $currentLocation->speed,
);
DB::table('gps_vehicle')->where('v_no','=', $bus->busNo)
->where('stop_latitude','=', $stop->latitude)->where('stop_longitude','=', $stop->longitude)
->update([
'route' => $encodedPolyline,
'distance' => $distance,
'duration' => $duration,
'updated_at' => date('Y-m-d H:i:s')
]);
return json_encode($data);
}else{
$data = array(
'latitude' => $currentLocation->latitude,
'longitude' => $currentLocation->longitude,
'distance' => $currentLocation->distance,
'duration' => $currentLocation->duration,
'polyline' => $currentLocation->route,
'speed' =>$currentLocation->speed,
'cache' => 'Y',
);
return json_encode($data);
}
/*} */
}else{
return response()->json(['success' => "Failed"], 404, ['app-status' => 'success']);
}
}
public static function vincentyGreatCircleDistance(
$latitudeFrom, $longitudeFrom, $latitudeTo, $longitudeTo, $earthRadius = 6371000)
{
// convert from degrees to radians
$latFrom = deg2rad($latitudeFrom);
$lonFrom = deg2rad($longitudeFrom);
$latTo = deg2rad($latitudeTo);
$lonTo = deg2rad($longitudeTo);
$lonDelta = $lonTo - $lonFrom;
$a = pow(cos($latTo) * sin($lonDelta), 2) +
pow(cos($latFrom) * sin($latTo) - sin($latFrom) * cos($latTo) * cos($lonDelta), 2);
$b = sin($latFrom) * sin($latTo) + cos($latFrom) * cos($latTo) * cos($lonDelta);
$angle = atan2(sqrt($a), $b);
return $angle * $earthRadius;
}
}
Copyright © 2021 -