187 lines
3.7 KiB
Text
187 lines
3.7 KiB
Text
// public/js/map/mapboxMarkers.js
|
|
// ===============================
|
|
// MAPBOX MARKERS CONTROLLER
|
|
// ===============================
|
|
|
|
(() => {
|
|
"use strict";
|
|
|
|
let mapboxMap = null;
|
|
|
|
// ===================================
|
|
// STATO
|
|
// ===================================
|
|
|
|
const state = {
|
|
photos: [],
|
|
activities: [],
|
|
routes: [],
|
|
};
|
|
|
|
// ===================================
|
|
// MAPPA
|
|
// ===================================
|
|
|
|
function setMap(map) {
|
|
if (!map) {
|
|
console.error("[MapboxMarkers] mappa non valida");
|
|
return;
|
|
}
|
|
|
|
mapboxMap = map;
|
|
|
|
console.log("[MapboxMarkers] mappa collegata");
|
|
|
|
/*
|
|
* In futuro qui verranno inizializzati:
|
|
*
|
|
* Photos
|
|
* ├── source
|
|
* ├── clusters
|
|
* ├── markers
|
|
* └── spiderfy
|
|
*
|
|
* Activities
|
|
* ├── source
|
|
* ├── clusters
|
|
* └── markers
|
|
*/
|
|
|
|
setupMapEvents();
|
|
}
|
|
|
|
// ===================================
|
|
// EVENTI MAPPA
|
|
// ===================================
|
|
|
|
function setupMapEvents() {
|
|
if (!mapboxMap) {
|
|
return;
|
|
}
|
|
|
|
mapboxMap.on("moveend", () => {
|
|
console.log("[MapboxMarkers] moveend");
|
|
});
|
|
|
|
mapboxMap.on("zoomstart", () => {
|
|
console.log("[MapboxMarkers] zoomstart");
|
|
});
|
|
}
|
|
|
|
// ===================================
|
|
// PHOTOS
|
|
// ===================================
|
|
|
|
function setPhotos(features = []) {
|
|
state.photos.length = 0;
|
|
state.photos.push(...features);
|
|
|
|
console.log("[MapboxMarkers] photos:", state.photos.length);
|
|
|
|
if (!mapboxMap) {
|
|
return;
|
|
}
|
|
|
|
/*
|
|
* La gestione effettiva delle foto
|
|
* verrà spostata nei moduli:
|
|
*
|
|
* photos/photoSource.js
|
|
* photos/photoClusters.js
|
|
* photos/photoMarkers.js
|
|
* photos/photoSpiderfy.js
|
|
*/
|
|
if (window.PhotoSource) {
|
|
window.PhotoSource.update(mapboxMap, state.photos);
|
|
}
|
|
}
|
|
|
|
// ===================================
|
|
// ACTIVITIES
|
|
// ===================================
|
|
|
|
function setActivities(features = []) {
|
|
state.activities.length = 0;
|
|
state.activities.push(...features);
|
|
|
|
console.log("[MapboxMarkers] activities:", state.activities.length);
|
|
|
|
/*
|
|
* In futuro:
|
|
*
|
|
* activities/activitySource.js
|
|
* activities/activityClusters.js
|
|
* activities/activityMarkers.js
|
|
*/
|
|
}
|
|
|
|
// ===================================
|
|
// ROUTES
|
|
// ===================================
|
|
|
|
function setRoutes(features = []) {
|
|
state.routes.length = 0;
|
|
state.routes.push(...features);
|
|
|
|
if (!mapboxMap || !mapboxMap.isStyleLoaded()) {
|
|
return;
|
|
}
|
|
|
|
const data = {
|
|
type: "FeatureCollection",
|
|
features: state.routes,
|
|
};
|
|
|
|
const source = mapboxMap.getSource("routes");
|
|
|
|
if (source) {
|
|
source.setData(data);
|
|
return;
|
|
}
|
|
|
|
mapboxMap.addSource("routes", {
|
|
type: "geojson",
|
|
data,
|
|
});
|
|
|
|
mapboxMap.addLayer({
|
|
id: "routes-line",
|
|
type: "line",
|
|
source: "routes",
|
|
|
|
paint: {
|
|
"line-color": "#ff6b00",
|
|
"line-width": 4,
|
|
"line-opacity": 0.8,
|
|
},
|
|
});
|
|
}
|
|
|
|
// ===================================
|
|
// DEBUG
|
|
// ===================================
|
|
|
|
function debug() {
|
|
console.log("[MapboxMarkers DEBUG]", {
|
|
map: !!mapboxMap,
|
|
photos: state.photos.length,
|
|
activities: state.activities.length,
|
|
routes: state.routes.length,
|
|
photoSource: !!mapboxMap?.getSource("photos"),
|
|
photoClusters: !!mapboxMap?.getLayer("photos-clusters"),
|
|
});
|
|
}
|
|
|
|
window.debugMapboxMarkers = debug;
|
|
|
|
// ===================================
|
|
// API PUBBLICA
|
|
// ===================================
|
|
|
|
window.MapboxMarkers = {
|
|
setMap,
|
|
setPhotos,
|
|
setActivities,
|
|
setRoutes,
|
|
};
|
|
})();
|