Translate

quinta-feira, 9 de outubro de 2025

Mapa interativo para anotações

<!DOCTYPE html> <html lang="pt-BR"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Mapa de Maringá - PR</title> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/leaflet.css" /> <script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/leaflet.js"></script> <style> * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); min-height: 100vh; padding: 20px; } .container { max-width: 1200px; margin: 0 auto; background: white; border-radius: 15px; box-shadow: 0 20px 60px rgba(0,0,0,0.3); overflow: hidden; } .header { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 25px; text-align: center; } .header h1 { font-size: 2em; margin-bottom: 5px; } .header p { opacity: 0.9; } #map { width: 100%; height: 500px; } .controls { padding: 25px; background: #f8f9fa; } .input-group { display: grid; grid-template-columns: 1fr 1fr 1fr auto; gap: 10px; margin-bottom: 15px; } input { padding: 12px; border: 2px solid #e0e0e0; border-radius: 8px; font-size: 14px; transition: all 0.3s; } input:focus { outline: none; border-color: #667eea; box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1); } button { padding: 12px 25px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border: none; border-radius: 8px; cursor: pointer; font-size: 14px; font-weight: 600; transition: transform 0.2s, box-shadow 0.2s; } button:hover { transform: translateY(-2px); box-shadow: 0 5px 15px rgba(102, 126, 234, 0.4); } button:active { transform: translateY(0); } .markers-list { margin-top: 20px; max-height: 200px; overflow-y: auto; } .marker-item { background: white; padding: 12px; margin-bottom: 8px; border-radius: 8px; display: flex; justify-content: space-between; align-items: center; box-shadow: 0 2px 5px rgba(0,0,0,0.1); } .marker-info { flex: 1; } .marker-name { font-weight: 600; color: #333; } .marker-coords { font-size: 12px; color: #666; margin-top: 3px; } .delete-btn { padding: 8px 15px; background: #dc3545; font-size: 12px; } .delete-btn:hover { background: #c82333; } .info-box { background: #e3f2fd; padding: 15px; border-radius: 8px; margin-bottom: 15px; border-left: 4px solid #2196f3; } .info-box p { color: #1976d2; font-size: 14px; } </style> </head> <body> <div class="container"> <div class="header"> <h1>📍 Mapa de Maringá - PR</h1> <p>Adicione seus locais favoritos no mapa</p> </div> <div id="map"></div> <div class="controls"> <div class="info-box"> <p><strong>Como usar:</strong> Clique no mapa para selecionar um local ou digite as coordenadas manualmente, depois adicione um nome e descrição.</p> </div> <div class="input-group"> <input type="text" id="markerName" placeholder="Nome do local"> <input type="text" id="markerLat" placeholder="Latitude" readonly> <input type="text" id="markerLng" placeholder="Longitude" readonly> <button onclick="addMarker()">➕ Adicionar Marcador</button> </div> <div class="markers-list" id="markersList"></div> </div> </div> <script> // Coordenadas centrais de Maringá const maringaCenter = [-23.4205, -51.9333]; // Inicializar o mapa const map = L.map('map').setView(maringaCenter, 13); // Adicionar camada de tiles do OpenStreetMap L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: '© OpenStreetMap contributors', maxZoom: 19 }).addTo(map); // Array para armazenar marcadores let markers = []; // Variável para coordenadas selecionadas let selectedLat = null; let selectedLng = null; // Evento de clique no mapa map.on('click', function(e) { selectedLat = e.latlng.lat.toFixed(6); selectedLng = e.latlng.lng.toFixed(6); document.getElementById('markerLat').value = selectedLat; document.getElementById('markerLng').value = selectedLng; }); // Função para adicionar marcador function addMarker() { const name = document.getElementById('markerName').value.trim(); const lat = document.getElementById('markerLat').value; const lng = document.getElementById('markerLng').value; if (!name) { alert('Por favor, insira um nome para o local'); return; } if (!lat || !lng) { alert('Por favor, clique no mapa para selecionar uma localização'); return; } // Criar marcador no mapa const marker = L.marker([parseFloat(lat), parseFloat(lng)]).addTo(map); marker.bindPopup(`<b>${name}</b><br>Lat: ${lat}<br>Lng: ${lng}`); // Adicionar à lista const markerData = { id: Date.now(), name: name, lat: lat, lng: lng, marker: marker }; markers.push(markerData); updateMarkersList(); // Limpar campos document.getElementById('markerName').value = ''; document.getElementById('markerLat').value = ''; document.getElementById('markerLng').value = ''; selectedLat = null; selectedLng = null; } // Função para atualizar lista de marcadores function updateMarkersList() { const list = document.getElementById('markersList'); list.innerHTML = ''; markers.forEach((m) => { const item = document.createElement('div'); item.className = 'marker-item'; item.innerHTML = ` <div class="marker-info"> <div class="marker-name">${m.name}</div> <div class="marker-coords">Lat: ${m.lat}, Lng: ${m.lng}</div> </div> <button class="delete-btn" onclick="removeMarker(${m.id})">🗑️ Remover</button> `; list.appendChild(item); }); } // Função para remover marcador function removeMarker(id) { const index = markers.findIndex(m => m.id === id); if (index !== -1) { map.removeLayer(markers[index].marker); markers.splice(index, 1); updateMarkersList(); } } // Adicionar alguns locais populares de Maringá como exemplo const popularPlaces = [ { name: 'Catedral Basílica Menor', lat: -23.4252, lng: -51.9373 }, { name: 'Parque do Ingá', lat: -23.4167, lng: -51.9167 }, { name: 'Novo Centro', lat: -23.4205, lng: -51.9333 } ]; popularPlaces.forEach(place => { const marker = L.marker([place.lat, place.lng]).addTo(map); marker.bindPopup(`<b>${place.name}</b><br><i>Local popular de Maringá</i>`); }); </script> </body> </html>

Nenhum comentário:

Postar um comentário