update
This commit is contained in:
@ -370,7 +370,61 @@ class Tracks extends Model
|
||||
|
||||
$query .= " ;";
|
||||
|
||||
return DB::select($query, $params);
|
||||
// return DB::select($query, $params);
|
||||
$rawTracks = DB::select($query, $params);
|
||||
$cleanTracks = self::filterJumps($rawTracks);
|
||||
|
||||
if (isset($filter["limit"])) {
|
||||
return array_slice($cleanTracks, 0, $filter["limit"]);
|
||||
}
|
||||
return $cleanTracks;
|
||||
}
|
||||
|
||||
public static function haversineDistance($lat1, $lon1, $lat2, $lon2)
|
||||
{
|
||||
$earthRadius = 6371000; // meters
|
||||
|
||||
$lat1 = deg2rad($lat1);
|
||||
$lon1 = deg2rad($lon1);
|
||||
$lat2 = deg2rad($lat2);
|
||||
$lon2 = deg2rad($lon2);
|
||||
|
||||
$dlat = $lat2 - $lat1;
|
||||
$dlon = $lon2 - $lon1;
|
||||
|
||||
$a = sin($dlat / 2) ** 2 + cos($lat1) * cos($lat2) * sin($dlon / 2) ** 2;
|
||||
$c = 2 * atan2(sqrt($a), sqrt(1 - $a));
|
||||
|
||||
return $earthRadius * $c;
|
||||
}
|
||||
|
||||
public static function filterJumps($points, $maxDistance = 50, $maxTimeGap = 10)
|
||||
{
|
||||
$filtered = [];
|
||||
$last = null;
|
||||
|
||||
foreach ($points as $p) {
|
||||
if (!$last) {
|
||||
$filtered[] = $p;
|
||||
$last = $p;
|
||||
continue;
|
||||
}
|
||||
|
||||
$distance = self::haversineDistance(
|
||||
$last->latitude,
|
||||
$last->longitude,
|
||||
$p->latitude,
|
||||
$p->longitude
|
||||
);
|
||||
$timeGap = $p->lst_loc_crt - $last->lst_loc_crt;
|
||||
|
||||
if ($distance <= $maxDistance || $timeGap > $maxTimeGap) {
|
||||
$filtered[] = $p;
|
||||
$last = $p;
|
||||
}
|
||||
}
|
||||
|
||||
return $filtered;
|
||||
}
|
||||
|
||||
public static function nearestInCircle($lat, $lng, $rad, $filter = [])
|
||||
|
||||
Reference in New Issue
Block a user