IMMREX7

aku nok ndi : /home/spdtg/www/schoolmis/app/Http/Controllers/API/
File Up :
aku nok ndi : /home/spdtg/www/schoolmis/app/Http/Controllers/API/GpsController.php

<?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 - 2025 IMMREX7