Newer
Older
sunapara / building_sibori.html
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <title>ビル内テナント表示マップ(階数絞り込み)</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>
  <h2>階数で絞り込み</h2>
  <select id="floorSelect">
    <option value="all">すべて表示</option>
    <option value="1F">1F</option>
    <option value="2F">2F</option>
    <option value="3F">3F</option>
  </select>

  <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';
    let allData = []; // CSV全体のデータ
    let markers = []; // 現在表示中のマーカー

    // マーカーを削除する関数
    function clearMarkers() {
      markers.forEach(marker => map.removeLayer(marker));
      markers = [];
    }

    // 指定された階数でマーカーを表示
    function updateMarkers(floorFilter) {
      clearMarkers();

      const buildings = {};

      allData.forEach(row => {
        if (!row.building_name || !row.lat || !row.lon) return;

        // フィルター適用
        if (floorFilter !== 'all' && row.floor !== floorFilter) 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>')}
        `;

        const marker = L.marker([data.lat, data.lon])
          .addTo(map)
          .bindPopup(popupHtml);

        markers.push(marker);
      });
    }

    // CSV読み込み
    Papa.parse(csvUrl, {
      download: true,
      header: true,
      complete: function(results) {
        allData = results.data;
        updateMarkers('all'); // 初期表示:すべて
      }
    });

    // セレクトボックス変更時にマーカー更新
    document.getElementById('floorSelect').addEventListener('change', function() {
      updateMarkers(this.value);
    });
  </script>
</body>
</html>