// leaflet_bridge.js function initMap(config) { const { imgUrl, width, height, meta, grid_size, dots } = config; // Setup Coordinate XY (0,0 in alto a sinistra) const map = L.map('map', { crs: L.CRS.Simple, minZoom: -2, maxZoom: 4, attributionControl: false }); const bounds = [[-height, 0], [0, width]]; L.imageOverlay(imgUrl, bounds).addTo(map); map.fitBounds(bounds); // Gestione Griglia let gridLayer = L.layerGroup(); if (meta.show_grid) { const step = meta.grid_size || 100; const S = meta.pixel_ratio || 1; for (let x = 0; x <= width; x += (step * S)) { L.polyline([[0, x], [-height, x]], {color: '#ccc', weight: 1, opacity: 0.5}).addTo(gridLayer); } for (let y = 0; y >= -height; y -= (step * S)) { L.polyline([[y, 0], [y, width]], {color: '#ccc', weight: 1, opacity: 0.5}).addTo(gridLayer); } gridLayer.addTo(map); } // Visualizzazione punti esistenti (Verdi e Blu) dots.forEach(dot => { const color = dot.status === 'completed' ? '#228B22' : '#0000FF'; L.circleMarker([dot.y, dot.x], { radius: config.dot_size / 5, fillColor: color, color: 'white', weight: 2, fillOpacity: 0.8 }).addTo(map).bindPopup(`X: ${dot.relX}, Y: ${dot.relY}`); }); // Evento Click per rilievo map.on('click', function(e) { const raw_x = e.latlng.lng; const raw_y = e.latlng.lat; // In Leaflet Simple, Y รจ negativa sotto l'origine // Invio dati a Streamlit window.parent.postMessage({ type: 'streamlit:setComponentValue', value: { x: raw_x, y: raw_y, timestamp: new Date().getTime() } }, '*'); }); }