feat(gps): фильтр «далеко от дороги» в LBS-режиме (offRoadMeters, OSRM nearest); пробег «точно + примерно (по вышкам)» в Маршрутах

This commit is contained in:
2026-08-29 21:12:09 +03:00
parent 9eaff65500
commit a302f0c0ea
8 changed files with 135 additions and 12 deletions

View File

@@ -5,6 +5,7 @@ import { gpsStorage } from "./storage";
import { processPosition, filterTrackPoints } from "./geozone.service";
import { hasGpsAccess } from "./access";
import { ensureDevice, deleteDevice } from "./traccar.client";
import { OSRM_URL } from "./osrm";
import { storage } from "../storage";
/**
@@ -19,8 +20,7 @@ const MAX_TRACK_POINTS = 2000;
// OSRM map matching (привязка трека к дорогам)
// =====================
// URL OSRM-сервиса (контейнер во внутренней Docker-сети)
const OSRM_URL = process.env.OSRM_URL || "http://osrm:5000";
// URL OSRM-сервиса — см. ./osrm (общий модуль, используется и в geozone.service)
// Лимит OSRM Match API — 100 координат на запрос; берём с запасом
const OSRM_CHUNK_SIZE = 95;
// Таймаут запроса к OSRM
@@ -432,6 +432,11 @@ export function registerGpsRoutes(app: Express) {
if (!Number.isInteger(gpsLostHours) || gpsLostHours < 1 || gpsLostHours > 72) {
return badRequest(res, "gpsLostHours: целое число от 1 до 72");
}
const offRoadMeters =
req.body?.offRoadMeters !== undefined ? Number(req.body.offRoadMeters) : current.offRoadMeters;
if (!Number.isInteger(offRoadMeters) || offRoadMeters < 0 || offRoadMeters > 2000) {
return badRequest(res, "offRoadMeters: целое число от 0 до 2000 (0 = фильтр выключен)");
}
// Центр карты по умолчанию — только для admin (у остальных молча игнорируется)
let defaultLat = current.defaultLat;
@@ -471,6 +476,7 @@ export function registerGpsRoutes(app: Express) {
maxJumpSpeedKmh,
tripStopMinutes,
gpsLostHours,
offRoadMeters,
defaultLat,
defaultLng,
defaultZoom,
@@ -481,6 +487,7 @@ export function registerGpsRoutes(app: Express) {
maxJumpSpeedKmh: row.maxJumpSpeedKmh,
tripStopMinutes: row.tripStopMinutes,
gpsLostHours: row.gpsLostHours,
offRoadMeters: row.offRoadMeters,
defaultLat: row.defaultLat,
defaultLng: row.defaultLng,
defaultZoom: row.defaultZoom,