refactoring

main
Ogoun 4 months ago
parent c1b6f4891d
commit 564ca5b797

@ -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({
// Заполнение данных
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 (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({
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];
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++;
// Факториал
function factorial(n) {
j = 1;
for (i = 1; i <= n; i++) {
j = j * i;
}
return j;
}
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 stochasticPathFind(array) {
}
// Вычисление оптимального маршрута по начальной и конечной точке
@ -303,7 +345,8 @@ function recalculateWaypoints(waypoints) {
}
$(() => {
initData();
waypoints.loadData();
initMap();
initRegionDropDown();
initRecalculateWaypointsButton();

Loading…
Cancel
Save

Powered by TurnKey Linux.