234 lines
7.0 KiB
PHP
Executable File
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']));
|
|
}
|
|
}
|
|
}
|