galleria_photo_face_rknn_op.../public/js/map/activities/activitySource.js
2026-10-03 12:16:58 +02:00

240 lines
4.1 KiB
JavaScript

// public/js/map/activities/activitySource.js
// ===================================
// ACTIVITY SOURCE
// ===================================
(() => {
"use strict";
const SOURCE_ID = "activities";
const CLUSTER_RADIUS = 80;
// ===============================
// CREATE SOURCE
// ===============================
function createActivitySource(
map,
features = [],
) {
if (!map) {
return null;
}
if (!map.isStyleLoaded()) {
console.log(
"[ActivitySource] create rimandato: style non pronto",
);
return null;
}
const existingSource =
map.getSource(SOURCE_ID);
if (existingSource) {
existingSource.setData({
type: "FeatureCollection",
features,
});
return existingSource;
}
const data = {
type: "FeatureCollection",
features,
};
console.log(
"[ActivitySource] creo source activities",
{
features: features.length,
},
);
map.addSource(SOURCE_ID, {
type: "geojson",
data,
cluster: true,
clusterRadius: CLUSTER_RADIUS,
});
console.log(
"[ActivitySource] source activities creata",
{
source:
!!map.getSource(SOURCE_ID),
},
);
return map.getSource(SOURCE_ID);
}
// ===============================
// UPDATE SOURCE
// ===============================
function updateActivitySource(
map,
features = [],
) {
if (!map) {
return null;
}
console.log(
"[ActivitySource.update]",
{
features: features.length,
styleLoaded: map.isStyleLoaded(),
sourceExists: !!map.getSource("activities"),
}
)
if (!map.isStyleLoaded()) {
console.log(
"[ActivitySource] update rimandato: style non pronto",
);
return null;
}
const data = {
type: "FeatureCollection",
features,
};
const source =
map.getSource(SOURCE_ID);
// --------------------------------
// SOURCE ESISTENTE
// --------------------------------
if (source) {
source.setData(data);
console.log(
"[ActivitySource] source aggiornata",
{
features: features.length,
},
);
return source;
}
// --------------------------------
// SOURCE NON ESISTENTE
// --------------------------------
return createActivitySource(
map,
features,
);
}
// ===============================
// GET SOURCE
// ===============================
function getActivitySource(map) {
if (!map) {
return null;
}
return (
map.getSource(SOURCE_ID) ||
null
);
}
// ===============================
// GET FEATURES
// ===============================
function getActivitySourceFeatures(map) {
const source =
getActivitySource(map);
if (!source) {
return [];
}
return source._data?.features || [];
}
// ===============================
// GET CLUSTERS
// ===============================
function getActivitySourceClusters(map) {
if (!map) {
return [];
}
if (!map.getSource(SOURCE_ID)) {
return [];
}
return map.querySourceFeatures(
SOURCE_ID,
{
filter: [
"has",
"point_count",
],
},
);
}
// ===============================
// GET POINTS
// ===============================
function getActivitySourcePoints(map) {
if (!map) {
return [];
}
if (!map.getSource(SOURCE_ID)) {
return [];
}
return map.querySourceFeatures(
SOURCE_ID,
{
filter: [
"!",
["has", "point_count"],
],
},
);
}
// ===============================
// PUBLIC API
// ===============================
window.ActivitySource = {
create:
createActivitySource,
update:
updateActivitySource,
get:
getActivitySource,
getFeatures:
getActivitySourceFeatures,
getClusters:
getActivitySourceClusters,
getPoints:
getActivitySourcePoints,
};
})();