2024年12月19日 03:26
<div id="map"></div>
<div id="panel">
<button id="toggle-panel">計測メニュー</button>
<div id="panel-content">
<div id="tabs">
<button id="tab-distance" class="active">距離計測</button>
<button id="tab-area">面積計測</button>
</div>
<div id="distance-content" class="content active">
<p>距離: <span id="distance">0 m</span></p>
<button id="clear-distance">クリア</button>
</div>
<div id="area-content" class="content">
<p>面積: <span id="area">0 m²</span></p>
<p>周長: <span id="perimeter">0 m</span></p>
<button id="clear-area">クリア</button>
</div>
</div>
</div>
const map = new maplibregl.Map({
container: 'map',
style: {
version: 8,
sources: {
"gsi-blank": {
type: "raster",
tiles: ["https://cyberjapandata.gsi.go.jp/xyz/pale/{z}/{x}/{y}.png"],
tileSize: 256,
attribution: "地図データ © 国土地理院"
}
},
layers: [{
id: "gsi-blank-layer",
type: "raster",
source: "gsi-blank"
}]
},
center: [139.6917, 35.6895],
zoom: 5
});
// 距離計測の更新関数
function updateLine() {
if (lineCoordinates.length > 1) {
const line = turf.lineString(lineCoordinates);
const distance = turf.length(line, { units: 'meters' });
distanceDisplay.innerText = `${distance.toFixed(2)} m`;
}
}
// 面積計測の更新関数
function updatePolygon() {
if (polygonCoordinates.length > 2) {
const polygon = turf.polygon([[...polygonCoordinates, polygonCoordinates[0]]]);
const area = turf.area(polygon);
const perimeter = turf.length(turf.lineString([...polygonCoordinates, polygonCoordinates[0]]), { units: 'meters' });
areaDisplay.innerText = `${area.toFixed(2)} m²`;
perimeterDisplay.innerText = `${perimeter.toFixed(2)} m`;
}
}
body {
margin: 0;
padding: 0;
}
#map {
position: absolute;
top: 0;
bottom: 0;
width: 100%;
}
#panel {
position: absolute;
top: 10px;
left: 10px;
z-index: 100;
}
#toggle-panel {
background: #0078d7;
color: white;
border: none;
padding: 10px;
cursor: pointer;
border-radius: 5px;
}