-
Notifications
You must be signed in to change notification settings - Fork 0
/
get_clustering.js
177 lines (149 loc) · 7.32 KB
/
get_clustering.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
getClustering();
async function getClustering() {
let biciclette = [];
let responseDatiNoleggio
let datiNoleggio = [];
const responseStorico = await fetch('/storico');
const datiStorico = await responseStorico.json();
for (let itemStorico of datiStorico) {
responseDatiNoleggio = await fetch('/get_dati_noleggio?codice_noleggio=' + itemStorico.codice); //Richiediamo i dati del noleggio
let data = await responseDatiNoleggio.json();
if (window.htmlCheckbox.checked) {
let dateTimeInizio = new Date(new Date(data[0].data_inizio).getFullYear(), (new Date(data[0].data_inizio).getMonth()), new Date(data[0].data_inizio).getDate());
let dateTimeFine = new Date(new Date(data[0].data_fine).getFullYear(), (new Date(data[0].data_fine).getMonth()), new Date(data[0].data_fine).getDate());
let dataInizioHtml = new Date(new Date(window.htmlInputDataInizio.value).getFullYear(), (new Date(window.htmlInputDataInizio.value).getMonth()), new Date(window.htmlInputDataInizio.value).getDate());
let dataFineHtml = new Date(new Date(window.htmlInputDataFine.value).getFullYear(), (new Date(window.htmlInputDataFine.value).getMonth()), new Date(window.htmlInputDataFine.value).getDate());
if (dateTimeInizio >= dataInizioHtml && dateTimeFine <= dataFineHtml) {
datiNoleggio.push(itemStorico.codice); //Pushiamo i dati ottenuti nel nostro array
}
} else {
datiNoleggio.push(itemStorico.codice); //Pushiamo i dati ottenuti nel nostro array
}
}
//Ogni storico lo aggiungiamo al nostro "biciclette" che contiene l'oggetto di ogni storico
datiStorico.forEach(function (lineString) {
if (datiNoleggio.includes(lineString.codice)) {
var geometry = JSON.parse(lineString.geometry);
var feature = {
type: 'Feature',
geometry: {
type: geometry.type,
coordinates: geometry.coordinates,
},
properties: {
codice: lineString.codice
}
};
biciclette.push(feature);
}
});
if (biciclette.length > 0) {
//Creiamo il body per la richiesta POST a "/clustering
var formBody = [];
//Aggiungiamo il numero di cluster da creare
var data = {
numClusters: window.numberOfClusters,
};
for (var prop in data) {
var encKey = encodeURIComponent(prop);
var encValue = encodeURIComponent(data[prop]);
formBody.push(encKey + "=" + encValue);
}
//Aggiungiamo tutte le biciclette
for (let feature of biciclette) {
for (let coordinates of feature.geometry.coordinates) {
data = {
long: coordinates[0],
lat: coordinates[1],
};
for (var property in data) {
var encodedKey = encodeURIComponent(property);
var encodedValue = encodeURIComponent(data[property]);
formBody.push(encodedKey + "=" + encodedValue);
}
}
}
formBody = formBody.join("&");
//Facciamo la richiesta a "/clustering" con tutti i parametri necessari messi nel body
const jsonClusterResponse = await fetch('/clustering', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: formBody,
});
/* Salviamo nella variabile "jsonCluster" la risposta alla richiesta POST precedente. Questa variabile
* conterrà tutte le bici con id, nome e cluster di appartenenza. */
var jsonCluster = await jsonClusterResponse.json();
/* Quando visualizziamo il layer delle bici clusterizzate, rimuoviamo le biciclette dalla mappa.
* Verranno reinserite quando terminerà la visualizzazione dei cluser di bici. */
mymap.removeLayer(window.clusterRastrelliere);
//Array dalla quale andremo a prendere i colori dei cluster. Saranno al massimo dieci divisioni, dunque al massimo dieci colori
var colore = ["#ff0000", "#F2F230", "#004dff", "#099300", "#00ffd2", "#dd00ff", "#ff9101", "#000000", "#FFFFFF", "#868573"];
//Array nella quale andremo ad inserire le bici trovate con lo stesso id dei cluster in jsonCluster
var pointRas = [];
//Creo cluster da array di bici
for (let singolaCoordinata of Object.values(jsonCluster)) {
//singoloRas -> è la singola bici presente in jsonCluster
pointRas.push({
id: singolaCoordinata.id,
long: singolaCoordinata.long,
lat: singolaCoordinata.lat,
color: colore[singolaCoordinata.cluster],
});
}
//Creiamo la variabile che conterrà i marker clusterizzati da visualizzare sulla mappa
var jsonClusterRas = [];
var iconColor;
pointRas.forEach(function (point) {
var lat = point.lat;
var lon = point.long;
iconColor = point.color;
var feature = {
type: 'Feature',
properties: {
lat: lat,
lon: lon,
color: iconColor
},
geometry: {
type: 'Point',
coordinates: [lon, lat]
},
};
jsonClusterRas.push(feature);
});
//Estetica del marker
function svgTemplate(color) {
return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" class="marker">
<path fill-opacity=".25" d="M16 32s1.427-9.585 3.761-12.025c4.595-4.805 8.685-.99 8.685-.99s4.044 3.964-.526 8.743C25.514 30.245 16 32 16 32z"/>
<path fill=` + color + ` stroke="#000" d="M15.938 32S6 17.938 6 11.938C6 .125 15.938 0 15.938 0S26 .125 26 11.875C26 18.062 15.938 32 15.938 32zM16 6a4 4 0 100 8 4 4 0 000-8z"/>
</svg>`;
}
//Creazione icona del marker
function icon(color) {
return L.divIcon({
className: "marker",
html: svgTemplate(color),
iconSize: [40, 40],
iconAnchor: [12, 24],
popupAnchor: [7, -16]
});
}
var geoJson = {type: 'FeatureCollection', features: jsonClusterRas};
//Creazione del marker in base al suo colore (e ovviamente alla sua lat e long). Lo aggiungiamo anche alla mappa.
window.clusterKMEANS = L.geoJson(geoJson, {
pointToLayer: function (feature, latlng) {
return L.marker(latlng, {
icon: icon(feature.properties.color),
});
},
}).addTo(mymap);
abilitaPulsanti([buttonClustering]);
} else {
alert("Non ci sono storici nelle date selezionate!");
nascondiClustering = false;
buttonClustering.innerHTML = 'Avvia Clustering';
abilitaPulsanti([buttonViewStorico, buttonDistanzaMaxRastrelliera, buttonReset, buttonViewBikesRealTime, buttonAttivazioni, buttonClustering, buttonSimulazione, buttonAddRastrelliereFromFile, buttonAddGeofenceFromFile]);
}
}