PetMap: разные иконки для типов маркеров (потерян, найден, помощь, дом, клиники)
This commit is contained in:
parent
1bc1041267
commit
be8ca53b7b
63
petmap.html
63
petmap.html
@ -18,6 +18,23 @@
|
|||||||
|
|
||||||
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css">
|
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css">
|
||||||
<style>
|
<style>
|
||||||
|
/* Кастомные иконки для маркеров */
|
||||||
|
.custom-marker {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-size: 28px;
|
||||||
|
text-shadow: 0 2px 4px rgba(0,0,0,0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.marker-lost { filter: drop-shadow(0 2px 4px rgba(230,57,70,0.4)); }
|
||||||
|
.marker-found { filter: drop-shadow(0 2px 4px rgba(42,157,143,0.4)); }
|
||||||
|
.marker-help { filter: drop-shadow(0 2px 4px rgba(244,162,97,0.4)); }
|
||||||
|
.marker-home { filter: drop-shadow(0 2px 4px rgba(78,205,196,0.4)); }
|
||||||
|
.marker-vet { filter: drop-shadow(0 2px 4px rgba(42,157,143,0.4)); }
|
||||||
|
.marker-shelter { filter: drop-shadow(0 2px 4px rgba(244,162,97,0.4)); }
|
||||||
|
.marker-petshop { filter: drop-shadow(0 2px 4px rgba(255,107,107,0.4)); }
|
||||||
|
</style>
|
||||||
:root {
|
:root {
|
||||||
--primary: #ff6b6b;
|
--primary: #ff6b6b;
|
||||||
--primary-dark: #ee5a5a;
|
--primary-dark: #ee5a5a;
|
||||||
@ -908,6 +925,45 @@
|
|||||||
attribution: '© OpenStreetMap contributors'
|
attribution: '© OpenStreetMap contributors'
|
||||||
}).addTo(map);
|
}).addTo(map);
|
||||||
|
|
||||||
|
// Иконки для разных типов маркеров
|
||||||
|
function getMarkerIcon(item) {
|
||||||
|
const itemType = item.type || item.cat;
|
||||||
|
let emoji = item.emoji || '📍';
|
||||||
|
let className = 'custom-marker';
|
||||||
|
|
||||||
|
// Разные смайлики для разных типов
|
||||||
|
if (itemType === 'lost') {
|
||||||
|
emoji = '👀'; // Глаза — ищут, потерян
|
||||||
|
className += ' marker-lost';
|
||||||
|
} else if (itemType === 'found' || itemType === 'sighting') {
|
||||||
|
emoji = '👁️'; // Глаз — видел на улице
|
||||||
|
className += ' marker-found';
|
||||||
|
} else if (itemType === 'needs_help' || itemType === 'help') {
|
||||||
|
emoji = '🆘'; // SOS — нужна помощь
|
||||||
|
className += ' marker-help';
|
||||||
|
} else if (itemType === 'seeking_home' || itemType === 'home') {
|
||||||
|
emoji = '🏠'; // Дом — ищет дом
|
||||||
|
className += ' marker-home';
|
||||||
|
} else if (itemType === 'vet') {
|
||||||
|
emoji = '🏥'; // Больница — ветклиника
|
||||||
|
className += ' marker-vet';
|
||||||
|
} else if (itemType === 'shelter') {
|
||||||
|
emoji = '🏡'; // Приют
|
||||||
|
className += ' marker-shelter';
|
||||||
|
} else if (itemType === 'petshop') {
|
||||||
|
emoji = '🛒'; // Магазин
|
||||||
|
className += ' marker-petshop';
|
||||||
|
}
|
||||||
|
|
||||||
|
return L.divIcon({
|
||||||
|
className: className,
|
||||||
|
html: `<div style="font-size:32px;background:white;border-radius:50%;width:44px;height:44px;display:flex;align-items:center;justify-content:center;box-shadow:0 2px 8px rgba(0,0,0,0.2);">${emoji}</div>`,
|
||||||
|
iconSize: [44, 44],
|
||||||
|
iconAnchor: [22, 22],
|
||||||
|
popupAnchor: [0, -22]
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
const markers = [];
|
const markers = [];
|
||||||
function addMarkers(filter = 'all') {
|
function addMarkers(filter = 'all') {
|
||||||
markers.forEach(m => map.removeLayer(m));
|
markers.forEach(m => map.removeLayer(m));
|
||||||
@ -925,10 +981,11 @@
|
|||||||
const lng = item.lng || CITIES[item.city]?.lng;
|
const lng = item.lng || CITIES[item.city]?.lng;
|
||||||
if (!lat || !lng) return;
|
if (!lat || !lng) return;
|
||||||
|
|
||||||
const marker = L.marker([lat, lng]).addTo(map);
|
const icon = getMarkerIcon(item);
|
||||||
|
const marker = L.marker([lat, lng], { icon: icon }).addTo(map);
|
||||||
const popupContent = item.workHours
|
const popupContent = item.workHours
|
||||||
? `<b>${item.emoji} ${item.title}</b><br>${item.location}<br>🕒 ${item.workHours}<br>📞 ${item.contact}`
|
? `<b>${item.emoji || '📍'} ${item.title}</b><br>${item.location}<br>🕒 ${item.workHours}<br>📞 ${item.contact}`
|
||||||
: `<b>${item.emoji} ${item.title}</b><br>${item.location}<br>📞 ${item.contact}`;
|
: `<b>${item.emoji || '📍'} ${item.title}</b><br>${item.location}<br>📞 ${item.contact}`;
|
||||||
marker.bindPopup(popupContent);
|
marker.bindPopup(popupContent);
|
||||||
marker.on('click', () => showPreview(item));
|
marker.on('click', () => showPreview(item));
|
||||||
markers.push(marker);
|
markers.push(marker);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user