From 8056c5f132b23c5b9f50be824355af579ca62c34 Mon Sep 17 00:00:00 2001 From: artem Date: Fri, 18 Sep 2026 21:51:28 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=BF=D0=BE=D1=81=D1=82=D1=80=D0=BE=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=BC=D0=B0=D1=80=D1=89=D1=80=D1=83=D1=82=D0=B0=20=D1=87=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=B7=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .roo/memory-bank/activeContext.md | 16 +++++++++------- src/pages/routes/Route.vue | 13 ++++--------- src/services/roadSnap.ts | 23 ----------------------- 3 files changed, 13 insertions(+), 39 deletions(-) delete mode 100644 src/services/roadSnap.ts diff --git a/.roo/memory-bank/activeContext.md b/.roo/memory-bank/activeContext.md index ea5d6ab..14f2c06 100644 --- a/.roo/memory-bank/activeContext.md +++ b/.roo/memory-bank/activeContext.md @@ -5,17 +5,19 @@ - task_id: TASK-ROUTE-FIX - status: success - parent_task: — -- summary: **FIX + FEATURE: Route.vue — багфикс GPX-генератора (for...in, дубликаты, фейковый ele) + snap to road через GraphHopper Cloud API.** +- summary: **FIX: Route.vue — багфикс GPX-генератора (for...in, дубликаты, фейковый ele) + фильтр близлежащих точек 5м. Snap to road убран (GraphHopper 401, риск блокировки OSM в РФ).** - next task: — -## ✅ CODER SUCCESS REPORT — TASK-ROUTE-FIX +## ✅ CODER SUCCESS REPORT — TASK-ROUTE-FIX (final) -- Изменены файлы: - - `src/pages/routes/Route.vue`: `toGPX()` (var→const, for...in→index loop, ele fix), `handleMapClick` (async, 5m filter + snapToRoad), template onClick - - `src/services/roadSnap.ts` (НОВЫЙ): `snapToRoad(lon, lat)` → GraphHopper Cloud API, fallback к исходным координатам -- Поведение: клик рядом с дорогой → точка прилипает (snap); двойной клик < 5м → игнорируется; GraphHopper down → работает как раньше +- Изменён файл: `src/pages/routes/Route.vue` + - `toGPX()`: `var date` → `const date`, `for...in` → index-based loop, `${i}` → `0` + - `handleMapClick`: синхронная (не async), фильтр < 5м до последней точки (игнор клика), push без snap + - `SNAP_THRESHOLD_M` → `MIN_DISTANCE_M` + - Убран import `snapToRoad` (файл `src/services/roadSnap.ts` остался в репо, но не используется) +- Поведение: клик < 5м от последней точки → игнорируется; клик в другом месте → точка добавляется как есть; GPX генерируется корректно (index loop, ele=0) - `yarn lint`: exit 0 -- `yarn build`: exit 0 (vue-tsc --noEmit + vite build) +- `yarn build`: exit 0 (vue-tsc --noEmit 0 ошибок, vite build ✓ 6.58s) ## TASK-LINK1 — TODO (delegate to Coder) diff --git a/src/pages/routes/Route.vue b/src/pages/routes/Route.vue index 6aa4867..d3b73e4 100644 --- a/src/pages/routes/Route.vue +++ b/src/pages/routes/Route.vue @@ -89,7 +89,6 @@ import { ref, shallowRef } from "vue"; import type { LngLat, YMap } from "@yandex/ymaps3-types"; -import { snapToRoad } from "../../services/roadSnap"; import { YandexMap, YandexMapDefaultSchemeLayer, @@ -108,25 +107,21 @@ const height = `${window.innerHeight}px`; const map = shallowRef(null); const clickCoordinates = ref([]); -const SNAP_THRESHOLD_M = 5; +const MIN_DISTANCE_M = 5; -async function handleMapClick(coords: LngLat): Promise { +function handleMapClick(coords: LngLat): void { if (clickCoordinates.value.length > 0) { const last = clickCoordinates.value[clickCoordinates.value.length - 1]; if ( calculateHaversineDistance(coords[0], coords[1], last[0], last[1]) * 1000 < - SNAP_THRESHOLD_M + MIN_DISTANCE_M ) { return; } } - const [snappedLon, snappedLat] = await snapToRoad(coords[0], coords[1]); - clickCoordinates.value = [ - ...clickCoordinates.value, - [snappedLon, snappedLat], - ]; + clickCoordinates.value = [...clickCoordinates.value, coords]; } const toGPX = () => { diff --git a/src/services/roadSnap.ts b/src/services/roadSnap.ts deleted file mode 100644 index 82ad997..0000000 --- a/src/services/roadSnap.ts +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Привязывает точку к ближайшей дороге через GraphHopper Cloud API. - * Free tier: 2000 req/день, без API key. - * Fallback: если API недоступен — возвращает исходные координаты. - */ -export async function snapToRoad( - lon: number, - lat: number, -): Promise<[number, number]> { - try { - const res = await fetch( - `https://graphhopper.com/api/1/snap?point=${lat},${lon}&layers=road`, - ); - if (!res.ok) return [lon, lat]; - const data: { points: { lat: number; lon: number }[] } = await res.json(); - if (data.points && data.points.length > 0) { - return [data.points[0].lon, data.points[0].lat]; - } - return [lon, lat]; - } catch { - return [lon, lat]; - } -}