JavaScript | 月別アルバムページ × タグフィルタ × 地図表示

JavaScript JavaScript
スポンサーリンク

ここまでの要素を全部組み合わせて、「月別アルバムページ」+「タグフィルタ」+「地図表示」 を統合したギャラリーの仕組みを整理してみましょう。


1. 処理の流れ

  1. 画像を読み込み
    • Pillowでサムネイル生成
    • EXIFから撮影日とGPS座標を取得
    • ファイル名やルールからタグを付与
  2. 分類
    • 撮影日から YYYY-MM をキーにして月別にまとめる
    • 各月ごとにHTMLアルバムページを生成
  3. HTML生成
    • サムネイルグリッド
    • 上部にタグフィルタボタン
    • Leaflet.jsで地図を表示し、位置情報付き画像をマーカー表示

2. HTMLの構造イメージ

<header>2025-01 アルバム</header>

<!-- タグフィルタ -->
<div id="filters">
  <button data-filter="all">すべて</button>
  <button data-filter="旅行">旅行</button>
  <button data-filter="家族">家族</button>
  <button data-filter="食べ物">食べ物</button>
</div>

<!-- 地図 -->
<div id="map" style="height:400px;"></div>

<!-- サムネイルグリッド -->
<main class="grid">
  <div class="card" data-tags="旅行 家族" data-lat="35.68" data-lon="139.76">
    <a href="images/2025-01/photo1.jpg" target="_blank">
      <img class="thumb" src="thumbs/photo1_thumb.jpg" alt="旅行1">
      <div class="meta">旅行1<br>2025-01-03<br>タグ: 旅行, 家族</div>
    </a>
  </div>
  <div class="card" data-tags="食べ物" data-lat="34.70" data-lon="135.50">
    <a href="images/2025-01/photo2.jpg" target="_blank">
      <img class="thumb" src="thumbs/photo2_thumb.jpg" alt="食べ物1">
      <div class="meta">食べ物1<br>2025-01-05<br>タグ: 食べ物</div>
    </a>
  </div>
</main>
HTML

3. JavaScriptでタグフィルタ+地図マーカー

<script src="https://unpkg.com/leaflet/dist/leaflet.js"></script>
<link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css"/>

<script>
// Leaflet地図初期化
var map = L.map('map').setView([35.0, 135.0], 5);
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
  attribution: '© OpenStreetMap contributors'
}).addTo(map);

// 画像カードからマーカーを生成
function updateMarkers(filter) {
  // 既存マーカーをクリア
  if (window.markers) {
    window.markers.forEach(m => map.removeLayer(m));
  }
  window.markers = [];

  document.querySelectorAll('.card').forEach(card => {
    const tags = card.getAttribute('data-tags').split(" ");
    const lat = card.getAttribute('data-lat');
    const lon = card.getAttribute('data-lon');
    const show = (filter === "all" || tags.includes(filter));

    card.style.display = show ? "" : "none";

    if (show && lat && lon) {
      const title = card.querySelector('.meta').innerText;
      const thumb = card.querySelector('img').src;
      const marker = L.marker([parseFloat(lat), parseFloat(lon)])
        .addTo(map)
        .bindPopup(`<b>${title}</b><br><img src="${thumb}" width="120">`);
      window.markers.push(marker);
    }
  });
}

// フィルタボタン
document.querySelectorAll('#filters button').forEach(btn => {
  btn.addEventListener('click', () => {
    const filter = btn.getAttribute('data-filter');
    updateMarkers(filter);
  });
});

// 初期表示
updateMarkers("all");
</script>
JavaScript

4. ポイント

  • タグフィルタ地図マーカーを同じ関数で制御 → ボタンを押すとサムネイルと地図が連動
  • 月別ページYYYY-MM.html として生成し、トップページからリンク
  • Leaflet.js を使うので無料で軽量、オフラインでも利用可能

5. 発展アイデア

  • 複数タグ選択(チェックボックス式で「旅行+家族」など)
  • 月別+タグ+地図を組み合わせた高度な検索UI
  • EXIFのカメラ機種やレンズ名をタグに追加してフィルタ

✅ これで「月別アルバムページ」に タグフィルタ地図表示を両方組み合わせたギャラリーが完成します。

タイトルとURLをコピーしました