<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>ビル内テナント表示マップ(1階)</title> <link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css" /> <script src="https://unpkg.com/leaflet/dist/leaflet.js"></script> <script src="https://cdn.jsdelivr.net/npm/papaparse@5.4.1/papaparse.min.js"></script> </head> <body> <div id="map" style="width: 100%; height: 600px;"></div> <script> const map = L.map('map').setView([38.917, 139.839], 16); L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: '© OpenStreetMap contributors' }).addTo(map); const csvUrl = 'snackbuilding.csv'; const buildings = {}; Papa.parse(csvUrl, { download: true, header: true, complete: function(results) { results.data.forEach(row => { // 1階のみ抽出 if (!row.building_name || !row.lat || !row.lon || row.floor !== '1F') return; const key = row.building_name; if (!buildings[key]) { buildings[key] = { lat: parseFloat(row.lat), lon: parseFloat(row.lon), tenants: [] }; } buildings[key].tenants.push({ floor: row.floor, name: row.shop_name, category: row.category }); }); Object.entries(buildings).forEach(([name, data]) => { const popupHtml = ` <b>${name}</b><br> ${data.tenants.map(t => `${t.floor}: ${t.name}(${t.category})`).join('<br>')} `; L.marker([data.lat, data.lon]) .addTo(map) .bindPopup(popupHtml); }); } }); </script> </body> </html>