document.addEventListener('DOMContentLoaded', () => {
const map = L.map('map').setView([38.9175, 139.8353], 16);
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© OpenStreetMap contributors'
}).addTo(map);
// 現在地表示
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(position => {
const lat = position.coords.latitude;
const lng = position.coords.longitude;
L.marker([lat, lng], {
icon: L.icon({
iconUrl: 'images/favicon-32x32-now.png',
iconSize: [24, 24],
iconAnchor: [12, 12]
})
}).addTo(map).bindPopup('現在地');
});
}
// カスタムアイコンを定義
const customIcon = L.icon({
iconUrl: 'images/.png', // カスタムマーカー画像のパス
iconSize: [32, 32], // マーカーのサイズ
iconAnchor: [16, 32], // アイコンの「足」の位置
popupAnchor: [0, -32] // ポップアップの表示位置
});
fetch('fes.csv')
.then(response => response.text())
.then(text => {
const rows = text.split('\n').filter(row => row.trim());
const headers = rows[0].split(',').map(h => h.trim());
for (let i = 1; i < rows.length; i++) {
const values = rows[i].split(',').map(v => v.replace(/^"|"$/g, '').trim());
const data = {};
headers.forEach((key, index) => data[key] = values[index] || '');
const lat = parseFloat(data.latitude);
const lng = parseFloat(data.longitude);
if (isNaN(lat) || isNaN(lng)) continue;
const isOpen = !isClosedToday(data.description1) && isOpenNow(data.description2);
const iconPath = isOpen ? (data.icon || 'images/.png') : 'images/.png';
const customIcon = L.icon({
iconUrl: iconPath,
iconSize: [32, 32],
iconAnchor: [16, 32],
popupAnchor: [0, -32]
});
const description = [data.description1, data.description2, data.description3, data.mama]
.filter(Boolean)
.map(d => d.trim())
.join('<br>');
const image1 = data.img1 && data.img1.trim() !== '' ? data.img1 : 'images/.png';
const image2 = data.img2 && data.img2.trim() !== '' ? data.img2 : 'images/.png';
const popupContent = `
<div class="popup-content">
<h3>${data.name.replace(/"$/, '')}</h3>
<p>${description}</p>
<img src="${image1}" width="106" height="73" style="cursor: pointer;" onclick="openModal('${image1}')" />
<img src="${image2}" width="106" height="73" style="cursor: pointer;" onclick="openModal('${image2}')" />
<button onclick="addToFavorites('${data.name}')">行きたいお店リストに追加</button>
</div>`;
const marker = L.marker([lat, lng], { icon: customIcon }).addTo(map).bindPopup(popupContent);
marker.isOpen = isOpen;
markers.push(marker);
}
})
.catch(error => {
console.error('CSV読み込みエラー:', error);
});
let markers = [];
// マーカーを追加し、ポップアップを設定
snacks.forEach(snack => {
const markerIcon = L.icon({
iconUrl: snack.icon || 'images/.png', // 個別アイコンまたはデフォルトアイコン
iconSize: [32, 32],
iconAnchor: [16, 32],
popupAnchor: [0, -32]
});
const marker = L.marker([snack.lat, snack.lng], { icon: markerIcon }).addTo(map);
const popupContent = `
<div class="popup-content">
<h3>${snack.name}</h3>
<p>${snack.description1 || ''}</p>
<p>${snack.description2 || ''}</p>
<p>${snack.description3 || ''}</p>
<p>${snack.mama || ''}</p>
<img src="${snack.img1}" width="106" height="73" onclick="openModal('${snack.img1}')" style="cursor: pointer;" />
<img src="${snack.img2}" width="106" height="73" onclick="openModal('${snack.img2}')" style="cursor: pointer;" />
<button onclick="addToFavorites('${snack.name}')">行きたいお店リストに追加</button>
</div>
`;
marker.bindPopup(popupContent);
markers.push({ marker, name: snack.name });
});
// リスト追加機能
window.addToFavorites = function(name){
const favorites = JSON.parse(localStorage.getItem('favorites') || '[]');
favorites.push({ name, addedAt: new Date().toISOString() });
localStorage.setItem('favorites', JSON.stringify(favorites));
alert(`${name}を行きたいお店リストに追加しました!`);
};
// モーダルの開閉操作
window.openModal = function (imageSrc) {
const modal = document.getElementById('image-modal');
const modalImage = document.getElementById('modal-image');
modalImage.src = imageSrc; // クリックした画像のソースを設定
modal.style.display = 'block'; // モーダルを表示
};
window.closeModal = function () {
const modal = document.getElementById('image-modal');
modal.style.display = 'none'; // モーダルを非表示
};
// モーダル外をクリックして閉じる
window.onclick = function (event) {
const modal = document.getElementById('image-modal');
if (event.target === modal) {
modal.style.display = 'none';
}
};
});