Files
gps-frontend/app/Http/Controllers/DummyController.php
meusinfirmary b9891d2f81 Initial commit
2025-04-22 14:33:37 +07:00

234 lines
7.0 KiB
PHP
Executable File

<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\DB;
use Validator;
use App\Responses;
use App\Helper;
use App\Models\Dummy;
class DummyController extends Controller
{
public function api_haversineGreatCircleDistance(Request $req)
{
try {
$apiResp = Responses::success();
$apiResp['data'] = [];
// round up with precisions digits = 4
// $distance == miles
// $distance = Helper::haversineGreatCircleDistance($req->start_lat, $req->start_lng, $req->end_lat, $req->end_lng, Helper::EARTH_RADIUS_MILES);
// $apiResp['data']['distance_in_km'] = round($distance*1.609, 4);
// $apiResp['data']['distance_in_miles'] = round($distance, 4);
// $apiResp['data']['distance_in_meters'] = round($distance*1609, 4);
// $distance == km
// $distance = Helper::haversineGreatCircleDistance($req->start_lat, $req->start_lng, $req->end_lat, $req->end_lng, Helper::EARTH_RADIUS_KM);
// $apiResp['data']['distance_in_km'] = round($distance, 4);
// $apiResp['data']['distance_in_miles'] = round($distance/1.609, 4);
// $apiResp['data']['distance_in_meters'] = round($distance*1000, 4);
// $distance == meters
$distance = Helper::haversineGreatCircleDistance($req->start_lat, $req->start_lng, $req->end_lat, $req->end_lng, Helper::EARTH_RADIUS_M);
$apiResp['data']['distance_in_km'] = round($distance / 1000, 4);
$apiResp['data']['distance_in_miles'] = round($distance / 1609, 4);
$apiResp['data']['distance_in_meters'] = round($distance, 4);
return (new Response($apiResp, $apiResp['meta']['code']));
} catch (\Exception $e) {
$apiResp = Responses::error($e->getMessage());
return (new Response($apiResp, $apiResp['meta']['code']));
}
}
public function api_addBatchDummyTracks(Request $req)
{
try {
$now = time();
$apiResp = Responses::success();
$batch_tracks = $req->batch_tracks;
DB::beginTransaction();
foreach ($batch_tracks as $key => $val) {
$batch_tracks[$key]['crt'] = $now;
$now = strtotime('+2 seconds', $now);
Dummy::addDummyTrack($batch_tracks[$key]);
}
$apiResp['data'] = $batch_tracks;
DB::commit();
return (new Response($apiResp, $apiResp['meta']['code']));
} catch (\Exception $e) {
DB::rollBack();
$apiResp = Responses::error($e->getMessage());
return (new Response($apiResp, $apiResp['meta']['code']));
}
}
public function api_getTracksBySeconds(Request $req)
{
try {
$routes = Dummy::getByGpsId($req->gps_id);
if (!isset($routes[0])) {
$apiResp = Responses::not_found();
return (new Response($apiResp, $apiResp['meta']['code']));
}
/**
* ngebandingin dari row yg belum berbeda ke row berikutnya
* jika data: 2,4,6,8,10
* diff_sec: 2
* results: 2,6,...
* diff_sec: 4
* results: 2,8,...
* diff_sec: 6
* results: 2,10,...
*/
// $start_now = strtotime('+'.$req->sec.' seconds', $routes[0]->crt);
// $init_per_chunk = 0;
// foreach ($routes as $key => $val) {
// if ($init_per_chunk == 1) {
// if ($val->crt >= $start_now) {
// $start_now = strtotime('+'.$req->sec.' seconds', $routes[$key-1]->crt);
// $init_per_chunk = 0;
// }
// continue;
// }
// $init_per_chunk = 1;
// $chunk_by_sec[] = $val;
// }
/**
* ngebandingin dari row yg belum berbeda ke row berikutnya
* jika data: 2,4,6,8,10,12,14
* diff_sec: 2
* results: 2,4,6,8
* diff_sec: 4
* results: 2,6,10
* diff_sec: 6
* results: 2,8,14
*/
$chunk_by_sec = [];
$chunk_by_sec[] = $routes[0];
foreach ($routes as $key => $val) {
$diffSec = $val->crt - end($chunk_by_sec)->crt;
if ($diffSec >= $req->sec) {
$chunk_by_sec[] = $val;
}
}
$apiResp = Responses::success();
$apiResp['total'] = count($chunk_by_sec);
$apiResp['data'] = $chunk_by_sec;
return (new Response($apiResp, $apiResp['meta']['code']));
} catch (\Exception $e) {
$apiResp = Responses::error($e->getMessage());
return (new Response($apiResp, $apiResp['meta']['code']));
}
}
public function api_addDummyHub(Request $req)
{
try {
$now = time();
DB::beginTransaction();
$input = [
'name' => $req->name,
'lat' => $req->lat,
'lng' => $req->lng,
'polygon' => $req->polygon,
];
$rulesInput = [
'name' => 'required|string|max:45',
'lat' => 'required',
'lng' => 'required',
'polygon' => 'required|array',
'polygon.*.lat' => 'required',
'polygon.*.lng' => 'required',
];
// validasi input
$isValidInput = Validator::make($input, $rulesInput);
if (!$isValidInput->passes()) {
$apiResp = Responses::bad_input($isValidInput->messages()->first());
DB::rollBack();
return new Response($apiResp, $apiResp['meta']['code']);
}
/**
* The axis order for coordinates in WKT is Cartesian, so (X Y) or (longitude latitude).
* https://stackoverflow.com/questions/29315117/what-is-the-correct-mysql-polygon-format-for-latitude-and-longitude
* https://stackoverflow.com/questions/5756232/moving-lat-lon-text-columns-into-a-point-type-column
*/
$ins = [
'name' => $req->name,
'lat' => $req->lat,
'lng' => $req->lng,
'lnglat' => DB::raw("ST_GeomFromText('POINT($req->lng $req->lat)')"),
'shape' => "ST_GeomFromText('MULTIPOINT(",
];
foreach ($req->polygon as $key => $val) {
$ins['shape'] .= $val['lng'] . " " . $val['lat'].", ";
}
$ins['shape'] = substr($ins['shape'], 0, -2);
$ins['shape'] .= ")')";
$ins['shape'] = DB::raw($ins['shape']);
// return (new Response($ins['shape'], 200));
Dummy::addDummyHub($ins);
$apiResp = Responses::success();
DB::commit();
return (new Response($apiResp, $apiResp['meta']['code']));
} catch (\Exception $e) {
DB::rollBack();
$apiResp = Responses::error($e->getMessage());
return (new Response($apiResp, $apiResp['meta']['code']));
}
}
public function api_nearestHub(Request $req)
{
try {
$now = time();
$input = [
'lat' => $req->lat,
'lng' => $req->lng,
];
$rulesInput = [
'lat' => 'required',
'lng' => 'required',
];
// validasi input
$isValidInput = Validator::make($input, $rulesInput);
if (!$isValidInput->passes()) {
$apiResp = Responses::bad_input($isValidInput->messages()->first());
return new Response($apiResp, $apiResp['meta']['code']);
}
$apiResp = Responses::success();
/**
* The axis order for coordinates in WKT is Cartesian, so (X Y) or (longitude latitude).
* https://stackoverflow.com/questions/29315117/what-is-the-correct-mysql-polygon-format-for-latitude-and-longitude
* https://stackoverflow.com/questions/5756232/moving-lat-lon-text-columns-into-a-point-type-column
*/
$apiResp['data'] = Dummy::nearestHubInCircle($req->lat, $req->lng);
return (new Response($apiResp, $apiResp['meta']['code']));
} catch (\Exception $e) {
$apiResp = Responses::error($e->getMessage());
return (new Response($apiResp, $apiResp['meta']['code']));
}
}
}