From 564ca5b7970b0f5facd40a4fe8eb1b328e90b6d8 Mon Sep 17 00:00:00 2001 From: Ogoun Date: Sat, 18 May 2024 17:22:32 +0300 Subject: [PATCH] refactoring --- src/js/index.js | 221 +++++++++++++++++++++++++++++------------------- 1 file changed, 132 insertions(+), 89 deletions(-) diff --git a/src/js/index.js b/src/js/index.js index f1aecda..f2f5480 100644 --- a/src/js/index.js +++ b/src/js/index.js @@ -1,54 +1,89 @@ -let markersData = []; -let regions = []; -let points = []; -var regionPointsWidget; -var selectedPointsWidget; -const markerUrl = './img/map-marker.png'; +// Класс для доступа к данным маршрутов +class WaypointsData { + constructor() { + // Данные для маркеров на карте + this.markersData = []; + // Регионы + this.regions = []; + // Точки + this.points = []; + } -// Инициализация данных, подготовка массивов для загрузки в контролы -function initData() { - for (var r_idx in data['regions']) { - var region = data['regions'][r_idx] - regions.push({ - id: r_idx, - name: region.name, - icon: 'airplane' - }); - for (var p_idx in region.points) { - var point = region.points[p_idx]; - var loc = point.gps.split(','); - var lat = parseFloat(loc[0].trim()) - var lon = parseFloat(loc[1].trim()) - markersData.push({ - location: [lat, lon], - tooltip: { - text: point.name, - } + // Заполнение данных + loadData() { + let point_counter = 0; + for (const r_idx in data['regions']) { + const region = data['regions'][r_idx] + this.regions.push({ + id: r_idx, + name: region.name, + icon: 'airplane' }); + for (const p_idx in region.points) { + const point = region.points[p_idx]; + const loc = point.gps.split(','); + const lat = parseFloat(loc[0].trim()) + const lon = parseFloat(loc[1].trim()) + this.markersData.push({ + location: [lat, lon], + tooltip: { + text: point.name, + } + }); + this.points.push({ + id: point_counter, + location: [lat, lon], + text: point.name, + description: point.description, + regionId: r_idx, + }); + point_counter++; + } } } -} -// Загрузка точек на карте из региона -function loadPoints(region) { - points = []; - for (var p_idx in region.points) { - var point = region.points[p_idx]; - var loc = point.gps.split(','); - var lat = parseFloat(loc[0].trim()) - var lon = parseFloat(loc[1].trim()) - points.push({ - id: p_idx, - text: point.name, - description: point.description, - location: [lat, lon], - tooltip: { - text: point.description, + // Получить маркеры для карты + getMarkers() { + return this.markersData; + } + + // Получить список регионов + getRegions() { + return this.regions; + } + + // Получить точки которые относятся к региону + getRegionPoints(r_idx) { + return this.points.filter(p => p.regionId == r_idx); + } + + // Получить точки по переданным индексам точек + getSelectedPoints(indexes) { + let result = []; + this.points.forEach((point) => { + if (indexes.includes(point.id)) { + result.push(point); } }); + + // Сортировка результата в порядке переданных индексов + let ordered = []; + indexes.forEach((ind)=>{ + const index = result.findIndex(p=>p.id == ind); + ordered.push(result[index]); + result.slice(index, 1); + }); + return ordered; } } +// Точки для карты +const waypoints = new WaypointsData(); +const markerUrl = './img/map-marker.png'; + +let regionPointsWidget; +let selectedPointsWidget; + // Инициализация контрола карты function initMap() { const mapWidget = $('#map').dxMap({ @@ -61,13 +96,13 @@ function initMap() { width: 760, controls: true, markerIconSrc: markerUrl, - markers: markersData, + markers: waypoints.getMarkers(), type: 'roadmap' }).dxMap('instance'); } // Пересоздание списка точек указанного региона, для выбора мест к посещению -function rebuildRegionPointsList(region) { +function rebuildRegionPointsList(regionId) { if (regionPointsWidget) { regionPointsWidget.dispose(); } @@ -78,7 +113,7 @@ function rebuildRegionPointsList(region) { dataSource: new DevExpress.data.DataSource({ store: new DevExpress.data.ArrayStore({ key: 'id', - data: points, + data: waypoints.getRegionPoints(regionId), }), }), height: 400, @@ -109,23 +144,16 @@ function initRegionDropDown() { displayExpr: 'name', keyExpr: 'id', onItemClick(e) { - var region = data['regions'][e.itemData.id]; - loadPoints(region); - rebuildRegionPointsList(region); + rebuildRegionPointsList(e.itemData.id); DevExpress.ui.notify(`${e.itemData.name}`, 'success', 600); }, - items: regions, + items: waypoints.getRegions(), }); } // Перестроение списка выбранных точек function rebuildSelectedPointsList(selectedPointsIndexes) { - let selected = []; - for (const p_idx in points) { - if (p_idx in selectedPointsIndexes) { - selected.push(points[p_idx]); - } - } + const selected = waypoints.getSelectedPoints(selectedPointsIndexes); if (selectedPointsWidget) { selectedPointsWidget.dispose(); } @@ -177,6 +205,45 @@ function initRecalculateWaypointsButton() { }); } +// Отображение маршрута +function showTravelPoints(indexes) { + const points = waypoints.getSelectedPoints(indexes); + let calculatedPoints = []; + let prevPoint = null; + let id = 0; + for (const idx in points) { + const point = points[idx]; + if (prevPoint != null) { + const d = (calculateDistance(point.location[0], point.location[1], prevPoint.location[0], prevPoint.location[1]) / 1000.0).toFixed(2); + calculatedPoints.push({ + ID: id, + Waypoint: d + ' км.' + }); + id++; + } + + calculatedPoints.push({ + ID: id, + Waypoint: point.text + }); + id++; + + prevPoint = point; + } + $(() => { + $('#waypointsGrid').dxDataGrid({ + dataSource: calculatedPoints, + showColumnHeaders: false, + showColumnLines: false, + showRowLines: true, + rowAlternationEnabled: true, + keyExpr: 'ID', + columns: ['Waypoint'], + showBorders: true, + }); + }); +} + // Расчет расстояние между двумя точками заданными координатами на поверхности Земли function calculateDistance(lat1, lon1, lat2, lon2) { const R = 6371e3; // metres @@ -209,43 +276,18 @@ function shuffle(array) { } } -function showTravelPoints(indexes) { - let calculatedPoints = []; - let prevPoint = null; - let id = 0; - for (const i in indexes) { - const idx = indexes[i]; - const point = points[idx]; +// Факториал +function factorial(n) { + j = 1; + for (i = 1; i <= n; i++) { + j = j * i; + } + return j; +} - if (prevPoint != null) { - const d = (calculateDistance(point.location[0], point.location[1], prevPoint.location[0], prevPoint.location[1]) / 1000.0).toFixed(2); - calculatedPoints.push({ - ID: id, - Waypoint: d + ' км.' - }); - id++; - } - calculatedPoints.push({ - ID: id, - Waypoint: point.text - }); - id++; +function stochasticPathFind(array) { - prevPoint = point; - } - $(() => { - $('#waypointsGrid').dxDataGrid({ - dataSource: calculatedPoints, - showColumnHeaders: false, - showColumnLines: false, - showRowLines: true, - rowAlternationEnabled: true, - keyExpr: 'ID', - columns: ['Waypoint'], - showBorders: true, - }); - }); } // Вычисление оптимального маршрута по начальной и конечной точке @@ -303,7 +345,8 @@ function recalculateWaypoints(waypoints) { } $(() => { - initData(); + waypoints.loadData(); + initMap(); initRegionDropDown(); initRecalculateWaypointsButton();