<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css" />
<script src="https://unpkg.com/leaflet/dist/leaflet.js"></script>
<title>Leaflet Map with Area Calculation</title>
<style>
body {
margin: 0;
font-family: Arial, sans-serif;
}
#map {
height: 100vh; /* マップの高さを画面全体に設定 */
}
#info {
position: absolute;
top: 10px;
left: 10px;
background: rgba(255, 255, 255, 0.8); /* 半透明の背景 */
border: 1px solid #ccc; /* 薄い灰色のボーダー */
border-radius: 5px; /* 角を丸くする */
padding: 10px;
z-index: 1000;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2); /* 軽い影を付ける */
}
#info h2 {
margin: 0; /* ヘッダーのマージンをリセット */
font-size: 16px; /* フォントサイズ */
}
</style>
</head>
<body>
<div id="info"><h2>今〇〇平方メートルです</h2></div>
<div id="map"></div>
<script>
const map = L.map('map').setView([38.25, 139.83], 8); // 酒田の中心座標
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
maxZoom: 19,
attribution: '© OpenStreetMap'
}).addTo(map);
const markers = [];
map.on('click', function(e) {
const marker = L.marker(e.latlng).addTo(map);
markers.push(e.latlng);
marker.on('click', function() {
map.removeLayer(marker);
markers.splice(markers.indexOf(e.latlng), 1);
calculateArea();
});
calculateArea();
});
function calculateArea() {
if (markers.length < 3) {
document.getElementById('info').innerText = `今${0}平方メートルです`;
return;
}
const latlngs = markers.map(latlng => [latlng.lat, latlng.lng]);
const area = L.GeometryUtil.geodesicArea(latlngs); // 面積計算
const areaInSquareMeters = Math.round(area);
document.getElementById('info').innerText = `今${areaInSquareMeters}平方メートルです`;
if (areaInSquareMeters >= 602980000) { // 酒田の面積602.98平方キロメートル
alert("クリア!");
// リセットする場合は以下を追加
markers.length = 0; // マーカーリストをクリア
map.eachLayer(function(layer) {
if (layer instanceof L.Marker) {
map.removeLayer(layer);
}
});
document.getElementById('info').innerText = `今${0}平方メートルです`;
}
}
</script>
</body>
</html>